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 <[email protected]>
---
 fs/bcachefs/btree_types.h  | 13 +++++++++++++
 fs/bcachefs/btree_update.c |  1 +
 2 files changed, 14 insertions(+)

diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h
index a09cbe9cd94f..77578da2d23f 100644
--- a/fs/bcachefs/btree_types.h
+++ b/fs/bcachefs/btree_types.h
@@ -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;
 
diff --git a/fs/bcachefs/btree_update.c b/fs/bcachefs/btree_update.c
index 13d794f201a5..47e54eedd0bc 100644
--- a/fs/bcachefs/btree_update.c
+++ b/fs/bcachefs/btree_update.c
@@ -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,
-- 
2.45.2


Reply via email to