bcachefs: Fix bch2_trans_relock()
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 12 Apr 2021 18:00:07 +0000 (14:00 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:00 +0000 (17:09 -0400)
The patch that changed bch2_trans_relock() to not look at iter->uptodate
also tried to add an optimization by only having it relock
btree_iter_key() iterators (iterators that are live or have been marked
as keep). But, this wasn't thought through - this pops internal iterator
assertions because on transaction restart, when we're traversing
iterators we traverse all iterators marked as linked, and having
bch2_trans_relock() skip some of those mean that it can skil the
iterator that bch2_btree_iter_traverse_one() is currently traversing.

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

index ae2e907adc73e12a60df6672f9f6c537b9b0411b..033a079fb3f3ef6e2dacbc00213d483dc6b79d5c 100644 (file)
@@ -472,8 +472,7 @@ bool bch2_trans_relock(struct btree_trans *trans)
        struct btree_iter *iter;
 
        trans_for_each_iter(trans, iter)
-               if (btree_iter_keep(trans, iter) &&
-                   !bch2_btree_iter_relock(iter, true)) {
+               if (!bch2_btree_iter_relock(iter, true)) {
                        trace_trans_restart_relock(trans->ip);
                        return false;
                }