vfat: simplify checks in vfat_lookup()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 25 Apr 2018 14:32:51 +0000 (10:32 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 13 May 2018 16:09:14 +0000 (12:09 -0400)
vfat_d_anon_disconn() is called only if alias->d_parent is equal to
dentry->d_parent *and* it returns false unless alias->d_parent == alias.
But in that case alias is the directory we are doing lookup in, and
d_splice_alias() would've done the right thing.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/fat/namei_vfat.c

index 2649759..4f4362d 100644 (file)
@@ -697,15 +697,6 @@ static int vfat_find(struct inode *dir, const struct qstr *qname,
        return fat_search_long(dir, qname->name, len, sinfo);
 }
 
-/*
- * (nfsd's) anonymous disconnected dentry?
- * NOTE: !IS_ROOT() is not anonymous (I.e. d_splice_alias() did the job).
- */
-static int vfat_d_anon_disconn(struct dentry *dentry)
-{
-       return IS_ROOT(dentry) && (dentry->d_flags & DCACHE_DISCONNECTED);
-}
-
 static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry,
                                  unsigned int flags)
 {
@@ -738,8 +729,7 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry,
         * Checking "alias->d_parent == dentry->d_parent" to make sure
         * FS is not corrupted (especially double linked dir).
         */
-       if (alias && alias->d_parent == dentry->d_parent &&
-           !vfat_d_anon_disconn(alias)) {
+       if (alias && alias->d_parent == dentry->d_parent) {
                /*
                 * This inode has non anonymous-DCACHE_DISCONNECTED
                 * dentry. This means, the user did ->lookup() by an
@@ -747,7 +737,6 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry,
                 *
                 * Switch to new one for reason of locality if possible.
                 */
-               BUG_ON(d_unhashed(alias));
                if (!S_ISDIR(inode->i_mode))
                        d_move(alias, dentry);
                iput(inode);