xfs: disaggregate xfs_ioctl_setattr
authorDave Chinner <dchinner@redhat.com>
Sun, 1 Feb 2015 23:15:56 +0000 (10:15 +1100)
committerDave Chinner <david@fromorbit.com>
Sun, 1 Feb 2015 23:15:56 +0000 (10:15 +1100)
xfs_ioctl_setxflags doesn't need all of the functionailty in
xfs_ioctl_setattr() and now we have separate helper functions that
share the checks and modifications that xfs_ioctl_setxflags
requires. Hence disaggregate it from xfs_ioctl_setattr() to allow
further work to be done on xfs_ioctl_setattr.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_ioctl.c

index 0f62f5b3e221b04c4a8734d44a9d9d0666998a63..383e61f514f709417d4d3b621546b11c8849045f 100644 (file)
@@ -1324,14 +1324,14 @@ xfs_ioc_getxflags(
 
 STATIC int
 xfs_ioc_setxflags(
-       xfs_inode_t             *ip,
+       struct xfs_inode        *ip,
        struct file             *filp,
        void                    __user *arg)
 {
+       struct xfs_trans        *tp;
        struct fsxattr          fa;
        unsigned int            flags;
-       unsigned int            mask;
-       int error;
+       int                     error;
 
        if (copy_from_user(&flags, arg, sizeof(flags)))
                return -EFAULT;
@@ -1341,13 +1341,26 @@ xfs_ioc_setxflags(
                      FS_SYNC_FL))
                return -EOPNOTSUPP;
 
-       mask = FSX_XFLAGS;
        fa.fsx_xflags = xfs_merge_ioc_xflags(flags, xfs_ip2xflags(ip));
 
        error = mnt_want_write_file(filp);
        if (error)
                return error;
-       error = xfs_ioctl_setattr(ip, &fa, mask);
+
+       tp = xfs_ioctl_setattr_get_trans(ip);
+       if (IS_ERR(tp)) {
+               error = PTR_ERR(tp);
+               goto out_drop_write;
+       }
+
+       error = xfs_ioctl_setattr_xflags(tp, ip, &fa);
+       if (error) {
+               xfs_trans_cancel(tp, 0);
+               goto out_drop_write;
+       }
+
+       error = xfs_trans_commit(tp, 0);
+out_drop_write:
        mnt_drop_write_file(filp);
        return error;
 }