btrfs: allocate path earlier at btrfs_del_dir_entries_in_log()
authorFilipe Manana <fdmanana@suse.com>
Thu, 29 May 2025 15:32:37 +0000 (16:32 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 21 Jul 2025 21:53:29 +0000 (23:53 +0200)
Instead of allocating the path after joining the log transaction, allocate
it before so that we're not delaying log commits for the rare cases where
the allocation takes a significant time (under memory pressure and all
slabs are full, there's the need to allocate a new page, etc).

Reviewed-by: Boris Burkov <boris@bur.io>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tree-log.c

index 58984ca2bfad2b2cd1b69890cedc7521dbe7d0b1..c3d7238ba2cbd911fc618c8311aa34189fa47ade 100644 (file)
@@ -3472,27 +3472,27 @@ void btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,
                return;
        }
 
+       path = btrfs_alloc_path();
+       if (!path) {
+               btrfs_set_log_full_commit(trans);
+               return;
+       }
+
        ret = join_running_log_trans(root);
        ASSERT(ret == 0, "join_running_log_trans() ret=%d", ret);
        if (WARN_ON(ret))
-               return;
+               goto out;
 
        mutex_lock(&dir->log_mutex);
 
-       path = btrfs_alloc_path();
-       if (!path) {
-               ret = -ENOMEM;
-               goto out_unlock;
-       }
-
        ret = del_logged_dentry(trans, root->log_root, path, btrfs_ino(dir),
                                name, index);
-       btrfs_free_path(path);
-out_unlock:
        mutex_unlock(&dir->log_mutex);
        if (ret < 0)
                btrfs_set_log_full_commit(trans);
        btrfs_end_log_trans(root);
+out:
+       btrfs_free_path(path);
 }
 
 /* see comments for btrfs_del_dir_entries_in_log */