]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: btree_path_down() optimization
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 15 Aug 2022 22:55:20 +0000 (18:55 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:38 +0000 (17:09 -0400)
We should be calling btree_node_mem_ptr_set() before path_level_init(),
since we already touched the key that btree_node_mem_ptr_set() will
modify and path_level_init() will be doing the lookup in the child btree
node we're recursing to.

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

index 08f39687e964ffd0c984b4088b79ecccdf80853f..a464327d70243c0190fcc85d8022a5bc2f279755 100644 (file)
@@ -1410,9 +1410,6 @@ static __always_inline int btree_path_down(struct btree_trans *trans,
        if (unlikely(ret))
                goto err;
 
-       mark_btree_node_locked(trans, path, level, lock_type);
-       btree_path_level_init(trans, path, b);
-
        if (likely(!trans->journal_replay_not_finished &&
                   tmp.k->k.type == KEY_TYPE_btree_ptr_v2) &&
            unlikely(b != btree_node_mem_ptr(tmp.k)))
@@ -1420,7 +1417,10 @@ static __always_inline int btree_path_down(struct btree_trans *trans,
 
        if (btree_node_read_locked(path, level + 1))
                btree_node_unlock(trans, path, level + 1);
+
+       mark_btree_node_locked(trans, path, level, lock_type);
        path->level = level;
+       btree_path_level_init(trans, path, b);
 
        bch2_btree_path_verify_locks(path);
 err: