xfs: remove XFS_IOC_FSSETDM and XFS_IOC_FSSETDM_BY_HANDLE
[linux-2.6-microblaze.git] / fs / xfs / xfs_ioctl.c
index d58f0d6..7b35d62 100644 (file)
@@ -33,6 +33,8 @@
 #include "xfs_sb.h"
 #include "xfs_ag.h"
 #include "xfs_health.h"
+#include "xfs_reflink.h"
+#include "xfs_ioctl.h"
 
 #include <linux/mount.h>
 #include <linux/namei.h>
@@ -290,82 +292,6 @@ xfs_readlink_by_handle(
        return error;
 }
 
-int
-xfs_set_dmattrs(
-       xfs_inode_t     *ip,
-       uint            evmask,
-       uint16_t        state)
-{
-       xfs_mount_t     *mp = ip->i_mount;
-       xfs_trans_t     *tp;
-       int             error;
-
-       if (!capable(CAP_SYS_ADMIN))
-               return -EPERM;
-
-       if (XFS_FORCED_SHUTDOWN(mp))
-               return -EIO;
-
-       error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp);
-       if (error)
-               return error;
-
-       xfs_ilock(ip, XFS_ILOCK_EXCL);
-       xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
-
-       ip->i_d.di_dmevmask = evmask;
-       ip->i_d.di_dmstate  = state;
-
-       xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
-       error = xfs_trans_commit(tp);
-
-       return error;
-}
-
-STATIC int
-xfs_fssetdm_by_handle(
-       struct file             *parfilp,
-       void                    __user *arg)
-{
-       int                     error;
-       struct fsdmidata        fsd;
-       xfs_fsop_setdm_handlereq_t dmhreq;
-       struct dentry           *dentry;
-
-       if (!capable(CAP_MKNOD))
-               return -EPERM;
-       if (copy_from_user(&dmhreq, arg, sizeof(xfs_fsop_setdm_handlereq_t)))
-               return -EFAULT;
-
-       error = mnt_want_write_file(parfilp);
-       if (error)
-               return error;
-
-       dentry = xfs_handlereq_to_dentry(parfilp, &dmhreq.hreq);
-       if (IS_ERR(dentry)) {
-               mnt_drop_write_file(parfilp);
-               return PTR_ERR(dentry);
-       }
-
-       if (IS_IMMUTABLE(d_inode(dentry)) || IS_APPEND(d_inode(dentry))) {
-               error = -EPERM;
-               goto out;
-       }
-
-       if (copy_from_user(&fsd, dmhreq.data, sizeof(fsd))) {
-               error = -EFAULT;
-               goto out;
-       }
-
-       error = xfs_set_dmattrs(XFS_I(d_inode(dentry)), fsd.fsd_dmevmask,
-                                fsd.fsd_dmstate);
-
- out:
-       mnt_drop_write_file(parfilp);
-       dput(dentry);
-       return error;
-}
-
 STATIC int
 xfs_attrlist_by_handle(
        struct file             *parfilp,
@@ -588,13 +514,12 @@ xfs_attrmulti_by_handle(
 int
 xfs_ioc_space(
        struct file             *filp,
-       unsigned int            cmd,
        xfs_flock64_t           *bf)
 {
        struct inode            *inode = file_inode(filp);
        struct xfs_inode        *ip = XFS_I(inode);
        struct iattr            iattr;
-       enum xfs_prealloc_flags flags = 0;
+       enum xfs_prealloc_flags flags = XFS_PREALLOC_CLEAR;
        uint                    iolock = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL;
        int                     error;
 
@@ -607,6 +532,9 @@ xfs_ioc_space(
        if (!S_ISREG(inode->i_mode))
                return -EINVAL;
 
+       if (xfs_is_always_cow_inode(ip))
+               return -EOPNOTSUPP;
+
        if (filp->f_flags & O_DSYNC)
                flags |= XFS_PREALLOC_SYNC;
        if (filp->f_mode & FMODE_NOCMTIME)
@@ -620,6 +548,7 @@ xfs_ioc_space(
        error = xfs_break_layouts(inode, &iolock, BREAK_UNMAP);
        if (error)
                goto out_unlock;
+       inode_dio_wait(inode);
 
        switch (bf->l_whence) {
        case 0: /*SEEK_SET*/
@@ -635,73 +564,21 @@ xfs_ioc_space(
                goto out_unlock;
        }
 
-       /*
-        * length of <= 0 for resv/unresv/zero is invalid.  length for
-        * alloc/free is ignored completely and we have no idea what userspace
-        * might have set it to, so set it to zero to allow range
-        * checks to pass.
-        */
-       switch (cmd) {
-       case XFS_IOC_ZERO_RANGE:
-       case XFS_IOC_RESVSP:
-       case XFS_IOC_RESVSP64:
-       case XFS_IOC_UNRESVSP:
-       case XFS_IOC_UNRESVSP64:
-               if (bf->l_len <= 0) {
-                       error = -EINVAL;
-                       goto out_unlock;
-               }
-               break;
-       default:
-               bf->l_len = 0;
-               break;
-       }
-
-       if (bf->l_start < 0 ||
-           bf->l_start > inode->i_sb->s_maxbytes ||
-           bf->l_start + bf->l_len < 0 ||
-           bf->l_start + bf->l_len >= inode->i_sb->s_maxbytes) {
+       if (bf->l_start < 0 || bf->l_start > inode->i_sb->s_maxbytes) {
                error = -EINVAL;
                goto out_unlock;
        }
 
-       switch (cmd) {
-       case XFS_IOC_ZERO_RANGE:
-               flags |= XFS_PREALLOC_SET;
-               error = xfs_zero_file_space(ip, bf->l_start, bf->l_len);
-               break;
-       case XFS_IOC_RESVSP:
-       case XFS_IOC_RESVSP64:
-               flags |= XFS_PREALLOC_SET;
-               error = xfs_alloc_file_space(ip, bf->l_start, bf->l_len,
-                                               XFS_BMAPI_PREALLOC);
-               break;
-       case XFS_IOC_UNRESVSP:
-       case XFS_IOC_UNRESVSP64:
-               error = xfs_free_file_space(ip, bf->l_start, bf->l_len);
-               break;
-       case XFS_IOC_ALLOCSP:
-       case XFS_IOC_ALLOCSP64:
-       case XFS_IOC_FREESP:
-       case XFS_IOC_FREESP64:
-               flags |= XFS_PREALLOC_CLEAR;
-               if (bf->l_start > XFS_ISIZE(ip)) {
-                       error = xfs_alloc_file_space(ip, XFS_ISIZE(ip),
-                                       bf->l_start - XFS_ISIZE(ip), 0);
-                       if (error)
-                               goto out_unlock;
-               }
-
-               iattr.ia_valid = ATTR_SIZE;
-               iattr.ia_size = bf->l_start;
-
-               error = xfs_vn_setattr_size(file_dentry(filp), &iattr);
-               break;
-       default:
-               ASSERT(0);
-               error = -EINVAL;
+       if (bf->l_start > XFS_ISIZE(ip)) {
+               error = xfs_alloc_file_space(ip, XFS_ISIZE(ip),
+                               bf->l_start - XFS_ISIZE(ip), 0);
+               if (error)
+                       goto out_unlock;
        }
 
+       iattr.ia_valid = ATTR_SIZE;
+       iattr.ia_size = bf->l_start;
+       error = xfs_vn_setattr_size(file_dentry(filp), &iattr);
        if (error)
                goto out_unlock;
 
@@ -1116,7 +993,7 @@ xfs_fill_fsxattr(
        fa->fsx_extsize = ip->i_d.di_extsize << ip->i_mount->m_sb.sb_blocklog;
        fa->fsx_cowextsize = ip->i_d.di_cowextsize <<
                        ip->i_mount->m_sb.sb_blocklog;
-       fa->fsx_projid = xfs_get_projid(ip);
+       fa->fsx_projid = ip->i_d.di_projid;
 
        if (attr) {
                if (ip->i_afp) {
@@ -1311,10 +1188,9 @@ xfs_ioctl_setattr_dax_invalidate(
         * have to check the device for dax support or flush pagecache.
         */
        if (fa->fsx_xflags & FS_XFLAG_DAX) {
-               if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
-                       return -EINVAL;
-               if (!bdev_dax_supported(xfs_find_bdev_for_inode(VFS_I(ip)),
-                               sb->s_blocksize))
+               struct xfs_buftarg      *target = xfs_inode_buftarg(ip);
+
+               if (!bdev_dax_supported(target->bt_bdev, sb->s_blocksize))
                        return -EINVAL;
        }
 
@@ -1569,7 +1445,7 @@ xfs_ioctl_setattr(
        }
 
        if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp) &&
-           xfs_get_projid(ip) != fa->fsx_projid) {
+           ip->i_d.di_projid != fa->fsx_projid) {
                code = xfs_qm_vop_chown_reserve(tp, ip, udqp, NULL, pdqp,
                                capable(CAP_FOWNER) ?  XFS_QMOPT_FORCE_RES : 0);
                if (code)       /* out of quota */
@@ -1606,13 +1482,13 @@ xfs_ioctl_setattr(
                VFS_I(ip)->i_mode &= ~(S_ISUID|S_ISGID);
 
        /* Change the ownerships and register project quota modifications */
-       if (xfs_get_projid(ip) != fa->fsx_projid) {
+       if (ip->i_d.di_projid != fa->fsx_projid) {
                if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp)) {
                        olddquot = xfs_qm_vop_chown(tp, ip,
                                                &ip->i_pdquot, pdqp);
                }
                ASSERT(ip->i_d.di_version > 1);
-               xfs_set_projid(ip, fa->fsx_projid);
+               ip->i_d.di_projid = fa->fsx_projid;
        }
 
        /*
@@ -2122,24 +1998,17 @@ xfs_file_ioctl(
                return xfs_ioc_setlabel(filp, mp, arg);
        case XFS_IOC_ALLOCSP:
        case XFS_IOC_FREESP:
-       case XFS_IOC_RESVSP:
-       case XFS_IOC_UNRESVSP:
        case XFS_IOC_ALLOCSP64:
-       case XFS_IOC_FREESP64:
-       case XFS_IOC_RESVSP64:
-       case XFS_IOC_UNRESVSP64:
-       case XFS_IOC_ZERO_RANGE: {
+       case XFS_IOC_FREESP64: {
                xfs_flock64_t           bf;
 
                if (copy_from_user(&bf, arg, sizeof(bf)))
                        return -EFAULT;
-               return xfs_ioc_space(filp, cmd, &bf);
+               return xfs_ioc_space(filp, &bf);
        }
        case XFS_IOC_DIOINFO: {
-               struct dioattr  da;
-               xfs_buftarg_t   *target =
-                       XFS_IS_REALTIME_INODE(ip) ?
-                       mp->m_rtdev_targp : mp->m_ddev_targp;
+               struct xfs_buftarg      *target = xfs_inode_buftarg(ip);
+               struct dioattr          da;
 
                da.d_mem =  da.d_miniosz = target->bt_logical_sectorsize;
                da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1);
@@ -2183,22 +2052,6 @@ xfs_file_ioctl(
        case XFS_IOC_SETXFLAGS:
                return xfs_ioc_setxflags(ip, filp, arg);
 
-       case XFS_IOC_FSSETDM: {
-               struct fsdmidata        dmi;
-
-               if (copy_from_user(&dmi, arg, sizeof(dmi)))
-                       return -EFAULT;
-
-               error = mnt_want_write_file(filp);
-               if (error)
-                       return error;
-
-               error = xfs_set_dmattrs(ip, dmi.fsd_dmevmask,
-                               dmi.fsd_dmstate);
-               mnt_drop_write_file(filp);
-               return error;
-       }
-
        case XFS_IOC_GETBMAP:
        case XFS_IOC_GETBMAPA:
        case XFS_IOC_GETBMAPX:
@@ -2226,8 +2079,6 @@ xfs_file_ioctl(
                        return -EFAULT;
                return xfs_open_by_handle(filp, &hreq);
        }
-       case XFS_IOC_FSSETDM_BY_HANDLE:
-               return xfs_fssetdm_by_handle(filp, arg);
 
        case XFS_IOC_READLINK_BY_HANDLE: {
                xfs_fsop_handlereq_t    hreq;