get rid of dead code in d_find_alias()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 25 Apr 2018 14:52:25 +0000 (10:52 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 13 May 2018 16:08:32 +0000 (12:08 -0400)
All "try disconnected alias if nothing else fits" logics in d_find_alias()
got accidentally disabled by Neil a while ago; for most of the callers it
was the right thing to do, so fixes belong in few callers that *do* want
disconnected aliases.  This just takes the now-dead code in d_find_alias()
out.

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

index 86d2de6..e9476e9 100644 (file)
@@ -907,6 +907,35 @@ repeat:
 }
 EXPORT_SYMBOL(dget_parent);
 
+static struct dentry * __d_find_any_alias(struct inode *inode)
+{
+       struct dentry *alias;
+
+       if (hlist_empty(&inode->i_dentry))
+               return NULL;
+       alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
+       __dget(alias);
+       return alias;
+}
+
+/**
+ * d_find_any_alias - find any alias for a given inode
+ * @inode: inode to find an alias for
+ *
+ * If any aliases exist for the given inode, take and return a
+ * reference for one of them.  If no aliases exist, return %NULL.
+ */
+struct dentry *d_find_any_alias(struct inode *inode)
+{
+       struct dentry *de;
+
+       spin_lock(&inode->i_lock);
+       de = __d_find_any_alias(inode);
+       spin_unlock(&inode->i_lock);
+       return de;
+}
+EXPORT_SYMBOL(d_find_any_alias);
+
 /**
  * d_find_alias - grab a hashed alias of inode
  * @inode: inode in question
@@ -923,34 +952,19 @@ EXPORT_SYMBOL(dget_parent);
  */
 static struct dentry *__d_find_alias(struct inode *inode)
 {
-       struct dentry *alias, *discon_alias;
+       struct dentry *alias;
+
+       if (S_ISDIR(inode->i_mode))
+               return __d_find_any_alias(inode);
 
-again:
-       discon_alias = NULL;
        hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
                spin_lock(&alias->d_lock);
-               if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
-                       if (IS_ROOT(alias) &&
-                           (alias->d_flags & DCACHE_DISCONNECTED)) {
-                               discon_alias = alias;
-                       } else {
-                               __dget_dlock(alias);
-                               spin_unlock(&alias->d_lock);
-                               return alias;
-                       }
-               }
-               spin_unlock(&alias->d_lock);
-       }
-       if (discon_alias) {
-               alias = discon_alias;
-               spin_lock(&alias->d_lock);
-               if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
+               if (!d_unhashed(alias)) {
                        __dget_dlock(alias);
                        spin_unlock(&alias->d_lock);
                        return alias;
                }
                spin_unlock(&alias->d_lock);
-               goto again;
        }
        return NULL;
 }
@@ -1941,35 +1955,6 @@ struct dentry *d_make_root(struct inode *root_inode)
 }
 EXPORT_SYMBOL(d_make_root);
 
-static struct dentry * __d_find_any_alias(struct inode *inode)
-{
-       struct dentry *alias;
-
-       if (hlist_empty(&inode->i_dentry))
-               return NULL;
-       alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
-       __dget(alias);
-       return alias;
-}
-
-/**
- * d_find_any_alias - find any alias for a given inode
- * @inode: inode to find an alias for
- *
- * If any aliases exist for the given inode, take and return a
- * reference for one of them.  If no aliases exist, return %NULL.
- */
-struct dentry *d_find_any_alias(struct inode *inode)
-{
-       struct dentry *de;
-
-       spin_lock(&inode->i_lock);
-       de = __d_find_any_alias(inode);
-       spin_unlock(&inode->i_lock);
-       return de;
-}
-EXPORT_SYMBOL(d_find_any_alias);
-
 static struct dentry *__d_instantiate_anon(struct dentry *dentry,
                                           struct inode *inode,
                                           bool disconnected)