btrfs: allocate scratch eb earlier at btrfs_log_new_name()

Instead of allocating the scratch eb after joining the log transaction,
allocate it before so that we're not delaying log commits for longer
than necessary, as allocating the scratch eb means allocating an
extent_buffer structure, which comes from a dedicated kmem_cache, plus
pages/folios to attach to the eb. Both of these allocations may take time
when we're under memory pressure.

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>
This commit is contained in:
Filipe Manana
2025-06-01 15:39:16 +01:00
committed by David Sterba
parent 841324a8e6
commit 93612a92ba

View File

@@ -7497,6 +7497,9 @@ void btrfs_log_new_name(struct btrfs_trans_handle *trans,
bool log_pinned = false;
int ret;
btrfs_init_log_ctx(&ctx, inode);
ctx.logging_new_name = true;
/*
* this will force the logging code to walk the dentry chain
* up for the file
@@ -7527,6 +7530,13 @@ void btrfs_log_new_name(struct btrfs_trans_handle *trans,
}
ret = 0;
/*
* Now that we know we need to update the log, allocate the scratch eb
* for the context before joining a log transaction below, as this can
* take time and therefore we could delay log commits from other tasks.
*/
btrfs_init_log_ctx_scratch_eb(&ctx);
/*
* If we are doing a rename (old_dir is not NULL) from a directory that
* was previously logged, make sure that on log replay we get the old
@@ -7604,9 +7614,6 @@ void btrfs_log_new_name(struct btrfs_trans_handle *trans,
goto out;
}
btrfs_init_log_ctx(&ctx, inode);
ctx.logging_new_name = true;
btrfs_init_log_ctx_scratch_eb(&ctx);
/*
* We don't care about the return value. If we fail to log the new name
* then we know the next attempt to sync the log will fallback to a full
@@ -7615,7 +7622,6 @@ void btrfs_log_new_name(struct btrfs_trans_handle *trans,
* inconsistent state after a rename operation.
*/
btrfs_log_inode_parent(trans, inode, parent, LOG_INODE_EXISTS, &ctx);
free_extent_buffer(ctx.scratch_eb);
ASSERT(list_empty(&ctx.conflict_inodes));
out:
/*
@@ -7628,5 +7634,6 @@ void btrfs_log_new_name(struct btrfs_trans_handle *trans,
btrfs_set_log_full_commit(trans);
if (log_pinned)
btrfs_end_log_trans(root);
free_extent_buffer(ctx.scratch_eb);
}