bcachefs: Consolidate btree id properties
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 21 Jul 2023 09:38:45 +0000 (05:38 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:09 +0000 (17:10 -0400)
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 <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs_format.h
fs/bcachefs/bkey_methods.c
fs/bcachefs/btree_gc.h
fs/bcachefs/btree_types.h
fs/bcachefs/opts.c

index 5c308f8421c57f76731492983c4a28835f1d0ca3..4e0673c668d35d5149d080fa41c62bd54299c812 100644 (file)
@@ -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
index 1381166bfc55b7cad8600a1d313ed267f95dfa27..90557f4c156db96853fded059e13c09fa2f3dd42 100644 (file)
@@ -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;
index 402c691846568c6ab52a935a5ef707c42391f41a..b45e382f7055b1a28a045707bf1116b04a31abc8 100644 (file)
@@ -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:
index 9bfaa15d5ad49c22d6aabcdeb2bd83ed82616cb6..70398aaa095edfedf05dedfae66019d021376e2b 100644 (file)
@@ -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 {
index 56f586f8d25b0f61e2995972adada25e0f28a2f9..3a6fd1d96ed27cc47e23ec61602c216089674d36 100644 (file)
@@ -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()