diff options
author | Nathan Scott <nathans@sgi.com> | 2006-06-27 02:13:46 -0400 |
---|---|---|
committer | Nathan Scott <nathans@sgi.com> | 2006-06-27 02:13:46 -0400 |
commit | 97dfd70c8958a634157e0b35711cca01ff6f959b (patch) | |
tree | a4e47392e35a04b71ff180fa4a681731e3d03a14 /fs | |
parent | 05a3332885dd143496694bcecff223339880d7c9 (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')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_iops.c | 6 |
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 | } |