aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <[email protected]>2022-01-06 01:20:41 -0500
committerKent Overstreet <[email protected]>2023-10-22 17:09:25 -0400
commit0c10cf852551edca80a2b711de1c84fd001ffd02 (patch)
tree2c92f41a0b290411f51b04333f9ae1aed27790b2
parent96d3a0afe04af0c50243e08f9a889c889f9cd131 (diff)
bcachefs: Run alloc triggers last
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 <[email protected]>
-rw-r--r--fs/bcachefs/btree_update_leaf.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index ed5be81c3254..e9e10df8ee95 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -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)) &&