bcachefs: Simplify bch2_path_put()
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 May 2025 19:52:15 +0000 (15:52 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Fri, 23 May 2025 11:59:43 +0000 (07:59 -0400)
Simplify the "do we need to keep this locked?" checks.

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

index 51ff452562af1da84757aceb3b3f4b6482cfd64d..77b91dd62d95afd1f99f9b6950b934c167e01200 100644 (file)
@@ -1399,35 +1399,44 @@ static bool bch2_btree_path_can_relock(struct btree_trans *trans, struct btree_p
 
 void bch2_path_put(struct btree_trans *trans, btree_path_idx_t path_idx, bool intent)
 {
-       struct btree_path *path = trans->paths + path_idx, *dup;
+       struct btree_path *path = trans->paths + path_idx, *dup = NULL;
 
        if (!__btree_path_put(trans, path, intent))
                return;
 
+       if (!path->preserve && !path->should_be_locked)
+               goto free;
+
        dup = path->preserve
                ? have_path_at_pos(trans, path)
                : have_node_at_pos(trans, path);
-
-       trace_btree_path_free(trans, path_idx, dup);
-
-       if (!dup && !(!path->preserve && !is_btree_node(path, path->level)))
+       if (!dup)
                return;
 
-       if (path->should_be_locked && !trans->restarted) {
-               if (!dup)
-                       return;
-
+       /*
+        * If we need this path locked, the duplicate also has te be locked
+        * before we free this one:
+        */
+       if (path->should_be_locked &&
+           !dup->should_be_locked &&
+           !trans->restarted) {
                if (!(trans->locked
                      ? bch2_btree_path_relock_norestart(trans, dup)
                      : bch2_btree_path_can_relock(trans, dup)))
                        return;
-       }
 
-       if (dup) {
-               dup->preserve           |= path->preserve;
-               dup->should_be_locked   |= path->should_be_locked;
+               dup->should_be_locked = true;
        }
 
+       BUG_ON(path->should_be_locked &&
+              !trans->restarted &&
+              trans->locked &&
+              !btree_node_locked(dup, dup->level));
+
+       path->should_be_locked = false;
+       dup->preserve |= path->preserve;
+free:
+       trace_btree_path_free(trans, path_idx, dup);
        __bch2_path_free(trans, path_idx);
 }