bcachefs: bch2_btree_iter_peek_slot() now saves initial position when searching
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 31 Dec 2022 00:15:53 +0000 (19:15 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:06 +0000 (17:09 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c

index 6f313e598335a2bfcd4d8eea0e1334fda63115e7..491cc279a9735d4fb70d1d8b9071a071355f7dc9 100644 (file)
@@ -1869,10 +1869,22 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
                }
        } else {
                struct bpos next;
-               struct bpos pos = iter->pos;
 
-               k = bch2_btree_iter_peek(iter);
-               iter->pos = pos;
+               if (iter->flags & BTREE_ITER_INTENT) {
+                       struct btree_iter *child =
+                               btree_iter_child_alloc(iter, _THIS_IP_);
+
+                       btree_iter_copy(child, iter);
+                       k = bch2_btree_iter_peek(child);
+
+                       if (k.k && !bkey_err(k))
+                               iter->k = child->k;
+               } else {
+                       struct bpos pos = iter->pos;
+
+                       k = bch2_btree_iter_peek(iter);
+                       iter->pos = pos;
+               }
 
                if (unlikely(bkey_err(k)))
                        return k;