cleanup vnode useage in xfs_ioctl.c
PATCH 1/1 cleanup vnode useage in xfs_ioctl.c
Signed-off-by Christoph Hellwig <[email protected]>
fs/xfs/linux-2.6/xfs_ioctl.c +26 -49
@@ -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 intxfs_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 ; }