summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2011-05-24 13:06:04 -0700
committerAl Viro <viro@zeniv.linux.org.uk>2011-05-26 07:26:46 -0400
commit48293699a09324d2e3c66bd53d10eed6d67937a0 (patch)
tree5554ad59665d62ebc36ed16d5e13b0badea46a69
parentea13a86463fd0c26c2c209c53dc46b8eff81bad4 (diff)
downloadlinux-48293699a09324d2e3c66bd53d10eed6d67937a0.tar.bz2
vfs: dentry_unhash immediately prior to rmdir
This presumes that there is no reason to unhash a dentry if we fail because it is a mountpoint or the LSM check fails, and that the LSM checks do not depend on the dentry being unhashed. Signed-off-by: Sage Weil <sage@newdream.net> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/namei.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 9f594312d486..af5119911704 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2564,24 +2564,24 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry)
return -EPERM;
mutex_lock(&dentry->d_inode->i_mutex);
- dentry_unhash(dentry);
if (d_mountpoint(dentry))
error = -EBUSY;
else {
error = security_inode_rmdir(dir, dentry);
if (!error) {
+ dentry_unhash(dentry);
error = dir->i_op->rmdir(dir, dentry);
if (!error) {
dentry->d_inode->i_flags |= S_DEAD;
dont_mount(dentry);
}
+ dput(dentry);
}
}
mutex_unlock(&dentry->d_inode->i_mutex);
if (!error) {
d_delete(dentry);
}
- dput(dentry);
return error;
}