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