Re: [PATCH 03/29] xfs: merge xfs_attrmulti_attr_remove into xfs_attrmulti_attr_set

Darrick J. Wong
2020-01-21T17:43:58Z

On Tue, Jan 14, 2020 at 09:10:25AM +0100, Christoph Hellwig wrote:
> Merge the ioctl handlers just like the low-level xfs_attr_set function.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> fs/xfs/xfs_ioctl.c | 34 ++++++++++------------------------
> fs/xfs/xfs_ioctl.h | 6 ------
> fs/xfs/xfs_ioctl32.c | 4 ++--
> 3 files changed, 12 insertions(+), 32 deletions(-)
>
> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
> index 8e35887f62fa..6bd0684a3528 100644
> --- a/fs/xfs/xfs_ioctl.c
> +++ b/fs/xfs/xfs_ioctl.c
> @@ -387,18 +387,20 @@ xfs_attrmulti_attr_set(

Does /any/ of this have a testcase? I couldn't find anywhere that uses
attrmulti, not even xfsdump.

Granted it's a straight conversion of code so AFAICT it won't be any
more broken than it probably already is <cough>...

Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

--D

> uint32_t len,
> uint32_t flags)
> {
> - unsigned char *kbuf;
> + unsigned char *kbuf = NULL;
> int error;
> size_t namelen;
>
> if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
> return -EPERM;
> - if (len > XFS_XATTR_SIZE_MAX)
> - return -EINVAL;
>
> - kbuf = memdup_user(ubuf, len);
> - if (IS_ERR(kbuf))
> - return PTR_ERR(kbuf);
> + if (ubuf) {
> + if (len > XFS_XATTR_SIZE_MAX)
> + return -EINVAL;
> + kbuf = memdup_user(ubuf, len);
> + if (IS_ERR(kbuf))
> + return PTR_ERR(kbuf);
> + }
>
> namelen = strlen(name);
> error = xfs_attr_set(XFS_I(inode), name, namelen, kbuf, len, flags);
> @@ -408,22 +410,6 @@ xfs_attrmulti_attr_set(
> return error;
> }
>
> -int
> -xfs_attrmulti_attr_remove(
> - struct inode *inode,
> - unsigned char *name,
> - uint32_t flags)
> -{
> - int error;
> -
> - if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
> - return -EPERM;
> - error = xfs_attr_set(XFS_I(inode), name, strlen(name), NULL, 0, flags);
> - if (!error)
> - xfs_forget_acl(inode, name, flags);
> - return error;
> -}
> -
> STATIC int
> xfs_attrmulti_by_handle(
> struct file *parfilp,
> @@ -502,8 +488,8 @@ xfs_attrmulti_by_handle(
> ops[i].am_error = mnt_want_write_file(parfilp);
> if (ops[i].am_error)
> break;
> - ops[i].am_error = xfs_attrmulti_attr_remove(
> - d_inode(dentry), attr_name,
> + ops[i].am_error = xfs_attrmulti_attr_set(
> + d_inode(dentry), attr_name, NULL, 0,
> ops[i].am_flags);
> mnt_drop_write_file(parfilp);
> break;
> diff --git a/fs/xfs/xfs_ioctl.h b/fs/xfs/xfs_ioctl.h
> index 420bd95dc326..819504df00ae 100644
> --- a/fs/xfs/xfs_ioctl.h
> +++ b/fs/xfs/xfs_ioctl.h
> @@ -46,12 +46,6 @@ xfs_attrmulti_attr_set(
> uint32_t len,
> uint32_t flags);
>
> -extern int
> -xfs_attrmulti_attr_remove(
> - struct inode *inode,
> - unsigned char *name,
> - uint32_t flags);
> -
> extern struct dentry *
> xfs_handle_to_dentry(
> struct file *parfilp,
> diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c
> index 769581a79c58..1092c66e48d6 100644
> --- a/fs/xfs/xfs_ioctl32.c
> +++ b/fs/xfs/xfs_ioctl32.c
> @@ -486,8 +486,8 @@ xfs_compat_attrmulti_by_handle(
> ops[i].am_error = mnt_want_write_file(parfilp);
> if (ops[i].am_error)
> break;
> - ops[i].am_error = xfs_attrmulti_attr_remove(
> - d_inode(dentry), attr_name,
> + ops[i].am_error = xfs_attrmulti_attr_set(
> + d_inode(dentry), attr_name, NULL, 0,
> ops[i].am_flags);
> mnt_drop_write_file(parfilp);
> break;
> --
> 2.24.1
>