| From stable+bounces-171728-greg=kroah.com@vger.kernel.org Tue Aug 19 04:40:29 2025 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 18 Aug 2025 22:40:14 -0400 |
| Subject: btrfs: send: factor out common logic when sending xattrs |
| To: stable@vger.kernel.org |
| Cc: Filipe Manana <fdmanana@suse.com>, David Sterba <dsterba@suse.com>, Sasha Levin <sashal@kernel.org> |
| Message-ID: <20250819024020.291759-1-sashal@kernel.org> |
| |
| From: Filipe Manana <fdmanana@suse.com> |
| |
| [ Upstream commit 17f6a74d0b89092e38e3328b66eda1ab29a195d4 ] |
| |
| We always send xattrs for the current inode only and both callers of |
| send_set_xattr() pass a path for the current inode. So move the path |
| allocation and computation to send_set_xattr(), reducing duplicated |
| code. This also facilitates an upcoming patch. |
| |
| Signed-off-by: Filipe Manana <fdmanana@suse.com> |
| Reviewed-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| Stable-dep-of: 005b0a0c24e1 ("btrfs: send: use fallocate for hole punching with send stream v2") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/btrfs/send.c | 41 +++++++++++++++-------------------------- |
| 1 file changed, 15 insertions(+), 26 deletions(-) |
| |
| --- a/fs/btrfs/send.c |
| +++ b/fs/btrfs/send.c |
| @@ -4879,11 +4879,19 @@ out: |
| } |
| |
| static int send_set_xattr(struct send_ctx *sctx, |
| - struct fs_path *path, |
| const char *name, int name_len, |
| const char *data, int data_len) |
| { |
| - int ret = 0; |
| + struct fs_path *path; |
| + int ret; |
| + |
| + path = fs_path_alloc(); |
| + if (!path) |
| + return -ENOMEM; |
| + |
| + ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen, path); |
| + if (ret < 0) |
| + goto out; |
| |
| ret = begin_cmd(sctx, BTRFS_SEND_C_SET_XATTR); |
| if (ret < 0) |
| @@ -4897,6 +4905,8 @@ static int send_set_xattr(struct send_ct |
| |
| tlv_put_failure: |
| out: |
| + fs_path_free(path); |
| + |
| return ret; |
| } |
| |
| @@ -4924,19 +4934,13 @@ static int __process_new_xattr(int num, |
| const char *name, int name_len, const char *data, |
| int data_len, void *ctx) |
| { |
| - int ret; |
| struct send_ctx *sctx = ctx; |
| - struct fs_path *p; |
| struct posix_acl_xattr_header dummy_acl; |
| |
| /* Capabilities are emitted by finish_inode_if_needed */ |
| if (!strncmp(name, XATTR_NAME_CAPS, name_len)) |
| return 0; |
| |
| - p = fs_path_alloc(); |
| - if (!p) |
| - return -ENOMEM; |
| - |
| /* |
| * This hack is needed because empty acls are stored as zero byte |
| * data in xattrs. Problem with that is, that receiving these zero byte |
| @@ -4953,15 +4957,7 @@ static int __process_new_xattr(int num, |
| } |
| } |
| |
| - ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen, p); |
| - if (ret < 0) |
| - goto out; |
| - |
| - ret = send_set_xattr(sctx, p, name, name_len, data, data_len); |
| - |
| -out: |
| - fs_path_free(p); |
| - return ret; |
| + return send_set_xattr(sctx, name, name_len, data, data_len); |
| } |
| |
| static int __process_deleted_xattr(int num, struct btrfs_key *di_key, |
| @@ -5831,7 +5827,6 @@ static int send_extent_data(struct send_ |
| */ |
| static int send_capabilities(struct send_ctx *sctx) |
| { |
| - struct fs_path *fspath = NULL; |
| struct btrfs_path *path; |
| struct btrfs_dir_item *di; |
| struct extent_buffer *leaf; |
| @@ -5857,25 +5852,19 @@ static int send_capabilities(struct send |
| leaf = path->nodes[0]; |
| buf_len = btrfs_dir_data_len(leaf, di); |
| |
| - fspath = fs_path_alloc(); |
| buf = kmalloc(buf_len, GFP_KERNEL); |
| - if (!fspath || !buf) { |
| + if (!buf) { |
| ret = -ENOMEM; |
| goto out; |
| } |
| |
| - ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen, fspath); |
| - if (ret < 0) |
| - goto out; |
| - |
| data_ptr = (unsigned long)(di + 1) + btrfs_dir_name_len(leaf, di); |
| read_extent_buffer(leaf, buf, data_ptr, buf_len); |
| |
| - ret = send_set_xattr(sctx, fspath, XATTR_NAME_CAPS, |
| + ret = send_set_xattr(sctx, XATTR_NAME_CAPS, |
| strlen(XATTR_NAME_CAPS), buf, buf_len); |
| out: |
| kfree(buf); |
| - fs_path_free(fspath); |
| btrfs_free_path(path); |
| return ret; |
| } |