vfs: remove dget() from dentry_unhash()
This serves no useful purpose that I can discern. All callers (rename, rmdir) hold their own reference to the dentry. A quick audit of all file systems showed no relevant checks on the value of d_count in vfs_rmdir/vfs_rename_dir paths. Signed-off-by: Sage Weil <sage@newdream.net> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
48293699a0
commit
64252c75a2
@ -414,7 +414,6 @@ again:
|
|||||||
mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
|
mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
|
||||||
dentry_unhash(dentry);
|
dentry_unhash(dentry);
|
||||||
if (!d_unhashed(dentry)) {
|
if (!d_unhashed(dentry)) {
|
||||||
dput(dentry);
|
|
||||||
hpfs_unlock(dir->i_sb);
|
hpfs_unlock(dir->i_sb);
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
}
|
}
|
||||||
@ -422,7 +421,6 @@ again:
|
|||||||
!S_ISREG(inode->i_mode) ||
|
!S_ISREG(inode->i_mode) ||
|
||||||
get_write_access(inode)) {
|
get_write_access(inode)) {
|
||||||
d_rehash(dentry);
|
d_rehash(dentry);
|
||||||
dput(dentry);
|
|
||||||
} else {
|
} else {
|
||||||
struct iattr newattrs;
|
struct iattr newattrs;
|
||||||
/*printk("HPFS: truncating file before delete.\n");*/
|
/*printk("HPFS: truncating file before delete.\n");*/
|
||||||
@ -430,7 +428,6 @@ again:
|
|||||||
newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
|
newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
|
||||||
err = notify_change(dentry, &newattrs);
|
err = notify_change(dentry, &newattrs);
|
||||||
put_write_access(inode);
|
put_write_access(inode);
|
||||||
dput(dentry);
|
|
||||||
if (!err)
|
if (!err)
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
|
@ -2545,10 +2545,9 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname, int, mode)
|
|||||||
*/
|
*/
|
||||||
void dentry_unhash(struct dentry *dentry)
|
void dentry_unhash(struct dentry *dentry)
|
||||||
{
|
{
|
||||||
dget(dentry);
|
|
||||||
shrink_dcache_parent(dentry);
|
shrink_dcache_parent(dentry);
|
||||||
spin_lock(&dentry->d_lock);
|
spin_lock(&dentry->d_lock);
|
||||||
if (dentry->d_count == 2)
|
if (dentry->d_count == 1)
|
||||||
__d_drop(dentry);
|
__d_drop(dentry);
|
||||||
spin_unlock(&dentry->d_lock);
|
spin_unlock(&dentry->d_lock);
|
||||||
}
|
}
|
||||||
@ -2575,7 +2574,6 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry)
|
|||||||
dentry->d_inode->i_flags |= S_DEAD;
|
dentry->d_inode->i_flags |= S_DEAD;
|
||||||
dont_mount(dentry);
|
dont_mount(dentry);
|
||||||
}
|
}
|
||||||
dput(dentry);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mutex_unlock(&dentry->d_inode->i_mutex);
|
mutex_unlock(&dentry->d_inode->i_mutex);
|
||||||
@ -3002,7 +3000,6 @@ static int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
|
|||||||
mutex_unlock(&target->i_mutex);
|
mutex_unlock(&target->i_mutex);
|
||||||
if (d_unhashed(new_dentry))
|
if (d_unhashed(new_dentry))
|
||||||
d_rehash(new_dentry);
|
d_rehash(new_dentry);
|
||||||
dput(new_dentry);
|
|
||||||
}
|
}
|
||||||
if (!error)
|
if (!error)
|
||||||
if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE))
|
if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE))
|
||||||
|
@ -105,7 +105,6 @@ static int xattr_rmdir(struct inode *dir, struct dentry *dentry)
|
|||||||
mutex_unlock(&dentry->d_inode->i_mutex);
|
mutex_unlock(&dentry->d_inode->i_mutex);
|
||||||
if (!error)
|
if (!error)
|
||||||
d_delete(dentry);
|
d_delete(dentry);
|
||||||
dput(dentry);
|
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user