aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorNathan Scott <nathans@sgi.com>2006-06-27 02:13:46 -0400
committerNathan Scott <nathans@sgi.com>2006-06-27 02:13:46 -0400
commit97dfd70c8958a634157e0b35711cca01ff6f959b (patch)
treea4e47392e35a04b71ff180fa4a681731e3d03a14 /fs/xfs
parent05a3332885dd143496694bcecff223339880d7c9 (diff)
[XFS] Remove a race condition where a linked inode could BUG_ON in
d_instantiate, due to fast transaction committal removing the last remaining reference before we were all done. SGI-PV: 953287 SGI-Modid: xfs-linux-melb:xfs-kern:26347a Signed-off-by: Nathan Scott <nathans@sgi.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/linux-2.6/xfs_iops.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
index b3b46457f151..d9180020de63 100644
--- a/fs/xfs/linux-2.6/xfs_iops.c
+++ b/fs/xfs/linux-2.6/xfs_iops.c
@@ -422,10 +422,12 @@ xfs_vn_link(
422 tdvp = vn_from_inode(dir); 422 tdvp = vn_from_inode(dir);
423 vp = vn_from_inode(ip); 423 vp = vn_from_inode(ip);
424 424
425 VN_HOLD(vp);
425 error = bhv_vop_link(tdvp, vp, dentry, NULL); 426 error = bhv_vop_link(tdvp, vp, dentry, NULL);
426 if (likely(!error)) { 427 if (unlikely(error)) {
428 VN_RELE(vp);
429 } else {
427 VMODIFY(tdvp); 430 VMODIFY(tdvp);
428 VN_HOLD(vp);
429 xfs_validate_fields(ip, &vattr); 431 xfs_validate_fields(ip, &vattr);
430 d_instantiate(dentry, ip); 432 d_instantiate(dentry, ip);
431 } 433 }