Commit 841324a8 authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba
Browse files

btrfs: allocate path earlier at btrfs_log_new_name()



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: default avatarBoris Burkov <boris@bur.io>
Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent b32efae7
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -7545,6 +7545,14 @@ void btrfs_log_new_name(struct btrfs_trans_handle *trans,
					     &old_dentry->d_name, 0, &fname);
		if (ret)
			goto out;

		path = btrfs_alloc_path();
		if (!path) {
			ret = -ENOMEM;
			fscrypt_free_filename(&fname);
			goto out;
		}

		/*
		 * We have two inodes to update in the log, the old directory and
		 * the inode that got renamed, so we must pin the log to prevent
@@ -7558,19 +7566,13 @@ void btrfs_log_new_name(struct btrfs_trans_handle *trans,
		 * mark the log for a full commit.
		 */
		if (WARN_ON_ONCE(ret < 0)) {
			btrfs_free_path(path);
			fscrypt_free_filename(&fname);
			goto out;
		}

		log_pinned = true;

		path = btrfs_alloc_path();
		if (!path) {
			ret = -ENOMEM;
			fscrypt_free_filename(&fname);
			goto out;
		}

		/*
		 * Other concurrent task might be logging the old directory,
		 * as it can be triggered when logging other inode that had or