Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0-or-later */
2 : #ifndef _PCACHE_SEGMENT_H
3 : #define _PCACHE_SEGMENT_H
4 :
5 : #include <linux/bio.h>
6 : #include <linux/bitfield.h>
7 :
8 : #include "pcache_internal.h"
9 :
10 : struct pcache_segment_info {
11 : struct pcache_meta_header header;
12 : __u32 flags;
13 : __u32 next_seg;
14 : };
15 :
16 : #define PCACHE_SEG_INFO_FLAGS_HAS_NEXT BIT(0)
17 :
18 : #define PCACHE_SEG_INFO_FLAGS_TYPE_MASK GENMASK(4, 1)
19 : #define PCACHE_SEGMENT_TYPE_CACHE_DATA 1
20 :
21 31870 : static inline bool segment_info_has_next(struct pcache_segment_info *seg_info)
22 : {
23 31870 : return (seg_info->flags & PCACHE_SEG_INFO_FLAGS_HAS_NEXT);
24 : }
25 :
26 106547 : static inline void segment_info_set_type(struct pcache_segment_info *seg_info, u8 type)
27 : {
28 106547 : seg_info->flags &= ~PCACHE_SEG_INFO_FLAGS_TYPE_MASK;
29 106547 : seg_info->flags |= FIELD_PREP(PCACHE_SEG_INFO_FLAGS_TYPE_MASK, type);
30 106547 : }
31 :
32 : static inline u8 segment_info_get_type(struct pcache_segment_info *seg_info)
33 : {
34 : return FIELD_GET(PCACHE_SEG_INFO_FLAGS_TYPE_MASK, seg_info->flags);
35 : }
36 :
37 : struct pcache_segment_pos {
38 : struct pcache_segment *segment; /* Segment associated with the position */
39 : u32 off; /* Offset within the segment */
40 : };
41 :
42 : struct pcache_segment_init_options {
43 : u8 type;
44 : u32 seg_id;
45 : u32 data_off;
46 :
47 : struct pcache_segment_info *seg_info;
48 : };
49 :
50 : struct pcache_segment {
51 : struct pcache_cache_dev *cache_dev;
52 :
53 : void *data;
54 : u32 data_size;
55 : u32 seg_id;
56 :
57 : struct pcache_segment_info *seg_info;
58 : };
59 :
60 : int segment_copy_to_bio(struct pcache_segment *segment,
61 : u32 data_off, u32 data_len, struct bio *bio, u32 bio_off);
62 : int segment_copy_from_bio(struct pcache_segment *segment,
63 : u32 data_off, u32 data_len, struct bio *bio, u32 bio_off);
64 :
65 : static inline void segment_pos_advance(struct pcache_segment_pos *seg_pos, u32 len)
66 : {
67 : BUG_ON(seg_pos->off + len > seg_pos->segment->data_size);
68 :
69 : seg_pos->off += len;
70 : }
71 :
72 : void pcache_segment_init(struct pcache_cache_dev *cache_dev, struct pcache_segment *segment,
73 : struct pcache_segment_init_options *options);
74 : #endif /* _PCACHE_SEGMENT_H */
|