bcachefs: Fix an iterator bug
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 18 Mar 2020 17:40:28 +0000 (13:40 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:37 +0000 (17:08 -0400)
We were incorrectly not restarting the transaction when re-traversing
iterators.

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

index 5f918c6c3efbe18ec25a7e9050f315c174933299..8b1395ef4d0e453724c3996041479ccc57fa0e13 100644 (file)
@@ -1068,7 +1068,14 @@ retry_all:
                        goto retry_all;
        }
 
-       ret = hweight64(trans->iters_live) > 1 ? -EINTR : 0;
+       if (hweight64(trans->iters_live) > 1)
+               ret = -EINTR;
+       else
+               trans_for_each_iter(trans, iter)
+                       if (iter->flags & BTREE_ITER_KEEP_UNTIL_COMMIT) {
+                               ret = -EINTR;
+                               break;
+                       }
 out:
        bch2_btree_cache_cannibalize_unlock(c);
        return ret;