1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _BCACHEFS_SB_MEMBERS_FORMAT_H
3#define _BCACHEFS_SB_MEMBERS_FORMAT_H
4
5/*
6 * We refer to members with bitmasks in various places - but we need to get rid
7 * of this limit:
8 */
9#define BCH_SB_MEMBERS_MAX 64
10
11/*
12 * Sentinal value - indicates a device that does not exist
13 */
14#define BCH_SB_MEMBER_INVALID 255
15
16#define BCH_SB_MEMBER_DELETED_UUID \
17 UUID_INIT(0xffffffff, 0xffff, 0xffff, \
18 0xd9, 0x6a, 0x60, 0xcf, 0x80, 0x3d, 0xf7, 0xef)
19
20#define BCH_MIN_NR_NBUCKETS (1 << 6)
21
22#define BCH_IOPS_MEASUREMENTS() \
23 x(seqread, 0) \
24 x(seqwrite, 1) \
25 x(randread, 2) \
26 x(randwrite, 3)
27
28enum bch_iops_measurement {
29#define x(t, n) BCH_IOPS_##t = n,
30 BCH_IOPS_MEASUREMENTS()
31#undef x
32 BCH_IOPS_NR
33};
34
35#define BCH_MEMBER_ERROR_TYPES() \
36 x(read, 0) \
37 x(write, 1) \
38 x(checksum, 2)
39
40enum bch_member_error_type {
41#define x(t, n) BCH_MEMBER_ERROR_##t = n,
42 BCH_MEMBER_ERROR_TYPES()
43#undef x
44 BCH_MEMBER_ERROR_NR
45};
46
47struct bch_member {
48 __uuid_t uuid;
49 __le64 nbuckets; /* device size */
50 __le16 first_bucket; /* index of first bucket used */
51 __le16 bucket_size; /* sectors */
52 __u8 btree_bitmap_shift;
53 __u8 pad[3];
54 __le64 last_mount; /* time_t */
55
56 __le64 flags;
57 __le32 iops[4];
58 __le64 errors[BCH_MEMBER_ERROR_NR];
59 __le64 errors_at_reset[BCH_MEMBER_ERROR_NR];
60 __le64 errors_reset_time;
61 __le64 seq;
62 __le64 btree_allocated_bitmap;
63 /*
64 * On recovery from a clean shutdown we don't normally read the journal,
65 * but we still want to resume writing from where we left off so we
66 * don't overwrite more than is necessary, for list journal debugging:
67 */
68 __le32 last_journal_bucket;
69 __le32 last_journal_bucket_offset;
70};
71
72/*
73 * btree_allocated_bitmap can represent sector addresses of a u64: it itself has
74 * 64 elements, so 64 - ilog2(64)
75 */
76#define BCH_MI_BTREE_BITMAP_SHIFT_MAX 58
77
78/*
79 * This limit comes from the bucket_gens array - it's a single allocation, and
80 * kernel allocation are limited to INT_MAX
81 */
82#define BCH_MEMBER_NBUCKETS_MAX (INT_MAX - 64)
83
84#define BCH_MEMBER_V1_BYTES 56
85
86LE16_BITMASK(BCH_MEMBER_BUCKET_SIZE, struct bch_member, bucket_size, 0, 16)
87LE64_BITMASK(BCH_MEMBER_STATE, struct bch_member, flags, 0, 4)
88/* 4-14 unused, was TIER, HAS_(META)DATA, REPLACEMENT */
89LE64_BITMASK(BCH_MEMBER_DISCARD, struct bch_member, flags, 14, 15)
90LE64_BITMASK(BCH_MEMBER_DATA_ALLOWED, struct bch_member, flags, 15, 20)
91LE64_BITMASK(BCH_MEMBER_GROUP, struct bch_member, flags, 20, 28)
92LE64_BITMASK(BCH_MEMBER_DURABILITY, struct bch_member, flags, 28, 30)
93LE64_BITMASK(BCH_MEMBER_FREESPACE_INITIALIZED,
94 struct bch_member, flags, 30, 31)
95LE64_BITMASK(BCH_MEMBER_RESIZE_ON_MOUNT,
96 struct bch_member, flags, 31, 32)
97
98#if 0
99LE64_BITMASK(BCH_MEMBER_NR_READ_ERRORS, struct bch_member, flags[1], 0, 20);
100LE64_BITMASK(BCH_MEMBER_NR_WRITE_ERRORS,struct bch_member, flags[1], 20, 40);
101#endif
102
103#define BCH_MEMBER_STATES() \
104 x(rw, 0) \
105 x(ro, 1) \
106 x(failed, 2) \
107 x(spare, 3)
108
109enum bch_member_state {
110#define x(t, n) BCH_MEMBER_STATE_##t = n,
111 BCH_MEMBER_STATES()
112#undef x
113 BCH_MEMBER_STATE_NR
114};
115
116struct bch_sb_field_members_v1 {
117 struct bch_sb_field field;
118 struct bch_member _members[]; //Members are now variable size
119};
120
121struct bch_sb_field_members_v2 {
122 struct bch_sb_field field;
123 __le16 member_bytes; //size of single member entry
124 u8 pad[6];
125 struct bch_member _members[];
126};
127
128#endif /* _BCACHEFS_SB_MEMBERS_FORMAT_H */
129

source code of linux/fs/bcachefs/sb-members_format.h