diff options
author | Christoph Hellwig <hch@lst.de> | 2008-12-03 06:20:27 -0500 |
---|---|---|
committer | Niv Sardi <xaiki@sgi.com> | 2008-12-03 23:39:21 -0500 |
commit | d9424b3c4a1e96f87c6cfd4d8dd2f8d9bbb4dcc5 (patch) | |
tree | 5f849561a23be97f4d90512551405c79f4b44748 /fs/xfs/linux-2.6/xfs_iops.c | |
parent | 5d765b976c3a41faf9a73718fb8cc5833990a8ef (diff) |
stop using igrab in xfs_vn_link
->link is guranteed to get an already reference inode passed so we
can do a simple increment of i_count instead of using igrab and thus
avoid banging on the global inode_lock. This is what most filesystems
already do.
Also move the increment after the call to xfs_link to simplify error
handling.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <david@fromorbit.com>
Signed-off-by: Niv Sardi <xaiki@sgi.com>
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_iops.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_iops.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 2903faf6a26a..76b570dd1ab2 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c | |||
@@ -367,21 +367,18 @@ xfs_vn_link( | |||
367 | struct inode *dir, | 367 | struct inode *dir, |
368 | struct dentry *dentry) | 368 | struct dentry *dentry) |
369 | { | 369 | { |
370 | struct inode *inode; /* inode of guy being linked to */ | 370 | struct inode *inode = old_dentry->d_inode; |
371 | struct xfs_name name; | 371 | struct xfs_name name; |
372 | int error; | 372 | int error; |
373 | 373 | ||
374 | inode = old_dentry->d_inode; | ||
375 | xfs_dentry_to_name(&name, dentry); | 374 | xfs_dentry_to_name(&name, dentry); |
376 | 375 | ||
377 | igrab(inode); | ||
378 | error = xfs_link(XFS_I(dir), XFS_I(inode), &name); | 376 | error = xfs_link(XFS_I(dir), XFS_I(inode), &name); |
379 | if (unlikely(error)) { | 377 | if (unlikely(error)) |
380 | iput(inode); | ||
381 | return -error; | 378 | return -error; |
382 | } | ||
383 | 379 | ||
384 | xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED); | 380 | xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED); |
381 | atomic_inc(&inode->i_count); | ||
385 | d_instantiate(dentry, inode); | 382 | d_instantiate(dentry, inode); |
386 | return 0; | 383 | return 0; |
387 | } | 384 | } |