bcachefs: kill BTREE_ITER_NOUNLOCK
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 10 May 2019 21:15:30 +0000 (17:15 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:22 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_cache.c
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_iter.h
fs/bcachefs/btree_locking.h
fs/bcachefs/btree_types.h
fs/bcachefs/btree_update_leaf.c

index 422186e67f3f2f5b62d64838f94b384362c72af1..ece2c4d2ebd86e50ea55eb697ae6f5d2bb7dbc1f 100644 (file)
@@ -806,8 +806,7 @@ struct btree *bch2_btree_node_get_sibling(struct bch_fs *c,
        ret = bch2_btree_node_get(c, iter, &tmp.k, level,
                                  SIX_LOCK_intent);
 
-       if (PTR_ERR_OR_ZERO(ret) == -EINTR &&
-           !(iter->flags & BTREE_ITER_NOUNLOCK)) {
+       if (PTR_ERR_OR_ZERO(ret) == -EINTR && !trans->nounlock) {
                struct btree_iter *linked;
 
                if (!bch2_btree_node_relock(iter, level + 1))
index f6c2be149645d62281ec2f104a2375cc93587ba1..e18a88cd972e03f148533bdb090de73692b5d700 100644 (file)
@@ -224,7 +224,7 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos,
                 */
                if (type == SIX_LOCK_intent &&
                    linked->nodes_locked != linked->nodes_intent_locked) {
-                       if (!(iter->flags & BTREE_ITER_NOUNLOCK)) {
+                       if (!(iter->trans->nounlock)) {
                                linked->locks_want = max_t(unsigned,
                                                linked->locks_want,
                                                __fls(linked->nodes_locked) + 1);
@@ -240,7 +240,7 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos,
                 */
                if (linked->btree_id == iter->btree_id &&
                    level > __fls(linked->nodes_locked)) {
-                       if (!(iter->flags & BTREE_ITER_NOUNLOCK)) {
+                       if (!(iter->trans->nounlock)) {
                                linked->locks_want =
                                        max(level + 1, max_t(unsigned,
                                            linked->locks_want,
@@ -269,9 +269,6 @@ void bch2_btree_iter_verify_locks(struct btree_iter *iter)
 {
        unsigned l;
 
-       BUG_ON((iter->flags & BTREE_ITER_NOUNLOCK) &&
-              !btree_node_locked(iter, 0));
-
        for (l = 0; btree_iter_node(iter, l); l++) {
                if (iter->uptodate >= BTREE_ITER_NEED_RELOCK &&
                    !btree_node_locked(iter, l))
index b2c0b6816d1c2eff529a51fbc2172b61da6b72bf..ee54378136040bd57b393464c9e9da7979e1d3dd 100644 (file)
@@ -117,7 +117,7 @@ static inline bool bch2_btree_iter_upgrade(struct btree_iter *iter,
        new_locks_want = min(new_locks_want, BTREE_MAX_DEPTH);
 
        return iter->locks_want < new_locks_want
-               ? (!(iter->flags & BTREE_ITER_NOUNLOCK)
+               ? (!iter->trans->nounlock
                   ? __bch2_btree_iter_upgrade(iter, new_locks_want)
                   : __bch2_btree_iter_upgrade_nounlock(iter, new_locks_want))
                : iter->uptodate <= BTREE_ITER_NEED_PEEK;
index 33bc94a714c609304c59a904e757c260999fd139..6591da0a52b37ce9dfe2a1b2787a8f8933bb4fde 100644 (file)
@@ -107,7 +107,7 @@ static inline void __btree_node_unlock(struct btree_iter *iter, unsigned level)
 
 static inline void btree_node_unlock(struct btree_iter *iter, unsigned level)
 {
-       BUG_ON(!level && iter->flags & BTREE_ITER_NOUNLOCK);
+       EBUG_ON(!level && iter->trans->nounlock);
 
        __btree_node_unlock(iter, level);
 }
index ece4f30b3f858e6a4607c5c82f838f3a7a5d8262..d88f1c911d047e3f514625951a043eb9a72df0d0 100644 (file)
@@ -197,7 +197,6 @@ enum btree_iter_type {
  */
 #define BTREE_ITER_IS_EXTENTS          (1 << 4)
 #define BTREE_ITER_ERROR               (1 << 5)
-#define BTREE_ITER_NOUNLOCK            (1 << 6)
 
 enum btree_iter_uptodate {
        BTREE_ITER_UPTODATE             = 0,
@@ -287,6 +286,7 @@ struct btree_trans {
        u8                      size;
        unsigned                used_mempool:1;
        unsigned                error:1;
+       unsigned                nounlock:1;
 
        unsigned                mem_top;
        unsigned                mem_bytes;
index a449f983a3431f4278a67d34fce2df9c461a2c52..b5749b19c3b9a0dcacf736b903629d443a94edae 100644 (file)
@@ -551,7 +551,6 @@ static inline int do_btree_insert_at(struct btree_trans *trans,
        struct bch_fs *c = trans->c;
        struct bch_fs_usage_online *fs_usage = NULL;
        struct btree_insert_entry *i;
-       struct btree_iter *linked;
        int ret;
 
        if (likely(!(trans->flags & BTREE_INSERT_NO_CLEAR_REPLICAS))) {
@@ -624,17 +623,6 @@ static inline int do_btree_insert_at(struct btree_trans *trans,
                                i->k->k.version = MAX_VERSION;
        }
 
-       if (trans->flags & BTREE_INSERT_NOUNLOCK) {
-               /*
-                * linked iterators that weren't being updated may or may not
-                * have been traversed/locked, depending on what the caller was
-                * doing:
-                */
-               trans_for_each_iter(trans, linked)
-                       if (linked->uptodate < BTREE_ITER_NEED_RELOCK)
-                               linked->flags |= BTREE_ITER_NOUNLOCK;
-       }
-
        trans_for_each_update_iter(trans, i)
                if (update_has_triggers(trans, i) &&
                    !update_triggers_transactional(trans, i))
@@ -809,7 +797,6 @@ static int __bch2_trans_commit(struct btree_trans *trans,
 {
        struct bch_fs *c = trans->c;
        struct btree_insert_entry *i;
-       struct btree_iter *linked;
        int ret;
 
        trans_for_each_update_iter(trans, i) {
@@ -832,18 +819,20 @@ static int __bch2_trans_commit(struct btree_trans *trans,
        if (unlikely(ret))
                goto err;
 
+       if (trans->flags & BTREE_INSERT_NOUNLOCK)
+               trans->nounlock = true;
+
        trans_for_each_update_leaf(trans, i)
                bch2_foreground_maybe_merge(c, i->iter, 0, trans->flags);
 
+       trans->nounlock = false;
+
        trans_for_each_update_iter(trans, i)
                bch2_btree_iter_downgrade(i->iter);
 err:
        /* make sure we didn't drop or screw up locks: */
        bch2_btree_trans_verify_locks(trans);
 
-       trans_for_each_iter(trans, linked)
-               linked->flags &= ~BTREE_ITER_NOUNLOCK;
-
        return ret;
 }