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

Christoph Hellwig
2020-01-14T08:15:26Z

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(
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