xref: /linux/fs/bcachefs/alloc_background_format.h (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _BCACHEFS_ALLOC_BACKGROUND_FORMAT_H
3 #define _BCACHEFS_ALLOC_BACKGROUND_FORMAT_H
4 
5 struct bch_alloc {
6 	struct bch_val		v;
7 	__u8			fields;
8 	__u8			gen;
9 	__u8			data[];
10 } __packed __aligned(8);
11 
12 #define BCH_ALLOC_FIELDS_V1()			\
13 	x(read_time,		16)		\
14 	x(write_time,		16)		\
15 	x(data_type,		8)		\
16 	x(dirty_sectors,	16)		\
17 	x(cached_sectors,	16)		\
18 	x(oldest_gen,		8)		\
19 	x(stripe,		32)		\
20 	x(stripe_redundancy,	8)
21 
22 enum {
23 #define x(name, _bits) BCH_ALLOC_FIELD_V1_##name,
24 	BCH_ALLOC_FIELDS_V1()
25 #undef x
26 };
27 
28 struct bch_alloc_v2 {
29 	struct bch_val		v;
30 	__u8			nr_fields;
31 	__u8			gen;
32 	__u8			oldest_gen;
33 	__u8			data_type;
34 	__u8			data[];
35 } __packed __aligned(8);
36 
37 #define BCH_ALLOC_FIELDS_V2()			\
38 	x(read_time,		64)		\
39 	x(write_time,		64)		\
40 	x(dirty_sectors,	32)		\
41 	x(cached_sectors,	32)		\
42 	x(stripe,		32)		\
43 	x(stripe_redundancy,	8)
44 
45 struct bch_alloc_v3 {
46 	struct bch_val		v;
47 	__le64			journal_seq;
48 	__le32			flags;
49 	__u8			nr_fields;
50 	__u8			gen;
51 	__u8			oldest_gen;
52 	__u8			data_type;
53 	__u8			data[];
54 } __packed __aligned(8);
55 
56 LE32_BITMASK(BCH_ALLOC_V3_NEED_DISCARD,struct bch_alloc_v3, flags,  0,  1)
57 LE32_BITMASK(BCH_ALLOC_V3_NEED_INC_GEN,struct bch_alloc_v3, flags,  1,  2)
58 
59 struct bch_alloc_v4 {
60 	struct bch_val		v;
61 	__u64			journal_seq;
62 	__u32			flags;
63 	__u8			gen;
64 	__u8			oldest_gen;
65 	__u8			data_type;
66 	__u8			stripe_redundancy;
67 	__u32			dirty_sectors;
68 	__u32			cached_sectors;
69 	__u64			io_time[2];
70 	__u32			stripe;
71 	__u32			nr_external_backpointers;
72 	/* end of fields in original version of alloc_v4 */
73 	__u64			_fragmentation_lru; /* obsolete */
74 	__u32			stripe_sectors;
75 	__u32			pad;
76 } __packed __aligned(8);
77 
78 #define BCH_ALLOC_V4_U64s_V0	6
79 #define BCH_ALLOC_V4_U64s	(sizeof(struct bch_alloc_v4) / sizeof(__u64))
80 
81 BITMASK(BCH_ALLOC_V4_NEED_DISCARD,	struct bch_alloc_v4, flags,  0,  1)
82 BITMASK(BCH_ALLOC_V4_NEED_INC_GEN,	struct bch_alloc_v4, flags,  1,  2)
83 BITMASK(BCH_ALLOC_V4_BACKPOINTERS_START,struct bch_alloc_v4, flags,  2,  8)
84 BITMASK(BCH_ALLOC_V4_NR_BACKPOINTERS,	struct bch_alloc_v4, flags,  8,  14)
85 
86 #define KEY_TYPE_BUCKET_GENS_BITS	8
87 #define KEY_TYPE_BUCKET_GENS_NR		(1U << KEY_TYPE_BUCKET_GENS_BITS)
88 #define KEY_TYPE_BUCKET_GENS_MASK	(KEY_TYPE_BUCKET_GENS_NR - 1)
89 
90 struct bch_bucket_gens {
91 	struct bch_val		v;
92 	u8			gens[KEY_TYPE_BUCKET_GENS_NR];
93 } __packed __aligned(8);
94 
95 #endif /* _BCACHEFS_ALLOC_BACKGROUND_FORMAT_H */
96