bcachefs: bch2_btree_iter_traverse() shouldn't normally call traverse_all()
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 27 Jul 2021 22:01:52 +0000 (18:01 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:09 +0000 (17:09 -0400)
If there's more than one iterator in the btree_trans, it's requried to
call bch2_trans_begin() to handle transaction restarts.

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

index 816b9369c833ed77d74c046d34326c238c20e9f8..ac7a7c18ebe2493f00884ac7ee6c76cea5e6cf21 100644 (file)
@@ -1476,8 +1476,10 @@ static int __must_check __bch2_btree_iter_traverse(struct btree_iter *iter)
 
        ret =   bch2_trans_cond_resched(trans) ?:
                btree_iter_traverse_one(iter, _RET_IP_);
-       if (unlikely(ret))
+       if (unlikely(ret) && hweight64(trans->iters_linked) == 1) {
                ret = __btree_iter_traverse_all(trans, ret, _RET_IP_);
+               BUG_ON(ret == -EINTR);
+       }
 
        return ret;
 }