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>
This commit is contained in:
parent
5d765b976c
commit
d9424b3c4a
1 changed files with 3 additions and 6 deletions
|
@ -367,21 +367,18 @@ xfs_vn_link(
|
||||||
struct inode *dir,
|
struct inode *dir,
|
||||||
struct dentry *dentry)
|
struct dentry *dentry)
|
||||||
{
|
{
|
||||||
struct inode *inode; /* inode of guy being linked to */
|
struct inode *inode = old_dentry->d_inode;
|
||||||
struct xfs_name name;
|
struct xfs_name name;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
inode = old_dentry->d_inode;
|
|
||||||
xfs_dentry_to_name(&name, dentry);
|
xfs_dentry_to_name(&name, dentry);
|
||||||
|
|
||||||
igrab(inode);
|
|
||||||
error = xfs_link(XFS_I(dir), XFS_I(inode), &name);
|
error = xfs_link(XFS_I(dir), XFS_I(inode), &name);
|
||||||
if (unlikely(error)) {
|
if (unlikely(error))
|
||||||
iput(inode);
|
|
||||||
return -error;
|
return -error;
|
||||||
}
|
|
||||||
|
|
||||||
xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED);
|
xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED);
|
||||||
|
atomic_inc(&inode->i_count);
|
||||||
d_instantiate(dentry, inode);
|
d_instantiate(dentry, inode);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue