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 28 enum 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 40 enum 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 47 struct 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 86 LE16_BITMASK(BCH_MEMBER_BUCKET_SIZE, struct bch_member, bucket_size, 0, 16) 87 LE64_BITMASK(BCH_MEMBER_STATE, struct bch_member, flags, 0, 4) 88 /* 4-14 unused, was TIER, HAS_(META)DATA, REPLACEMENT */ 89 LE64_BITMASK(BCH_MEMBER_DISCARD, struct bch_member, flags, 14, 15) 90 LE64_BITMASK(BCH_MEMBER_DATA_ALLOWED, struct bch_member, flags, 15, 20) 91 LE64_BITMASK(BCH_MEMBER_GROUP, struct bch_member, flags, 20, 28) 92 LE64_BITMASK(BCH_MEMBER_DURABILITY, struct bch_member, flags, 28, 30) 93 LE64_BITMASK(BCH_MEMBER_FREESPACE_INITIALIZED, 94 struct bch_member, flags, 30, 31) 95 LE64_BITMASK(BCH_MEMBER_RESIZE_ON_MOUNT, 96 struct bch_member, flags, 31, 32) 97 98 #if 0 99 LE64_BITMASK(BCH_MEMBER_NR_READ_ERRORS, struct bch_member, flags[1], 0, 20); 100 LE64_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 109 enum 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 116 struct bch_sb_field_members_v1 { 117 struct bch_sb_field field; 118 struct bch_member _members[]; //Members are now variable size 119 }; 120 121 struct 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