bcachefs: Fix a bug with multiple iterators being traversed
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 14 May 2019 17:25:25 +0000 (13:25 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:21 +0000 (17:08 -0400)
If upgrade fails on one iterator, but it was copied from another
iterator and will be freed before transaction restart, then the original
iterator will get traversed first, so we need to make required btree
nodes on the original iterator will be traversed too.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c

index ac3c3769e1261f6a814104a9da0bb61c4fbfd273..eeb9a59283a7afdca48e266d84888369554ee3a1 100644 (file)
@@ -320,7 +320,6 @@ bool __bch2_btree_iter_upgrade(struct btree_iter *iter,
        trans_for_each_iter(iter->trans, linked)
                if (linked != iter &&
                    linked->btree_id == iter->btree_id &&
-                   btree_iter_cmp(linked, iter) <= 0 &&
                    linked->locks_want < new_locks_want) {
                        linked->locks_want = new_locks_want;
                        btree_iter_get_locks(linked, true);