bcachefs: Ensure btree_path consistent with node iterators
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 7 Oct 2021 18:54:50 +0000 (14:54 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:13 +0000 (17:09 -0400)
Btree node iterators want the interior btree_path to point to the same
pos as the returned btree node - this fixes a regression from the
introduction of btree_path, where rewriting/updating keys of btree nodes
(e.g. in bch2_dev_metadata_drop()) via btree node iterators.

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

index df542a59fe1225dcdfb1c91ee51b6479baeb7cc2..042b8bdf44453821abf571fc72adfb81cdc4076b 100644 (file)
@@ -1875,13 +1875,14 @@ bch2_btree_iter_traverse(struct btree_iter *iter)
 
 struct btree *bch2_btree_iter_peek_node(struct btree_iter *iter)
 {
+       struct btree_trans *trans = iter->trans;
        struct btree *b = NULL;
        int ret;
 
        EBUG_ON(iter->path->cached);
        bch2_btree_iter_verify(iter);
 
-       ret = bch2_btree_path_traverse(iter->trans, iter->path, iter->flags);
+       ret = bch2_btree_path_traverse(trans, iter->path, iter->flags);
        if (ret)
                goto out;
 
@@ -1893,7 +1894,11 @@ struct btree *bch2_btree_iter_peek_node(struct btree_iter *iter)
 
        bkey_init(&iter->k);
        iter->k.p = iter->pos = b->key.k.p;
+
+       iter->path = btree_path_set_pos(trans, iter->path, b->key.k.p,
+                                       iter->flags & BTREE_ITER_INTENT);
        iter->path->should_be_locked = true;
+       BUG_ON(iter->path->uptodate);
 out:
        bch2_btree_iter_verify_entry_exit(iter);
        bch2_btree_iter_verify(iter);
@@ -1958,7 +1963,11 @@ struct btree *bch2_btree_iter_next_node(struct btree_iter *iter)
 
        bkey_init(&iter->k);
        iter->k.p = iter->pos = b->key.k.p;
+
+       iter->path = btree_path_set_pos(trans, iter->path, b->key.k.p,
+                                       iter->flags & BTREE_ITER_INTENT);
        iter->path->should_be_locked = true;
+       BUG_ON(iter->path->uptodate);
 out:
        bch2_btree_iter_verify_entry_exit(iter);
        bch2_btree_iter_verify(iter);