From 37f72492f401671f1f773cc62dddf742e7fc553b Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Fri, 29 Oct 2021 18:21:05 -0400 Subject: [PATCH] bcachefs: Fix bch2_mark_update() When the old or new key doesn't exist, we should still pass in a deleted key with the correct pos. This fixes a bug in the ec code, when bch2_mark_stripe() was looking up the wrong in-memory stripe. Signed-off-by: Kent Overstreet --- fs/bcachefs/buckets.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c index fc4d9d75794cd..48687a70411e1 100644 --- a/fs/bcachefs/buckets.c +++ b/fs/bcachefs/buckets.c @@ -1231,6 +1231,8 @@ int bch2_mark_key(struct bch_fs *c, struct bkey_s_c new, unsigned flags) struct bkey_s_c old = (struct bkey_s_c) { &deleted, NULL }; int ret; + deleted.p = new.k->p; + percpu_down_read(&c->mark_lock); ret = bch2_mark_key_locked(c, old, new, 0, flags); percpu_up_read(&c->mark_lock); @@ -1248,6 +1250,8 @@ int bch2_mark_update(struct btree_trans *trans, struct btree_path *path, struct bkey unpacked; int ret; + _deleted.p = path->pos; + if (unlikely(flags & BTREE_TRIGGER_NORUN)) return 0; @@ -1846,6 +1850,8 @@ int bch2_trans_mark_update(struct btree_trans *trans, struct bkey unpacked; int ret; + _deleted.p = path->pos; + if (unlikely(flags & BTREE_TRIGGER_NORUN)) return 0; -- 2.30.2