1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _BCACHEFS_ALLOC_BACKGROUND_FORMAT_H
3#define _BCACHEFS_ALLOC_BACKGROUND_FORMAT_H
4
5struct 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
22enum {
23#define x(name, _bits) BCH_ALLOC_FIELD_V1_##name,
24	BCH_ALLOC_FIELDS_V1()
25#undef x
26};
27
28struct 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
45struct 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
56LE32_BITMASK(BCH_ALLOC_V3_NEED_DISCARD,struct bch_alloc_v3, flags,  0,  1)
57LE32_BITMASK(BCH_ALLOC_V3_NEED_INC_GEN,struct bch_alloc_v3, flags,  1,  2)
58
59struct 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	__u64			fragmentation_lru;
73} __packed __aligned(8);
74
75#define BCH_ALLOC_V4_U64s_V0	6
76#define BCH_ALLOC_V4_U64s	(sizeof(struct bch_alloc_v4) / sizeof(__u64))
77
78BITMASK(BCH_ALLOC_V4_NEED_DISCARD,	struct bch_alloc_v4, flags,  0,  1)
79BITMASK(BCH_ALLOC_V4_NEED_INC_GEN,	struct bch_alloc_v4, flags,  1,  2)
80BITMASK(BCH_ALLOC_V4_BACKPOINTERS_START,struct bch_alloc_v4, flags,  2,  8)
81BITMASK(BCH_ALLOC_V4_NR_BACKPOINTERS,	struct bch_alloc_v4, flags,  8,  14)
82
83#define KEY_TYPE_BUCKET_GENS_BITS	8
84#define KEY_TYPE_BUCKET_GENS_NR		(1U << KEY_TYPE_BUCKET_GENS_BITS)
85#define KEY_TYPE_BUCKET_GENS_MASK	(KEY_TYPE_BUCKET_GENS_NR - 1)
86
87struct bch_bucket_gens {
88	struct bch_val		v;
89	u8			gens[KEY_TYPE_BUCKET_GENS_NR];
90} __packed __aligned(8);
91
92#endif /* _BCACHEFS_ALLOC_BACKGROUND_FORMAT_H */
93