From e8d2fe3b4bfad1c902f9b0acea1edc8d5291deb9 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Fri, 21 Jul 2023 05:38:45 -0400 Subject: [PATCH] bcachefs: Consolidate btree id properties This refactoring centralizes defining per-btree properties. bch2_key_types_allowed was also about to overflow a u32, so expand that to a u64. Signed-off-by: Kent Overstreet --- fs/bcachefs/bcachefs_format.h | 77 +++++++++++++++++++++++++-------- fs/bcachefs/bkey_methods.c | 80 ++++------------------------------- fs/bcachefs/btree_gc.h | 2 +- fs/bcachefs/btree_types.h | 67 +++++++++++++++-------------- fs/bcachefs/opts.c | 2 +- 5 files changed, 104 insertions(+), 124 deletions(-) diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h index 5c308f8421c5..4e0673c668d3 100644 --- a/fs/bcachefs/bcachefs_format.h +++ b/fs/bcachefs/bcachefs_format.h @@ -2194,26 +2194,67 @@ LE32_BITMASK(JSET_NO_FLUSH, struct jset, flags, 5, 6); /* Btree: */ -#define BCH_BTREE_IDS() \ - x(extents, 0) \ - x(inodes, 1) \ - x(dirents, 2) \ - x(xattrs, 3) \ - x(alloc, 4) \ - x(quotas, 5) \ - x(stripes, 6) \ - x(reflink, 7) \ - x(subvolumes, 8) \ - x(snapshots, 9) \ - x(lru, 10) \ - x(freespace, 11) \ - x(need_discard, 12) \ - x(backpointers, 13) \ - x(bucket_gens, 14) \ - x(snapshot_trees, 15) +enum btree_id_flags { + BTREE_ID_EXTENTS = BIT(0), + BTREE_ID_SNAPSHOTS = BIT(1), + BTREE_ID_DATA = BIT(2), +}; + +#define BCH_BTREE_IDS() \ + x(extents, 0, BTREE_ID_EXTENTS|BTREE_ID_SNAPSHOTS|BTREE_ID_DATA,\ + BIT_ULL(KEY_TYPE_whiteout)| \ + BIT_ULL(KEY_TYPE_error)| \ + BIT_ULL(KEY_TYPE_cookie)| \ + BIT_ULL(KEY_TYPE_extent)| \ + BIT_ULL(KEY_TYPE_reservation)| \ + BIT_ULL(KEY_TYPE_reflink_p)| \ + BIT_ULL(KEY_TYPE_inline_data)) \ + x(inodes, 1, BTREE_ID_SNAPSHOTS, \ + BIT_ULL(KEY_TYPE_whiteout)| \ + BIT_ULL(KEY_TYPE_inode)| \ + BIT_ULL(KEY_TYPE_inode_v2)| \ + BIT_ULL(KEY_TYPE_inode_v3)| \ + BIT_ULL(KEY_TYPE_inode_generation)) \ + x(dirents, 2, BTREE_ID_SNAPSHOTS, \ + BIT_ULL(KEY_TYPE_whiteout)| \ + BIT_ULL(KEY_TYPE_hash_whiteout)| \ + BIT_ULL(KEY_TYPE_dirent)) \ + x(xattrs, 3, BTREE_ID_SNAPSHOTS, \ + BIT_ULL(KEY_TYPE_whiteout)| \ + BIT_ULL(KEY_TYPE_cookie)| \ + BIT_ULL(KEY_TYPE_hash_whiteout)| \ + BIT_ULL(KEY_TYPE_xattr)) \ + x(alloc, 4, 0, \ + BIT_ULL(KEY_TYPE_alloc)| \ + BIT_ULL(KEY_TYPE_alloc_v2)| \ + BIT_ULL(KEY_TYPE_alloc_v3)| \ + BIT_ULL(KEY_TYPE_alloc_v4)) \ + x(quotas, 5, 0, \ + BIT_ULL(KEY_TYPE_quota)) \ + x(stripes, 6, 0, \ + BIT_ULL(KEY_TYPE_stripe)) \ + x(reflink, 7, BTREE_ID_EXTENTS|BTREE_ID_DATA, \ + BIT_ULL(KEY_TYPE_reflink_v)| \ + BIT_ULL(KEY_TYPE_indirect_inline_data)) \ + x(subvolumes, 8, 0, \ + BIT_ULL(KEY_TYPE_subvolume)) \ + x(snapshots, 9, 0, \ + BIT_ULL(KEY_TYPE_snapshot)) \ + x(lru, 10, 0, \ + BIT_ULL(KEY_TYPE_set)) \ + x(freespace, 11, BTREE_ID_EXTENTS, \ + BIT_ULL(KEY_TYPE_set)) \ + x(need_discard, 12, 0, \ + BIT_ULL(KEY_TYPE_set)) \ + x(backpointers, 13, 0, \ + BIT_ULL(KEY_TYPE_backpointer)) \ + x(bucket_gens, 14, 0, \ + BIT_ULL(KEY_TYPE_bucket_gens)) \ + x(snapshot_trees, 15, 0, \ + BIT_ULL(KEY_TYPE_snapshot_tree)) enum btree_id { -#define x(kwd, val) BTREE_ID_##kwd = val, +#define x(name, nr, ...) BTREE_ID_##name = nr, BCH_BTREE_IDS() #undef x BTREE_ID_NR diff --git a/fs/bcachefs/bkey_methods.c b/fs/bcachefs/bkey_methods.c index 1381166bfc55..90557f4c156d 100644 --- a/fs/bcachefs/bkey_methods.c +++ b/fs/bcachefs/bkey_methods.c @@ -140,78 +140,14 @@ int bch2_bkey_val_invalid(struct bch_fs *c, struct bkey_s_c k, return ops->key_invalid(c, k, flags, err); } -static unsigned bch2_key_types_allowed[] = { - [BKEY_TYPE_extents] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_whiteout)| - (1U << KEY_TYPE_error)| - (1U << KEY_TYPE_cookie)| - (1U << KEY_TYPE_extent)| - (1U << KEY_TYPE_reservation)| - (1U << KEY_TYPE_reflink_p)| - (1U << KEY_TYPE_inline_data), - [BKEY_TYPE_inodes] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_whiteout)| - (1U << KEY_TYPE_inode)| - (1U << KEY_TYPE_inode_v2)| - (1U << KEY_TYPE_inode_v3)| - (1U << KEY_TYPE_inode_generation), - [BKEY_TYPE_dirents] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_whiteout)| - (1U << KEY_TYPE_hash_whiteout)| - (1U << KEY_TYPE_dirent), - [BKEY_TYPE_xattrs] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_whiteout)| - (1U << KEY_TYPE_cookie)| - (1U << KEY_TYPE_hash_whiteout)| - (1U << KEY_TYPE_xattr), - [BKEY_TYPE_alloc] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_alloc)| - (1U << KEY_TYPE_alloc_v2)| - (1U << KEY_TYPE_alloc_v3)| - (1U << KEY_TYPE_alloc_v4), - [BKEY_TYPE_quotas] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_quota), - [BKEY_TYPE_stripes] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_stripe), - [BKEY_TYPE_reflink] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_reflink_v)| - (1U << KEY_TYPE_indirect_inline_data), - [BKEY_TYPE_subvolumes] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_subvolume), - [BKEY_TYPE_snapshots] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_snapshot), - [BKEY_TYPE_lru] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_set), - [BKEY_TYPE_freespace] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_set), - [BKEY_TYPE_need_discard] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_set), - [BKEY_TYPE_backpointers] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_backpointer), - [BKEY_TYPE_bucket_gens] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_bucket_gens), - [BKEY_TYPE_snapshot_trees] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_snapshot_tree), +static u64 bch2_key_types_allowed[] = { +#define x(name, nr, flags, keys) [BKEY_TYPE_##name] = BIT_ULL(KEY_TYPE_deleted)|keys, + BCH_BTREE_IDS() +#undef x [BKEY_TYPE_btree] = - (1U << KEY_TYPE_deleted)| - (1U << KEY_TYPE_btree_ptr)| - (1U << KEY_TYPE_btree_ptr_v2), + BIT_ULL(KEY_TYPE_deleted)| + BIT_ULL(KEY_TYPE_btree_ptr)| + BIT_ULL(KEY_TYPE_btree_ptr_v2), }; int __bch2_bkey_invalid(struct bch_fs *c, struct bkey_s_c k, @@ -225,7 +161,7 @@ int __bch2_bkey_invalid(struct bch_fs *c, struct bkey_s_c k, } if (flags & BKEY_INVALID_COMMIT && - !(bch2_key_types_allowed[type] & (1U << k.k->type))) { + !(bch2_key_types_allowed[type] & BIT_ULL(k.k->type))) { prt_printf(err, "invalid key type for btree %s (%s)", bch2_btree_ids[type], bch2_bkey_types[k.k->type]); return -BCH_ERR_invalid_bkey; diff --git a/fs/bcachefs/btree_gc.h b/fs/bcachefs/btree_gc.h index 402c69184656..b45e382f7055 100644 --- a/fs/bcachefs/btree_gc.h +++ b/fs/bcachefs/btree_gc.h @@ -51,7 +51,7 @@ static inline int gc_pos_cmp(struct gc_pos l, struct gc_pos r) static inline enum gc_phase btree_id_to_gc_phase(enum btree_id id) { switch (id) { -#define x(name, v) case BTREE_ID_##name: return GC_PHASE_BTREE_##name; +#define x(name, v, ...) case BTREE_ID_##name: return GC_PHASE_BTREE_##name; BCH_BTREE_IDS() #undef x default: diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index 9bfaa15d5ad4..70398aaa095e 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -636,7 +636,7 @@ static inline unsigned bset_byte_offset(struct btree *b, void *i) } enum btree_node_type { -#define x(kwd, val) BKEY_TYPE_##kwd = val, +#define x(kwd, val, ...) BKEY_TYPE_##kwd = val, BCH_BTREE_IDS() #undef x BKEY_TYPE_btree, @@ -655,31 +655,37 @@ static inline enum btree_node_type btree_node_type(struct btree *b) } #define BTREE_NODE_TYPE_HAS_TRANS_TRIGGERS \ - ((1U << BKEY_TYPE_extents)| \ - (1U << BKEY_TYPE_alloc)| \ - (1U << BKEY_TYPE_inodes)| \ - (1U << BKEY_TYPE_stripes)| \ - (1U << BKEY_TYPE_reflink)| \ - (1U << BKEY_TYPE_btree)) + (BIT(BKEY_TYPE_extents)| \ + BIT(BKEY_TYPE_alloc)| \ + BIT(BKEY_TYPE_inodes)| \ + BIT(BKEY_TYPE_stripes)| \ + BIT(BKEY_TYPE_reflink)| \ + BIT(BKEY_TYPE_btree)) #define BTREE_NODE_TYPE_HAS_MEM_TRIGGERS \ - ((1U << BKEY_TYPE_alloc)| \ - (1U << BKEY_TYPE_inodes)| \ - (1U << BKEY_TYPE_stripes)| \ - (1U << BKEY_TYPE_snapshots)) + (BIT(BKEY_TYPE_alloc)| \ + BIT(BKEY_TYPE_inodes)| \ + BIT(BKEY_TYPE_stripes)| \ + BIT(BKEY_TYPE_snapshots)) #define BTREE_NODE_TYPE_HAS_TRIGGERS \ (BTREE_NODE_TYPE_HAS_TRANS_TRIGGERS| \ BTREE_NODE_TYPE_HAS_MEM_TRIGGERS) -#define BTREE_ID_IS_EXTENTS \ - ((1U << BTREE_ID_extents)| \ - (1U << BTREE_ID_reflink)| \ - (1U << BTREE_ID_freespace)) +static inline bool btree_node_type_needs_gc(enum btree_node_type type) +{ + return BTREE_NODE_TYPE_HAS_TRIGGERS & (1U << type); +} static inline bool btree_node_type_is_extents(enum btree_node_type type) { - return (1U << type) & BTREE_ID_IS_EXTENTS; + const unsigned mask = 0 +#define x(name, nr, flags, ...) |((!!((flags) & BTREE_ID_EXTENTS)) << nr) + BCH_BTREE_IDS() +#undef x + ; + + return (1U << type) & mask; } static inline bool btree_id_is_extents(enum btree_id btree) @@ -687,29 +693,26 @@ static inline bool btree_id_is_extents(enum btree_id btree) return btree_node_type_is_extents((enum btree_node_type) btree); } -#define BTREE_ID_HAS_SNAPSHOTS \ - ((1U << BTREE_ID_extents)| \ - (1U << BTREE_ID_inodes)| \ - (1U << BTREE_ID_dirents)| \ - (1U << BTREE_ID_xattrs)) - -#define BTREE_ID_HAS_PTRS \ - ((1U << BTREE_ID_extents)| \ - (1U << BTREE_ID_reflink)) - static inline bool btree_type_has_snapshots(enum btree_id id) { - return (1 << id) & BTREE_ID_HAS_SNAPSHOTS; + const unsigned mask = 0 +#define x(name, nr, flags, ...) |((!!((flags) & BTREE_ID_SNAPSHOTS)) << nr) + BCH_BTREE_IDS() +#undef x + ; + + return (1U << id) & mask; } static inline bool btree_type_has_ptrs(enum btree_id id) { - return (1 << id) & BTREE_ID_HAS_PTRS; -} + const unsigned mask = 0 +#define x(name, nr, flags, ...) |((!!((flags) & BTREE_ID_DATA)) << nr) + BCH_BTREE_IDS() +#undef x + ; -static inline bool btree_node_type_needs_gc(enum btree_node_type type) -{ - return BTREE_NODE_TYPE_HAS_TRIGGERS & (1U << type); + return (1U << id) & mask; } struct btree_root { diff --git a/fs/bcachefs/opts.c b/fs/bcachefs/opts.c index 56f586f8d25b..3a6fd1d96ed2 100644 --- a/fs/bcachefs/opts.c +++ b/fs/bcachefs/opts.c @@ -10,7 +10,7 @@ #include "super-io.h" #include "util.h" -#define x(t, n) [n] = #t, +#define x(t, n, ...) [n] = #t, const char * const bch2_error_actions[] = { BCH_ERROR_ACTIONS()