diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-01-06 01:20:41 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2022-03-12 20:14:06 -0500 |
commit | 596149cdf7f804799ba14d46a3d8f9cc28ad2036 (patch) | |
tree | 3fc0a13a13a50d39fb1f69bf6a28eae845568942 | |
parent | f1842f32124c7dd3c235404f5c48eb25cd225fec (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 <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c index 289295b37315..3298e3c3cf39 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -494,6 +494,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; @@ -520,6 +523,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++; @@ -529,6 +535,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)) && |