linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / fs / xfs / linux-2.6 / xfs_ioctl.c
index 4bbd092..bff7f6d 100644 (file)
@@ -23,6 +23,7 @@
 #include "xfs_trans.h"
 #include "xfs_sb.h"
 #include "xfs_ag.h"
+#include "xfs_dir.h"
 #include "xfs_dir2.h"
 #include "xfs_alloc.h"
 #include "xfs_dmapi.h"
@@ -30,6 +31,7 @@
 #include "xfs_bmap_btree.h"
 #include "xfs_alloc_btree.h"
 #include "xfs_ialloc_btree.h"
+#include "xfs_dir_sf.h"
 #include "xfs_attr_sf.h"
 #include "xfs_dir2_sf.h"
 #include "xfs_dinode.h"
@@ -76,7 +78,7 @@ xfs_find_handle(
        xfs_handle_t            handle;
        xfs_fsop_handlereq_t    hreq;
        struct inode            *inode;
-       bhv_vnode_t             *vp;
+       struct vnode            *vp;
 
        if (copy_from_user(&hreq, arg, sizeof(hreq)))
                return -XFS_ERROR(EFAULT);
@@ -136,7 +138,7 @@ xfs_find_handle(
        }
 
        /* we need the vnode */
-       vp = vn_from_inode(inode);
+       vp = LINVFS_GET_VP(inode);
 
        /* now we can grab the fsid */
        memcpy(&handle.ha_fsid, vp->v_vfsp->vfs_altfsid, sizeof(xfs_fsid_t));
@@ -190,7 +192,7 @@ xfs_vget_fsop_handlereq(
        xfs_mount_t             *mp,
        struct inode            *parinode,      /* parent inode pointer    */
        xfs_fsop_handlereq_t    *hreq,
-       bhv_vnode_t             **vp,
+       vnode_t                 **vp,
        struct inode            **inode)
 {
        void                    __user *hanp;
@@ -200,7 +202,7 @@ xfs_vget_fsop_handlereq(
        xfs_handle_t            handle;
        xfs_inode_t             *ip;
        struct inode            *inodep;
-       bhv_vnode_t             *vpp;
+       vnode_t                 *vpp;
        xfs_ino_t               ino;
        __u32                   igen;
        int                     error;
@@ -254,7 +256,7 @@ xfs_vget_fsop_handlereq(
        }
 
        vpp = XFS_ITOV(ip);
-       inodep = vn_to_inode(vpp);
+       inodep = LINVFS_GET_IP(vpp);
        xfs_iunlock(ip, XFS_ILOCK_SHARED);
 
        *vp = vpp;
@@ -275,7 +277,7 @@ xfs_open_by_handle(
        struct file             *filp;
        struct inode            *inode;
        struct dentry           *dentry;
-       bhv_vnode_t             *vp;
+       vnode_t                 *vp;
        xfs_fsop_handlereq_t    hreq;
 
        if (!capable(CAP_SYS_ADMIN))
@@ -342,7 +344,7 @@ xfs_open_by_handle(
                return -XFS_ERROR(-PTR_ERR(filp));
        }
        if (inode->i_mode & S_IFREG)
-               filp->f_op = &xfs_invis_file_operations;
+               filp->f_op = &linvfs_invis_file_operations;
 
        fd_install(new_fd, filp);
        return new_fd;
@@ -360,7 +362,7 @@ xfs_readlink_by_handle(
        struct uio              auio;
        struct inode            *inode;
        xfs_fsop_handlereq_t    hreq;
-       bhv_vnode_t             *vp;
+       vnode_t                 *vp;
        __u32                   olen;
 
        if (!capable(CAP_SYS_ADMIN))
@@ -391,11 +393,9 @@ xfs_readlink_by_handle(
        auio.uio_segflg = UIO_USERSPACE;
        auio.uio_resid  = olen;
 
-       error = bhv_vop_readlink(vp, &auio, IO_INVIS, NULL);
-       VN_RELE(vp);
-       if (error)
-               return -error;
+       VOP_READLINK(vp, &auio, IO_INVIS, NULL, error);
 
+       VN_RELE(vp);
        return (olen - auio.uio_resid);
 }
 
@@ -411,7 +411,7 @@ xfs_fssetdm_by_handle(
        xfs_fsop_setdm_handlereq_t dmhreq;
        struct inode            *inode;
        bhv_desc_t              *bdp;
-       bhv_vnode_t             *vp;
+       vnode_t                 *vp;
 
        if (!capable(CAP_MKNOD))
                return -XFS_ERROR(EPERM);
@@ -452,7 +452,7 @@ xfs_attrlist_by_handle(
        attrlist_cursor_kern_t  *cursor;
        xfs_fsop_attrlist_handlereq_t al_hreq;
        struct inode            *inode;
-       bhv_vnode_t             *vp;
+       vnode_t                 *vp;
        char                    *kbuf;
 
        if (!capable(CAP_SYS_ADMIN))
@@ -472,8 +472,8 @@ xfs_attrlist_by_handle(
                goto out_vn_rele;
 
        cursor = (attrlist_cursor_kern_t *)&al_hreq.pos;
-       error = bhv_vop_attr_list(vp, kbuf, al_hreq.buflen, al_hreq.flags,
-                                       cursor, NULL);
+       VOP_ATTR_LIST(vp, kbuf, al_hreq.buflen, al_hreq.flags,
+                       cursor, NULL, error);
        if (error)
                goto out_kfree;
 
@@ -490,7 +490,7 @@ xfs_attrlist_by_handle(
 
 STATIC int
 xfs_attrmulti_attr_get(
-       bhv_vnode_t             *vp,
+       struct vnode            *vp,
        char                    *name,
        char                    __user *ubuf,
        __uint32_t              *len,
@@ -505,7 +505,7 @@ xfs_attrmulti_attr_get(
        if (!kbuf)
                return ENOMEM;
 
-       error = bhv_vop_attr_get(vp, name, kbuf, len, flags, NULL);
+       VOP_ATTR_GET(vp, name, kbuf, len, flags, NULL, error);
        if (error)
                goto out_kfree;
 
@@ -519,7 +519,7 @@ xfs_attrmulti_attr_get(
 
 STATIC int
 xfs_attrmulti_attr_set(
-       bhv_vnode_t             *vp,
+       struct vnode            *vp,
        char                    *name,
        const char              __user *ubuf,
        __uint32_t              len,
@@ -542,7 +542,7 @@ xfs_attrmulti_attr_set(
        if (copy_from_user(kbuf, ubuf, len))
                goto out_kfree;
                        
-       error = bhv_vop_attr_set(vp, name, kbuf, len, flags, NULL);
+       VOP_ATTR_SET(vp, name, kbuf, len, flags, NULL, error);
 
  out_kfree:
        kfree(kbuf);
@@ -551,15 +551,20 @@ xfs_attrmulti_attr_set(
 
 STATIC int
 xfs_attrmulti_attr_remove(
-       bhv_vnode_t             *vp,
+       struct vnode            *vp,
        char                    *name,
        __uint32_t              flags)
 {
+       int                     error;
+
+
        if (IS_RDONLY(&vp->v_inode))
                return -EROFS;
        if (IS_IMMUTABLE(&vp->v_inode) || IS_APPEND(&vp->v_inode))
                return EPERM;
-       return bhv_vop_attr_remove(vp, name, flags, NULL);
+
+       VOP_ATTR_REMOVE(vp, name, flags, NULL, error);
+       return error;
 }
 
 STATIC int
@@ -573,7 +578,7 @@ xfs_attrmulti_by_handle(
        xfs_attr_multiop_t      *ops;
        xfs_fsop_attrmulti_handlereq_t am_hreq;
        struct inode            *inode;
-       bhv_vnode_t             *vp;
+       vnode_t                 *vp;
        unsigned int            i, size;
        char                    *attr_name;
 
@@ -653,7 +658,7 @@ xfs_attrmulti_by_handle(
 STATIC int
 xfs_ioc_space(
        bhv_desc_t              *bdp,
-       bhv_vnode_t             *vp,
+       vnode_t                 *vp,
        struct file             *filp,
        int                     flags,
        unsigned int            cmd,
@@ -677,7 +682,7 @@ xfs_ioc_fsgeometry(
 
 STATIC int
 xfs_ioc_xattr(
-       bhv_vnode_t             *vp,
+       vnode_t                 *vp,
        xfs_inode_t             *ip,
        struct file             *filp,
        unsigned int            cmd,
@@ -706,11 +711,11 @@ xfs_ioctl(
        void                    __user *arg)
 {
        int                     error;
-       bhv_vnode_t             *vp;
+       vnode_t                 *vp;
        xfs_inode_t             *ip;
        xfs_mount_t             *mp;
 
-       vp = vn_from_inode(inode);
+       vp = LINVFS_GET_VP(inode);
 
        vn_trace_entry(vp, "xfs_ioctl", (inst_t *)__return_address);
 
@@ -957,7 +962,7 @@ xfs_ioctl(
 STATIC int
 xfs_ioc_space(
        bhv_desc_t              *bdp,
-       bhv_vnode_t             *vp,
+       vnode_t                 *vp,
        struct file             *filp,
        int                     ioflags,
        unsigned int            cmd,
@@ -1154,136 +1159,112 @@ xfs_di2lxflags(
 
 STATIC int
 xfs_ioc_xattr(
-       bhv_vnode_t             *vp,
+       vnode_t                 *vp,
        xfs_inode_t             *ip,
        struct file             *filp,
        unsigned int            cmd,
        void                    __user *arg)
 {
        struct fsxattr          fa;
-       struct bhv_vattr        *vattr;
-       int                     error = 0;
+       vattr_t                 va;
+       int                     error;
        int                     attr_flags;
        unsigned int            flags;
 
-       vattr = kmalloc(sizeof(*vattr), GFP_KERNEL);
-       if (unlikely(!vattr))
-               return -ENOMEM;
-
        switch (cmd) {
        case XFS_IOC_FSGETXATTR: {
-               vattr->va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | \
-                                XFS_AT_NEXTENTS | XFS_AT_PROJID;
-               error = bhv_vop_getattr(vp, vattr, 0, NULL);
-               if (unlikely(error)) {
-                       error = -error;
-                       break;
-               }
+               va.va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | \
+                            XFS_AT_NEXTENTS | XFS_AT_PROJID;
+               VOP_GETATTR(vp, &va, 0, NULL, error);
+               if (error)
+                       return -error;
 
-               fa.fsx_xflags   = vattr->va_xflags;
-               fa.fsx_extsize  = vattr->va_extsize;
-               fa.fsx_nextents = vattr->va_nextents;
-               fa.fsx_projid   = vattr->va_projid;
+               fa.fsx_xflags   = va.va_xflags;
+               fa.fsx_extsize  = va.va_extsize;
+               fa.fsx_nextents = va.va_nextents;
+               fa.fsx_projid   = va.va_projid;
 
-               if (copy_to_user(arg, &fa, sizeof(fa))) {
-                       error = -EFAULT;
-                       break;
-               }
-               break;
+               if (copy_to_user(arg, &fa, sizeof(fa)))
+                       return -XFS_ERROR(EFAULT);
+               return 0;
        }
 
        case XFS_IOC_FSSETXATTR: {
-               if (copy_from_user(&fa, arg, sizeof(fa))) {
-                       error = -EFAULT;
-                       break;
-               }
+               if (copy_from_user(&fa, arg, sizeof(fa)))
+                       return -XFS_ERROR(EFAULT);
 
                attr_flags = 0;
                if (filp->f_flags & (O_NDELAY|O_NONBLOCK))
                        attr_flags |= ATTR_NONBLOCK;
 
-               vattr->va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | XFS_AT_PROJID;
-               vattr->va_xflags  = fa.fsx_xflags;
-               vattr->va_extsize = fa.fsx_extsize;
-               vattr->va_projid  = fa.fsx_projid;
+               va.va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | XFS_AT_PROJID;
+               va.va_xflags  = fa.fsx_xflags;
+               va.va_extsize = fa.fsx_extsize;
+               va.va_projid  = fa.fsx_projid;
 
-               error = bhv_vop_setattr(vp, vattr, attr_flags, NULL);
-               if (likely(!error))
-                       __vn_revalidate(vp, vattr);     /* update flags */
-               error = -error;
-               break;
+               VOP_SETATTR(vp, &va, attr_flags, NULL, error);
+               if (!error)
+                       vn_revalidate(vp);      /* update Linux inode flags */
+               return -error;
        }
 
        case XFS_IOC_FSGETXATTRA: {
-               vattr->va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | \
-                                XFS_AT_ANEXTENTS | XFS_AT_PROJID;
-               error = bhv_vop_getattr(vp, vattr, 0, NULL);
-               if (unlikely(error)) {
-                       error = -error;
-                       break;
-               }
+               va.va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | \
+                            XFS_AT_ANEXTENTS | XFS_AT_PROJID;
+               VOP_GETATTR(vp, &va, 0, NULL, error);
+               if (error)
+                       return -error;
 
-               fa.fsx_xflags   = vattr->va_xflags;
-               fa.fsx_extsize  = vattr->va_extsize;
-               fa.fsx_nextents = vattr->va_anextents;
-               fa.fsx_projid   = vattr->va_projid;
+               fa.fsx_xflags   = va.va_xflags;
+               fa.fsx_extsize  = va.va_extsize;
+               fa.fsx_nextents = va.va_anextents;
+               fa.fsx_projid   = va.va_projid;
 
-               if (copy_to_user(arg, &fa, sizeof(fa))) {
-                       error = -EFAULT;
-                       break;
-               }
-               break;
+               if (copy_to_user(arg, &fa, sizeof(fa)))
+                       return -XFS_ERROR(EFAULT);
+               return 0;
        }
 
        case XFS_IOC_GETXFLAGS: {
                flags = xfs_di2lxflags(ip->i_d.di_flags);
                if (copy_to_user(arg, &flags, sizeof(flags)))
-                       error = -EFAULT;
-               break;
+                       return -XFS_ERROR(EFAULT);
+               return 0;
        }
 
        case XFS_IOC_SETXFLAGS: {
-               if (copy_from_user(&flags, arg, sizeof(flags))) {
-                       error = -EFAULT;
-                       break;
-               }
+               if (copy_from_user(&flags, arg, sizeof(flags)))
+                       return -XFS_ERROR(EFAULT);
 
                if (flags & ~(LINUX_XFLAG_IMMUTABLE | LINUX_XFLAG_APPEND | \
                              LINUX_XFLAG_NOATIME | LINUX_XFLAG_NODUMP | \
-                             LINUX_XFLAG_SYNC)) {
-                       error = -EOPNOTSUPP;
-                       break;
-               }
+                             LINUX_XFLAG_SYNC))
+                       return -XFS_ERROR(EOPNOTSUPP);
 
                attr_flags = 0;
                if (filp->f_flags & (O_NDELAY|O_NONBLOCK))
                        attr_flags |= ATTR_NONBLOCK;
 
-               vattr->va_mask = XFS_AT_XFLAGS;
-               vattr->va_xflags = xfs_merge_ioc_xflags(flags,
-                                                       xfs_ip2xflags(ip));
+               va.va_mask = XFS_AT_XFLAGS;
+               va.va_xflags = xfs_merge_ioc_xflags(flags,
+                               xfs_ip2xflags(ip));
 
-               error = bhv_vop_setattr(vp, vattr, attr_flags, NULL);
-               if (likely(!error))
-                       __vn_revalidate(vp, vattr);     /* update flags */
-               error = -error;
-               break;
+               VOP_SETATTR(vp, &va, attr_flags, NULL, error);
+               if (!error)
+                       vn_revalidate(vp);      /* update Linux inode flags */
+               return -error;
        }
 
        case XFS_IOC_GETVERSION: {
-               flags = vn_to_inode(vp)->i_generation;
+               flags = LINVFS_GET_IP(vp)->i_generation;
                if (copy_to_user(arg, &flags, sizeof(flags)))
-                       error = -EFAULT;
-               break;
+                       return -XFS_ERROR(EFAULT);
+               return 0;
        }
 
        default:
-               error = -ENOTTY;
-               break;
+               return -ENOTTY;
        }
-
-       kfree(vattr);
-       return error;
 }
 
 STATIC int