diff options
author | Sage Weil <sage@newdream.net> | 2011-05-24 16:06:05 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-05-26 07:26:46 -0400 |
commit | 64252c75a2196a0cf1e0d3777143ecfe0e3ae650 (patch) | |
tree | 8534f12a507ef5aee91e302f3e54cf8a4440fc82 /fs/namei.c | |
parent | 48293699a09324d2e3c66bd53d10eed6d67937a0 (diff) |
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>
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 5 |
1 files changed, 1 insertions, 4 deletions
diff --git a/fs/namei.c b/fs/namei.c index af5119911704..8d11187a18d7 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -2545,10 +2545,9 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname, int, mode) | |||
2545 | */ | 2545 | */ |
2546 | void dentry_unhash(struct dentry *dentry) | 2546 | void dentry_unhash(struct dentry *dentry) |
2547 | { | 2547 | { |
2548 | dget(dentry); | ||
2549 | shrink_dcache_parent(dentry); | 2548 | shrink_dcache_parent(dentry); |
2550 | spin_lock(&dentry->d_lock); | 2549 | spin_lock(&dentry->d_lock); |
2551 | if (dentry->d_count == 2) | 2550 | if (dentry->d_count == 1) |
2552 | __d_drop(dentry); | 2551 | __d_drop(dentry); |
2553 | spin_unlock(&dentry->d_lock); | 2552 | spin_unlock(&dentry->d_lock); |
2554 | } | 2553 | } |
@@ -2575,7 +2574,6 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
2575 | dentry->d_inode->i_flags |= S_DEAD; | 2574 | dentry->d_inode->i_flags |= S_DEAD; |
2576 | dont_mount(dentry); | 2575 | dont_mount(dentry); |
2577 | } | 2576 | } |
2578 | dput(dentry); | ||
2579 | } | 2577 | } |
2580 | } | 2578 | } |
2581 | mutex_unlock(&dentry->d_inode->i_mutex); | 2579 | 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 | mutex_unlock(&target->i_mutex); | 3000 | mutex_unlock(&target->i_mutex); |
3003 | if (d_unhashed(new_dentry)) | 3001 | if (d_unhashed(new_dentry)) |
3004 | d_rehash(new_dentry); | 3002 | d_rehash(new_dentry); |
3005 | dput(new_dentry); | ||
3006 | } | 3003 | } |
3007 | if (!error) | 3004 | if (!error) |
3008 | if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE)) | 3005 | if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE)) |