vfs: dentry_unhash immediately prior to rmdir
authorSage Weil <sage@newdream.net>
Tue, 24 May 2011 20:06:04 +0000 (13:06 -0700)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 26 May 2011 11:26:46 +0000 (07:26 -0400)
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>
fs/namei.c

index 9f594312d4861ac03f1d46770731e4a479113c28..af5119911704c0d2f604e92136d971da5966a802 100644 (file)
@@ -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;
 }