Commit 64252c75 authored by Sage Weil's avatar Sage Weil Committed by Al Viro

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: default avatarSage Weil <sage@newdream.net>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 48293699
...@@ -414,7 +414,6 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry) ...@@ -414,7 +414,6 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry)
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 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry) ...@@ -422,7 +421,6 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry)
!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 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry) ...@@ -430,7 +428,6 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry)
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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment