[XFS] cleanup vnode use in xfs_link
authorChristoph Hellwig <hch@infradead.org>
Thu, 6 Mar 2008 02:46:12 +0000 (13:46 +1100)
committerLachlan McIlroy <lachlan@redback.melbourne.sgi.com>
Fri, 18 Apr 2008 01:40:35 +0000 (11:40 +1000)
SGI-PV: 976035
SGI-Modid: xfs-linux-melb:xfs-kern:30547a

Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
fs/xfs/linux-2.6/xfs_iops.c
fs/xfs/xfs_vnodeops.c
fs/xfs/xfs_vnodeops.h

index 62899a1ec7f7a7a6e96268ac9ad16138d93e53e6..1df48209d60ad9945d19de4e3dc2e7bddd12a947 100644 (file)
@@ -395,23 +395,22 @@ xfs_vn_link(
        struct inode    *dir,
        struct dentry   *dentry)
 {
-       struct inode    *ip;    /* inode of guy being linked to */
-       bhv_vnode_t     *vp;    /* vp of name being linked */
+       struct inode    *inode; /* inode of guy being linked to */
        int             error;
 
-       ip = old_dentry->d_inode;       /* inode being linked to */
-       vp = vn_from_inode(ip);
+       inode = old_dentry->d_inode;
 
-       VN_HOLD(vp);
-       error = xfs_link(XFS_I(dir), vp, dentry);
+       igrab(inode);
+       error = xfs_link(XFS_I(dir), XFS_I(inode), dentry);
        if (unlikely(error)) {
-               VN_RELE(vp);
-       } else {
-               xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED);
-               xfs_validate_fields(ip);
-               d_instantiate(dentry, ip);
+               iput(inode);
+               return -error;
        }
-       return -error;
+
+       xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED);
+       xfs_validate_fields(inode);
+       d_instantiate(dentry, inode);
+       return 0;
 }
 
 STATIC int
index a42d7fe6a5e89715b452ddeeceb7305aba29ab1a..10d2d22eb0373f40cac226d0224218c2a2af0410 100644 (file)
@@ -2471,12 +2471,10 @@ xfs_remove(
 int
 xfs_link(
        xfs_inode_t             *tdp,
-       bhv_vnode_t             *src_vp,
+       xfs_inode_t             *sip,
        bhv_vname_t             *dentry)
 {
-       bhv_vnode_t             *target_dir_vp = XFS_ITOV(tdp);
        xfs_mount_t             *mp = tdp->i_mount;
-       xfs_inode_t             *sip = xfs_vtoi(src_vp);
        xfs_trans_t             *tp;
        xfs_inode_t             *ips[2];
        int                     error;
@@ -2489,10 +2487,10 @@ xfs_link(
        int                     target_namelen;
 
        xfs_itrace_entry(tdp);
-       xfs_itrace_entry(xfs_vtoi(src_vp));
+       xfs_itrace_entry(sip);
 
        target_namelen = VNAMELEN(dentry);
-       ASSERT(!VN_ISDIR(src_vp));
+       ASSERT(!S_ISDIR(sip->i_d.di_mode));
 
        if (XFS_FORCED_SHUTDOWN(mp))
                return XFS_ERROR(EIO);
@@ -2544,8 +2542,8 @@ xfs_link(
         * xfs_trans_cancel will both unlock the inodes and
         * decrement the associated ref counts.
         */
-       VN_HOLD(src_vp);
-       VN_HOLD(target_dir_vp);
+       IHOLD(sip);
+       IHOLD(tdp);
        xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL);
        xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL);
 
index 0acef123141752fa669e5475426ed782de85dbf9..79c13f57a81956a5cd4e56571a2ceef19ed06059 100644 (file)
@@ -28,7 +28,7 @@ int xfs_lookup(struct xfs_inode *dp, bhv_vname_t *dentry,
 int xfs_create(struct xfs_inode *dp, bhv_vname_t *dentry, mode_t mode,
                xfs_dev_t rdev, struct xfs_inode **ipp, struct cred *credp);
 int xfs_remove(struct xfs_inode *dp, bhv_vname_t       *dentry);
-int xfs_link(struct xfs_inode *tdp, bhv_vnode_t *src_vp,
+int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip,
                bhv_vname_t *dentry);
 int xfs_mkdir(struct xfs_inode *dp, bhv_vname_t *dentry,
                mode_t mode, struct xfs_inode **ipp, struct cred *credp);