mirror of
https://github.com/torvalds/linux.git
synced 2025-01-01 15:51:46 +00:00
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 <kent.overstreet@linux.dev>
This commit is contained in:
parent
85beefefd2
commit
e8d2fe3b4b
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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 {
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user