]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Fix bch2_btree_iter_peek_slot() error path
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 17 Aug 2022 21:49:12 +0000 (17:49 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:38 +0000 (17:09 -0400)
iter->k needs to be consistent with iter->pos - required for
bch2_btree_iter_(rewind|advance) to work correctly.

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

index 0c6e215f46c844ac7c6e850300b96e712a0a4a11..88b2ed1d508a2569e7ff528b09a514acf9e259cf 100644 (file)
@@ -2844,8 +2844,10 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
                                        iter->flags & BTREE_ITER_INTENT);
 
        ret = bch2_btree_path_traverse(trans, iter->path, iter->flags);
-       if (unlikely(ret))
-               return bkey_s_c_err(ret);
+       if (unlikely(ret)) {
+               k = bkey_s_c_err(ret);
+               goto out_no_locked;
+       }
 
        if ((iter->flags & BTREE_ITER_CACHED) ||
            !(iter->flags & (BTREE_ITER_IS_EXTENTS|BTREE_ITER_FILTER_SNAPSHOTS))) {
@@ -2895,7 +2897,10 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
                        struct bpos pos = iter->pos;
 
                        k = bch2_btree_iter_peek(iter);
-                       iter->pos = pos;
+                       if (unlikely(bkey_err(k)))
+                               bch2_btree_iter_set_pos(iter, pos);
+                       else
+                               iter->pos = pos;
                }
 
                if (unlikely(bkey_err(k)))