]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: send: factor out common logic when sending xattrs
authorFilipe Manana <fdmanana@suse.com>
Tue, 19 Aug 2025 02:15:55 +0000 (22:15 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:31:04 +0000 (16:31 +0200)
[ 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

index c843b4aefb8ac2f89660d036938eec1a1be960cd..464c37c2b33dadcc70c31ad94cdaded4779f8440 100644 (file)
@@ -4878,11 +4878,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)
@@ -4896,6 +4904,8 @@ static int send_set_xattr(struct send_ctx *sctx,
 
 tlv_put_failure:
 out:
+       fs_path_free(path);
+
        return ret;
 }
 
@@ -4923,19 +4933,13 @@ static int __process_new_xattr(int num, struct btrfs_key *di_key,
                               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
@@ -4952,15 +4956,7 @@ static int __process_new_xattr(int num, struct btrfs_key *di_key,
                }
        }
 
-       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,
@@ -5836,7 +5832,6 @@ static int send_extent_data(struct send_ctx *sctx, struct btrfs_path *path,
  */
 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;
@@ -5862,25 +5857,19 @@ static int send_capabilities(struct send_ctx *sctx)
        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;
 }