diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-11-17 16:03:15 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:46 -0400 |
commit | 42af0ad569edbfcd252e9abf0badd97b895c34be (patch) | |
tree | ae24fa72c52e7f8ed6797a98cae59fdae556f543 /fs/bcachefs/btree_types.h | |
parent | 7fec8266af12b655e98978050e716e12e8544fe6 (diff) | |
download | linux-42af0ad569edbfcd252e9abf0badd97b895c34be.tar.gz linux-42af0ad569edbfcd252e9abf0badd97b895c34be.tar.bz2 linux-42af0ad569edbfcd252e9abf0badd97b895c34be.zip |
bcachefs: Fix a race with b->write_type
b->write_type needs to be set atomically with setting the
btree_node_need_write flag, so move it into b->flags.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/btree_types.h')
-rw-r--r-- | fs/bcachefs/btree_types.h | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index 38c4754dbd7e..72e6a214b89a 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -77,7 +77,6 @@ struct btree { u8 nsets; u8 nr_key_bits; u16 version_ondisk; - u8 write_type; struct bkey_format format; @@ -445,6 +444,23 @@ struct btree_trans { struct replicas_delta_list *fs_usage_deltas; }; +#define BCH_BTREE_WRITE_TYPES() \ + x(initial, 0) \ + x(init_next_bset, 1) \ + x(cache_reclaim, 2) \ + x(journal_reclaim, 3) \ + x(interior, 4) + +enum btree_write_type { +#define x(t, n) BTREE_WRITE_##t, + BCH_BTREE_WRITE_TYPES() +#undef x + BTREE_WRITE_TYPE_NR, +}; + +#define BTREE_WRITE_TYPE_MASK (roundup_pow_of_two(BTREE_WRITE_TYPE_NR) - 1) +#define BTREE_WRITE_TYPE_BITS ilog2(roundup_pow_of_two(BTREE_WRITE_TYPE_NR)) + #define BTREE_FLAGS() \ x(read_in_flight) \ x(read_error) \ @@ -464,6 +480,8 @@ struct btree_trans { x(never_write) enum btree_flags { + /* First bits for btree node write type */ + BTREE_NODE_FLAGS_START = BTREE_WRITE_TYPE_BITS - 1, #define x(flag) BTREE_NODE_##flag, BTREE_FLAGS() #undef x |