summaryrefslogtreecommitdiff
path: root/fs/bcachefs/btree_update_leaf.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-02-24 08:08:53 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2022-04-17 15:44:23 -0400
commit00be740d03e64dfc23c0a199093d59b5b1e6ae1c (patch)
treec519a36f5e0829fc3beed0ad114a8160dfc5fa40 /fs/bcachefs/btree_update_leaf.c
parent3642dabc0c4369c4a254567b2dcd25b9440ef1db (diff)
bcachefs: run_one_trigger() now checks journal keys
Previously, when doing updates and running triggers before journal replay completes, triggers would see the incorrect key for the old key being overwritten - this patch updates the trigger code to check the journal keys when necessary, needed for the upcoming allocator rewrite. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/btree_update_leaf.c')
-rw-r--r--fs/bcachefs/btree_update_leaf.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index 4e2f3b8d24b6..628171058e74 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -1413,6 +1413,7 @@ static int __must_check
bch2_trans_update_by_path(struct btree_trans *trans, struct btree_path *path,
struct bkey_i *k, enum btree_update_flags flags)
{
+ struct bch_fs *c = trans->c;
struct btree_insert_entry *i, n;
BUG_ON(!path->should_be_locked);
@@ -1461,6 +1462,16 @@ bch2_trans_update_by_path(struct btree_trans *trans, struct btree_path *path,
i->old_v = bch2_btree_path_peek_slot(path, &i->old_k).v;
i->old_btree_u64s = !bkey_deleted(&i->old_k) ? i->old_k.u64s : 0;
+
+ if (unlikely(!test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags))) {
+ struct bkey_i *j_k =
+ bch2_journal_keys_peek(c, n.btree_id, n.level, k->k.p);
+
+ if (j_k && !bpos_cmp(j_k->k.p, i->k->k.p)) {
+ i->old_k = j_k->k;
+ i->old_v = &j_k->v;
+ }
+ }
}
__btree_path_get(n.path, true);