]> www.infradead.org Git - users/hch/misc.git/commitdiff
bcachefs: Better trigger ordering
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 11 Feb 2025 15:09:31 +0000 (10:09 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 15 Mar 2025 01:02:14 +0000 (21:02 -0400)
Transactional triggers need to run in a defined ordering, which is not
quite the same as btree ID integer comparison.

Previously this was handled in a hacky way in
bch2_trans_commit_run_triggers(), since it was only the alloc btree that
needed special handling, but upcoming stripe btree changes are going to
require more ordering changes - so, define that ordering.

Next patch will change the transaction commit path to use it.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_types.h
fs/bcachefs/btree_update.c

index a09cbe9cd94f11d32be767a28ba96ec096d2994f..77578da2d23f9937cb6720fd4d128d8917e5874d 100644 (file)
@@ -423,6 +423,7 @@ static inline struct bpos btree_node_pos(struct btree_bkey_cached_common *b)
 
 struct btree_insert_entry {
        unsigned                flags;
+       u8                      sort_order;
        u8                      bkey_type;
        enum btree_id           btree_id:8;
        u8                      level:4;
@@ -853,6 +854,18 @@ static inline bool btree_type_uses_write_buffer(enum btree_id btree)
        return BIT_ULL(btree) & mask;
 }
 
+static inline u8 btree_trigger_order(enum btree_id btree)
+{
+       switch (btree) {
+       case BTREE_ID_alloc:
+               return U8_MAX;
+       case BTREE_ID_stripes:
+               return U8_MAX - 1;
+       default:
+               return btree;
+       }
+}
+
 struct btree_root {
        struct btree            *b;
 
index 13d794f201a5638e9bc79c1b03e172d06fb4bc33..47e54eedd0bc433d145e04ba00ecf8748563843f 100644 (file)
@@ -397,6 +397,7 @@ bch2_trans_update_by_path(struct btree_trans *trans, btree_path_idx_t path_idx,
 
        n = (struct btree_insert_entry) {
                .flags          = flags,
+               .sort_order     = btree_trigger_order(path->btree_id),
                .bkey_type      = __btree_node_type(path->level, path->btree_id),
                .btree_id       = path->btree_id,
                .level          = path->level,