bcachefs: Ensure btree_iter_traverse() obeys iter->should_be_locked
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 22 Jul 2021 16:39:11 +0000 (12:39 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:09 +0000 (17:09 -0400)
iter->should_be_locked means that if bch2_btree_iter_relock() fails, we
need to restart the transaction.

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

index ac7a7c18ebe2493f00884ac7ee6c76cea5e6cf21..b7292f9320002bb4d65f30db0006b1668f1ca894 100644 (file)
@@ -1403,6 +1403,15 @@ static int btree_iter_traverse_one(struct btree_iter *iter,
        unsigned l, depth_want = iter->level;
        int ret = 0;
 
+       /*
+        * Ensure we obey iter->should_be_locked: if it's set, we can't unlock
+        * and re-traverse the iterator without a transaction restart:
+        */
+       if (iter->should_be_locked) {
+               ret = bch2_btree_iter_relock(iter, trace_ip) ? 0 : -EINTR;
+               goto out;
+       }
+
        if (btree_iter_type(iter) == BTREE_ITER_CACHED) {
                ret = bch2_btree_iter_traverse_cached(iter);
                goto out;