/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _BCACHEFS_SB_MEMBERS_FORMAT_H #define _BCACHEFS_SB_MEMBERS_FORMAT_H /* * We refer to members with bitmasks in various places - but we need to get rid * of this limit: */ #define BCH_SB_MEMBERS_MAX 64 /* * Sentinal value - indicates a device that does not exist */ #define BCH_SB_MEMBER_INVALID 255 #define BCH_MIN_NR_NBUCKETS (1 << 6) #define BCH_IOPS_MEASUREMENTS() \ x(seqread, 0) \ x(seqwrite, 1) \ x(randread, 2) \ x(randwrite, 3) enum bch_iops_measurement { #define x(t, n) BCH_IOPS_##t = n, BCH_IOPS_MEASUREMENTS() #undef x BCH_IOPS_NR }; #define BCH_MEMBER_ERROR_TYPES() \ x(read, 0) \ x(write, 1) \ x(checksum, 2) enum bch_member_error_type { #define x(t, n) BCH_MEMBER_ERROR_##t = n, BCH_MEMBER_ERROR_TYPES() #undef x BCH_MEMBER_ERROR_NR }; struct bch_member { __uuid_t uuid; __le64 nbuckets; /* device size */ __le16 first_bucket; /* index of first bucket used */ __le16 bucket_size; /* sectors */ __u8 btree_bitmap_shift; __u8 pad[3]; __le64 last_mount; /* time_t */ __le64 flags; __le32 iops[4]; __le64 errors[BCH_MEMBER_ERROR_NR]; __le64 errors_at_reset[BCH_MEMBER_ERROR_NR]; __le64 errors_reset_time; __le64 seq; __le64 btree_allocated_bitmap; /* * On recovery from a clean shutdown we don't normally read the journal, * but we still want to resume writing from where we left off so we * don't overwrite more than is necessary, for list journal debugging: */ __le32 last_journal_bucket; __le32 last_journal_bucket_offset; }; /* * btree_allocated_bitmap can represent sector addresses of a u64: it itself has * 64 elements, so 64 - ilog2(64) */ #define BCH_MI_BTREE_BITMAP_SHIFT_MAX 58 /* * This limit comes from the bucket_gens array - it's a single allocation, and * kernel allocation are limited to INT_MAX */ #define BCH_MEMBER_NBUCKETS_MAX (INT_MAX - 64) #define BCH_MEMBER_V1_BYTES 56 LE64_BITMASK(BCH_MEMBER_STATE, struct bch_member, flags, 0, 4) /* 4-14 unused, was TIER, HAS_(META)DATA, REPLACEMENT */ LE64_BITMASK(BCH_MEMBER_DISCARD, struct bch_member, flags, 14, 15) LE64_BITMASK(BCH_MEMBER_DATA_ALLOWED, struct bch_member, flags, 15, 20) LE64_BITMASK(BCH_MEMBER_GROUP, struct bch_member, flags, 20, 28) LE64_BITMASK(BCH_MEMBER_DURABILITY, struct bch_member, flags, 28, 30) LE64_BITMASK(BCH_MEMBER_FREESPACE_INITIALIZED, struct bch_member, flags, 30, 31) #if 0 LE64_BITMASK(BCH_MEMBER_NR_READ_ERRORS, struct bch_member, flags[1], 0, 20); LE64_BITMASK(BCH_MEMBER_NR_WRITE_ERRORS,struct bch_member, flags[1], 20, 40); #endif #define BCH_MEMBER_STATES() \ x(rw, 0) \ x(ro, 1) \ x(failed, 2) \ x(spare, 3) enum bch_member_state { #define x(t, n) BCH_MEMBER_STATE_##t = n, BCH_MEMBER_STATES() #undef x BCH_MEMBER_STATE_NR }; struct bch_sb_field_members_v1 { struct bch_sb_field field; struct bch_member _members[]; //Members are now variable size }; struct bch_sb_field_members_v2 { struct bch_sb_field field; __le16 member_bytes; //size of single member entry u8 pad[6]; struct bch_member _members[]; }; #endif /* _BCACHEFS_SB_MEMBERS_FORMAT_H */