bcachefs: Run alloc triggers last
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 6 Jan 2022 06:20:41 +0000 (01:20 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:25 +0000 (17:09 -0400)
Triggers can generate additional btree updates - we need to run alloc
triggers after all other triggers have run, because they generate
updates for the alloc btree.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/btree_update_leaf.c

index ed5be81c3254d309e3b5b9a0c58c19213445d69e..e9e10df8ee958e842ff9996e8136c181f7aebb87 100644 (file)
@@ -507,6 +507,9 @@ static int run_btree_triggers(struct btree_trans *trans, enum btree_id btree_id,
                        for (i = btree_id_start;
                             i < trans->updates + trans->nr_updates && i->btree_id <= btree_id;
                             i++) {
+                               if (i->btree_id != btree_id)
+                                       continue;
+
                                ret = run_one_trans_trigger(trans, i, overwrite);
                                if (ret < 0)
                                        return ret;
@@ -533,6 +536,9 @@ static int bch2_trans_commit_run_triggers(struct btree_trans *trans)
         * they are re-added.
         */
        for (btree_id = 0; btree_id < BTREE_ID_NR; btree_id++) {
+               if (btree_id == BTREE_ID_alloc)
+                       continue;
+
                while (btree_id_start < trans->updates + trans->nr_updates &&
                       btree_id_start->btree_id < btree_id)
                        btree_id_start++;
@@ -542,6 +548,17 @@ static int bch2_trans_commit_run_triggers(struct btree_trans *trans)
                        return ret;
        }
 
+       trans_for_each_update(trans, i) {
+               if (i->btree_id > BTREE_ID_alloc)
+                       break;
+               if (i->btree_id == BTREE_ID_alloc) {
+                       ret = run_btree_triggers(trans, BTREE_ID_alloc, i);
+                       if (ret)
+                               return ret;
+                       break;
+               }
+       }
+
        trans_for_each_update(trans, i)
                BUG_ON(!(i->flags & BTREE_TRIGGER_NORUN) &&
                       (BTREE_NODE_TYPE_HAS_TRANS_TRIGGERS & (1U << i->bkey_type)) &&