xfs
[Top] [All Lists]

[PATCH] cleanup vnode useage in xfs_ioctl.c

To: xfs@xxxxxxxxxxx
Subject: [PATCH] cleanup vnode useage in xfs_ioctl.c
From: Christoph Hellwig <hch@xxxxxx>
Date: Tue, 28 Aug 2007 22:20:16 +0200
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Mutt/1.3.28i
Signed-off-by: Christoph Hellwig <hch@xxxxxx>

Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ioctl.c
===================================================================
--- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c     2007-08-25 
00:30:42.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ioctl.c  2007-08-25 00:37:33.000000000 
+0200
@@ -75,7 +75,6 @@ xfs_find_handle(
        xfs_handle_t            handle;
        xfs_fsop_handlereq_t    hreq;
        struct inode            *inode;
-       bhv_vnode_t             *vp;
 
        if (copy_from_user(&hreq, arg, sizeof(hreq)))
                return -XFS_ERROR(EFAULT);
@@ -134,21 +133,16 @@ xfs_find_handle(
                return -XFS_ERROR(EBADF);
        }
 
-       /* we need the vnode */
-       vp = vn_from_inode(inode);
-
        /* now we can grab the fsid */
        memcpy(&handle.ha_fsid, XFS_I(inode)->i_mount->m_fixedfsid,
                        sizeof(xfs_fsid_t));
        hsize = sizeof(xfs_fsid_t);
 
        if (cmd != XFS_IOC_PATH_TO_FSHANDLE) {
-               xfs_inode_t     *ip;
+               xfs_inode_t     *ip = XFS_I(inode);
                int             lock_mode;
 
                /* need to get access to the xfs_inode to read the generation */
-               ip = xfs_vtoi(vp);
-               ASSERT(ip);
                lock_mode = xfs_ilock_map_shared(ip);
 
                /* fill in fid section of handle from inode */
@@ -177,20 +171,18 @@ xfs_find_handle(
 
 /*
  * Convert userspace handle data into vnode (and inode).
- * We [ab]use the fact that all the fsop_handlereq ioctl calls
- * have a data structure argument whose first component is always
- * a xfs_fsop_handlereq_t, so we can cast to and from this type.
- * This allows us to optimise the copy_from_user calls and gives
- * a handy, shared routine.
  *
- * If no error, caller must always VN_RELE the returned vp.
+ * We use the fact that all the fsop_handlereq ioctl calls have a data
+ * structure argument whose first component is always a xfs_fsop_handlereq_t,
+ * so we can pass that sub structure into this handy, shared routine.
+ *
+ * If no error, caller must always iput the returned inode.
  */
 STATIC int
 xfs_vget_fsop_handlereq(
        xfs_mount_t             *mp,
        struct inode            *parinode,      /* parent inode pointer    */
        xfs_fsop_handlereq_t    *hreq,
-       bhv_vnode_t             **vp,
        struct inode            **inode)
 {
        void                    __user *hanp;
@@ -199,8 +191,6 @@ xfs_vget_fsop_handlereq(
        xfs_handle_t            *handlep;
        xfs_handle_t            handle;
        xfs_inode_t             *ip;
-       struct inode            *inodep;
-       bhv_vnode_t             *vpp;
        xfs_ino_t               ino;
        __u32                   igen;
        int                     error;
@@ -253,12 +243,9 @@ xfs_vget_fsop_handlereq(
                return XFS_ERROR(ENOENT);
        }
 
-       vpp = XFS_ITOV(ip);
-       inodep = vn_to_inode(vpp);
        xfs_iunlock(ip, XFS_ILOCK_SHARED);
 
-       *vp = vpp;
-       *inode = inodep;
+       *inode = ip->i_vnode;
        return 0;
 }
 
@@ -275,7 +262,6 @@ xfs_open_by_handle(
        struct file             *filp;
        struct inode            *inode;
        struct dentry           *dentry;
-       bhv_vnode_t             *vp;
        xfs_fsop_handlereq_t    hreq;
 
        if (!capable(CAP_SYS_ADMIN))
@@ -283,7 +269,7 @@ xfs_open_by_handle(
        if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
                return -XFS_ERROR(EFAULT);
 
-       error = xfs_vget_fsop_handlereq(mp, parinode, &hreq, &vp, &inode);
+       error = xfs_vget_fsop_handlereq(mp, parinode, &hreq, &inode);
        if (error)
                return -error;
 
@@ -385,7 +371,6 @@ xfs_readlink_by_handle(
 {
        struct inode            *inode;
        xfs_fsop_handlereq_t    hreq;
-       bhv_vnode_t             *vp;
        __u32                   olen;
        void                    *link;
        int                     error;
@@ -395,7 +380,7 @@ xfs_readlink_by_handle(
        if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
                return -XFS_ERROR(EFAULT);
 
-       error = xfs_vget_fsop_handlereq(mp, parinode, &hreq, &vp, &inode);
+       error = xfs_vget_fsop_handlereq(mp, parinode, &hreq, &inode);
        if (error)
                return -error;
 
@@ -438,34 +423,32 @@ xfs_fssetdm_by_handle(
        struct fsdmidata        fsd;
        xfs_fsop_setdm_handlereq_t dmhreq;
        struct inode            *inode;
-       bhv_vnode_t             *vp;
 
        if (!capable(CAP_MKNOD))
                return -XFS_ERROR(EPERM);
        if (copy_from_user(&dmhreq, arg, sizeof(xfs_fsop_setdm_handlereq_t)))
                return -XFS_ERROR(EFAULT);
 
-       error = xfs_vget_fsop_handlereq(mp, parinode, &dmhreq.hreq, &vp, 
&inode);
+       error = xfs_vget_fsop_handlereq(mp, parinode, &dmhreq.hreq, &inode);
        if (error)
                return -error;
 
        if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
-               VN_RELE(vp);
-               return -XFS_ERROR(EPERM);
+               error = -XFS_ERROR(EPERM);
+               goto out;
        }
 
        if (copy_from_user(&fsd, dmhreq.data, sizeof(fsd))) {
-               VN_RELE(vp);
-               return -XFS_ERROR(EFAULT);
+               error = -XFS_ERROR(EFAULT);
+               goto out;
        }
 
-       error = xfs_set_dmattrs(xfs_vtoi(vp),
-                       fsd.fsd_dmevmask, fsd.fsd_dmstate);
+       error = -xfs_set_dmattrs(XFS_I(inode), fsd.fsd_dmevmask,
+                                fsd.fsd_dmstate);
 
-       VN_RELE(vp);
-       if (error)
-               return -error;
-       return 0;
+ out:
+       iput(inode);
+       return error;
 }
 
 STATIC int
@@ -478,7 +461,6 @@ xfs_attrlist_by_handle(
        attrlist_cursor_kern_t  *cursor;
        xfs_fsop_attrlist_handlereq_t al_hreq;
        struct inode            *inode;
-       bhv_vnode_t             *vp;
        char                    *kbuf;
 
        if (!capable(CAP_SYS_ADMIN))
@@ -488,8 +470,7 @@ xfs_attrlist_by_handle(
        if (al_hreq.buflen > XATTR_LIST_MAX)
                return -XFS_ERROR(EINVAL);
 
-       error = xfs_vget_fsop_handlereq(mp, parinode, &al_hreq.hreq,
-                       &vp, &inode);
+       error = xfs_vget_fsop_handlereq(mp, parinode, &al_hreq.hreq, &inode);
        if (error)
                goto out;
 
@@ -509,7 +490,7 @@ xfs_attrlist_by_handle(
  out_kfree:
        kfree(kbuf);
  out_vn_rele:
-       VN_RELE(vp);
+       iput(inode);
  out:
        return -error;
 }
@@ -598,7 +579,6 @@ xfs_attrmulti_by_handle(
        xfs_attr_multiop_t      *ops;
        xfs_fsop_attrmulti_handlereq_t am_hreq;
        struct inode            *inode;
-       bhv_vnode_t             *vp;
        unsigned int            i, size;
        char                    *attr_name;
 
@@ -607,7 +587,7 @@ xfs_attrmulti_by_handle(
        if (copy_from_user(&am_hreq, arg, 
sizeof(xfs_fsop_attrmulti_handlereq_t)))
                return -XFS_ERROR(EFAULT);
 
-       error = xfs_vget_fsop_handlereq(mp, parinode, &am_hreq.hreq, &vp, 
&inode);
+       error = xfs_vget_fsop_handlereq(mp, parinode, &am_hreq.hreq, &inode);
        if (error)
                goto out;
 
@@ -666,7 +646,7 @@ xfs_attrmulti_by_handle(
  out_kfree_ops:
        kfree(ops);
  out_vn_rele:
-       VN_RELE(vp);
+       iput(inode);
  out:
        return -error;
 }
@@ -702,7 +682,6 @@ xfs_ioc_fsgeometry(
 
 STATIC int
 xfs_ioc_xattr(
-       bhv_vnode_t             *vp,
        xfs_inode_t             *ip,
        struct file             *filp,
        unsigned int            cmd,
@@ -729,7 +708,6 @@ xfs_ioctl(
        void                    __user *arg)
 {
        struct inode            *inode = filp->f_path.dentry->d_inode;
-       bhv_vnode_t             *vp = vn_from_inode(inode);
        xfs_mount_t             *mp = ip->i_mount;
        int                     error;
 
@@ -788,7 +766,7 @@ xfs_ioctl(
        case XFS_IOC_FSGETXATTR:
        case XFS_IOC_FSSETXATTR:
        case XFS_IOC_FSGETXATTRA:
-               return xfs_ioc_xattr(vp, ip, filp, cmd, arg);
+               return xfs_ioc_xattr(ip, filp, cmd, arg);
 
        case XFS_IOC_FSSETDM: {
                struct fsdmidata        dmi;
@@ -1163,7 +1141,6 @@ xfs_di2lxflags(
 
 STATIC int
 xfs_ioc_xattr(
-       bhv_vnode_t             *vp,
        xfs_inode_t             *ip,
        struct file             *filp,
        unsigned int            cmd,
@@ -1218,7 +1195,7 @@ xfs_ioc_xattr(
 
                error = xfs_setattr(ip, vattr, attr_flags, NULL);
                if (likely(!error))
-                       __vn_revalidate(vp, vattr);     /* update flags */
+                       __vn_revalidate(XFS_ITOV(ip), vattr);   /* update flags 
*/
                error = -error;
                break;
        }
@@ -1274,7 +1251,7 @@ xfs_ioc_xattr(
 
                error = xfs_setattr(ip, vattr, attr_flags, NULL);
                if (likely(!error))
-                       __vn_revalidate(vp, vattr);     /* update flags */
+                       __vn_revalidate(XFS_ITOV(ip), vattr);   /* update flags 
*/
                error = -error;
                break;
        }


<Prev in Thread] Current Thread [Next in Thread>
  • [PATCH] cleanup vnode useage in xfs_ioctl.c, Christoph Hellwig <=