bcachefs: Kill bch2_btree_iter_set_pos_same_leaf()
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 8 Feb 2021 01:16:21 +0000 (20:16 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:53 +0000 (17:08 -0400)
The only reason we were keeping this around was for
BTREE_INSERT_NOUNLOCK semantics - if bch2_btree_iter_set_pos() advances
to the next leaf node, it'll drop the lock on the node that we just
inserted to.

But we don't rely on BTREE_INSERT_NOUNLOCK semantics for the extents
btree, just the inodes btree, and if we do need it for the extents btree
in the future we can do it more cleanly by cloning the iterator - this
lets us delete some special cases in the btree iterator code, which is
complicated enough as it is.

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

index 431b1e8bebc76ea7fdd007113581b3dcf45716cf..e4fb1a0451a4e959d10e32a35b3e71d0a45791b6 100644 (file)
@@ -516,12 +516,7 @@ static void bch2_btree_iter_verify_level(struct btree_iter *iter,
        if (!bch2_btree_node_relock(iter, level))
                return;
 
-       /*
-        * Ideally this invariant would always be true, and hopefully in the
-        * future it will be, but for now set_pos_same_leaf() breaks it:
-        */
-       BUG_ON(iter->uptodate < BTREE_ITER_NEED_TRAVERSE &&
-              !btree_iter_pos_in_node(iter, l->b));
+       BUG_ON(!btree_iter_pos_in_node(iter, l->b));
 
        /*
         * node iterators don't use leaf node iterator:
@@ -1457,36 +1452,6 @@ struct btree *bch2_btree_iter_next_node(struct btree_iter *iter)
 
 /* Iterate across keys (in leaf nodes only) */
 
-void bch2_btree_iter_set_pos_same_leaf(struct btree_iter *iter, struct bpos new_pos)
-{
-       struct btree_iter_level *l = &iter->l[0];
-
-       EBUG_ON(iter->level != 0);
-       EBUG_ON(bkey_cmp(new_pos, iter->pos) < 0);
-       EBUG_ON(!btree_node_locked(iter, 0));
-       EBUG_ON(bkey_cmp(new_pos, l->b->key.k.p) > 0);
-
-       bkey_init(&iter->k);
-       iter->k.p = iter->pos = new_pos;
-       btree_iter_set_dirty(iter, BTREE_ITER_NEED_PEEK);
-
-       btree_iter_advance_to_pos(iter, l, -1);
-
-       /*
-        * XXX:
-        * keeping a node locked that's outside (even just outside) iter->pos
-        * breaks __bch2_btree_node_lock(). This seems to only affect
-        * bch2_btree_node_get_sibling so for now it's fixed there, but we
-        * should try to get rid of this corner case.
-        *
-        * (this behaviour is currently needed for BTREE_INSERT_NOUNLOCK)
-        */
-
-       if (bch2_btree_node_iter_end(&l->iter) &&
-           btree_iter_pos_after_node(iter, l->b))
-               btree_iter_set_dirty(iter, BTREE_ITER_NEED_TRAVERSE);
-}
-
 static void btree_iter_pos_changed(struct btree_iter *iter, int cmp)
 {
        unsigned l = iter->level;
index 9a7f8d0197eca7c9e2d9fb1d3838e3c3dfbb2d72..12c519ae2a6095fde4ad49817c74a83482d3f365 100644 (file)
@@ -174,7 +174,6 @@ struct bkey_s_c bch2_btree_iter_next_slot(struct btree_iter *);
 
 struct bkey_s_c bch2_btree_iter_peek_cached(struct btree_iter *);
 
-void bch2_btree_iter_set_pos_same_leaf(struct btree_iter *, struct bpos);
 void __bch2_btree_iter_set_pos(struct btree_iter *, struct bpos, bool);
 void bch2_btree_iter_set_pos(struct btree_iter *, struct bpos);
 
index f64e7d37bbbfe6422b924124b289d74e3ca617b0..022ab3d90871d99474d17c7d4b87ff48201d6123 100644 (file)
@@ -951,12 +951,8 @@ retry:
 
        trans_for_each_iter(trans, iter)
                if ((trans->iters_live & (1ULL << iter->idx)) &&
-                   (iter->flags & BTREE_ITER_SET_POS_AFTER_COMMIT)) {
-                       if (trans->flags & BTREE_INSERT_NOUNLOCK)
-                               bch2_btree_iter_set_pos_same_leaf(iter, iter->pos_after_commit);
-                       else
-                               bch2_btree_iter_set_pos(iter, iter->pos_after_commit);
-               }
+                   (iter->flags & BTREE_ITER_SET_POS_AFTER_COMMIT))
+                       bch2_btree_iter_set_pos(iter, iter->pos_after_commit);
 out:
        bch2_journal_preres_put(&trans->c->journal, &trans->journal_preres);