aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/linux-2.6/xfs_iops.c23
-rw-r--r--fs/xfs/xfs_vnodeops.c12
-rw-r--r--fs/xfs/xfs_vnodeops.h2
3 files changed, 17 insertions, 20 deletions
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
index 62899a1ec7f7..1df48209d60a 100644
--- a/fs/xfs/linux-2.6/xfs_iops.c
+++ b/fs/xfs/linux-2.6/xfs_iops.c
@@ -395,23 +395,22 @@ xfs_vn_link(
395 struct inode *dir, 395 struct inode *dir,
396 struct dentry *dentry) 396 struct dentry *dentry)
397{ 397{
398 struct inode *ip; /* inode of guy being linked to */ 398 struct inode *inode; /* inode of guy being linked to */
399 bhv_vnode_t *vp; /* vp of name being linked */
400 int error; 399 int error;
401 400
402 ip = old_dentry->d_inode; /* inode being linked to */ 401 inode = old_dentry->d_inode;
403 vp = vn_from_inode(ip);
404 402
405 VN_HOLD(vp); 403 igrab(inode);
406 error = xfs_link(XFS_I(dir), vp, dentry); 404 error = xfs_link(XFS_I(dir), XFS_I(inode), dentry);
407 if (unlikely(error)) { 405 if (unlikely(error)) {
408 VN_RELE(vp); 406 iput(inode);
409 } else { 407 return -error;
410 xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED);
411 xfs_validate_fields(ip);
412 d_instantiate(dentry, ip);
413 } 408 }
414 return -error; 409
410 xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED);
411 xfs_validate_fields(inode);
412 d_instantiate(dentry, inode);
413 return 0;
415} 414}
416 415
417STATIC int 416STATIC int
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
index a42d7fe6a5e8..10d2d22eb037 100644
--- a/fs/xfs/xfs_vnodeops.c
+++ b/fs/xfs/xfs_vnodeops.c
@@ -2471,12 +2471,10 @@ xfs_remove(
2471int 2471int
2472xfs_link( 2472xfs_link(
2473 xfs_inode_t *tdp, 2473 xfs_inode_t *tdp,
2474 bhv_vnode_t *src_vp, 2474 xfs_inode_t *sip,
2475 bhv_vname_t *dentry) 2475 bhv_vname_t *dentry)
2476{ 2476{
2477 bhv_vnode_t *target_dir_vp = XFS_ITOV(tdp);
2478 xfs_mount_t *mp = tdp->i_mount; 2477 xfs_mount_t *mp = tdp->i_mount;
2479 xfs_inode_t *sip = xfs_vtoi(src_vp);
2480 xfs_trans_t *tp; 2478 xfs_trans_t *tp;
2481 xfs_inode_t *ips[2]; 2479 xfs_inode_t *ips[2];
2482 int error; 2480 int error;
@@ -2489,10 +2487,10 @@ xfs_link(
2489 int target_namelen; 2487 int target_namelen;
2490 2488
2491 xfs_itrace_entry(tdp); 2489 xfs_itrace_entry(tdp);
2492 xfs_itrace_entry(xfs_vtoi(src_vp)); 2490 xfs_itrace_entry(sip);
2493 2491
2494 target_namelen = VNAMELEN(dentry); 2492 target_namelen = VNAMELEN(dentry);
2495 ASSERT(!VN_ISDIR(src_vp)); 2493 ASSERT(!S_ISDIR(sip->i_d.di_mode));
2496 2494
2497 if (XFS_FORCED_SHUTDOWN(mp)) 2495 if (XFS_FORCED_SHUTDOWN(mp))
2498 return XFS_ERROR(EIO); 2496 return XFS_ERROR(EIO);
@@ -2544,8 +2542,8 @@ xfs_link(
2544 * xfs_trans_cancel will both unlock the inodes and 2542 * xfs_trans_cancel will both unlock the inodes and
2545 * decrement the associated ref counts. 2543 * decrement the associated ref counts.
2546 */ 2544 */
2547 VN_HOLD(src_vp); 2545 IHOLD(sip);
2548 VN_HOLD(target_dir_vp); 2546 IHOLD(tdp);
2549 xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL); 2547 xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL);
2550 xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL); 2548 xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL);
2551 2549
diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h
index 0acef1231417..79c13f57a819 100644
--- a/fs/xfs/xfs_vnodeops.h
+++ b/fs/xfs/xfs_vnodeops.h
@@ -28,7 +28,7 @@ int xfs_lookup(struct xfs_inode *dp, bhv_vname_t *dentry,
28int xfs_create(struct xfs_inode *dp, bhv_vname_t *dentry, mode_t mode, 28int xfs_create(struct xfs_inode *dp, bhv_vname_t *dentry, mode_t mode,
29 xfs_dev_t rdev, struct xfs_inode **ipp, struct cred *credp); 29 xfs_dev_t rdev, struct xfs_inode **ipp, struct cred *credp);
30int xfs_remove(struct xfs_inode *dp, bhv_vname_t *dentry); 30int xfs_remove(struct xfs_inode *dp, bhv_vname_t *dentry);
31int xfs_link(struct xfs_inode *tdp, bhv_vnode_t *src_vp, 31int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip,
32 bhv_vname_t *dentry); 32 bhv_vname_t *dentry);
33int xfs_mkdir(struct xfs_inode *dp, bhv_vname_t *dentry, 33int xfs_mkdir(struct xfs_inode *dp, bhv_vname_t *dentry,
34 mode_t mode, struct xfs_inode **ipp, struct cred *credp); 34 mode_t mode, struct xfs_inode **ipp, struct cred *credp);