summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-01-06 01:20:41 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2022-03-12 20:14:06 -0500
commit596149cdf7f804799ba14d46a3d8f9cc28ad2036 (patch)
tree3fc0a13a13a50d39fb1f69bf6a28eae845568942
parentf1842f32124c7dd3c235404f5c48eb25cd225fec (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.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 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)) &&