d_add_ci() should just accept a hashed exact match if it finds one
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 12 Oct 2014 22:46:26 +0000 (18:46 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 19 Nov 2014 18:00:10 +0000 (13:00 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/dcache.c

index e90aa825cc03a6180c31a4350fd3b322695e6234..e605e90d0f0a07f237c16fbe1532d82998526d15 100644 (file)
@@ -1888,51 +1888,19 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
         * if not go ahead and create it now.
         */
        found = d_hash_and_lookup(dentry->d_parent, name);
-       if (unlikely(IS_ERR(found)))
-               goto err_out;
        if (!found) {
                new = d_alloc(dentry->d_parent, name);
                if (!new) {
                        found = ERR_PTR(-ENOMEM);
-                       goto err_out;
-               }
-
-               found = d_splice_alias(inode, new);
-               if (found) {
-                       dput(new);
-                       return found;
-               }
-               return new;
-       }
-
-       /*
-        * If a matching dentry exists, and it's not negative use it.
-        *
-        * Decrement the reference count to balance the iget() done
-        * earlier on.
-        */
-       if (found->d_inode) {
-               if (unlikely(found->d_inode != inode)) {
-                       /* This can't happen because bad inodes are unhashed. */
-                       BUG_ON(!is_bad_inode(inode));
-                       BUG_ON(!is_bad_inode(found->d_inode));
+               } else {
+                       found = d_splice_alias(inode, new);
+                       if (found) {
+                               dput(new);
+                               return found;
+                       }
+                       return new;
                }
-               iput(inode);
-               return found;
        }
-
-       /*
-        * Negative dentry: instantiate it unless the inode is a directory and
-        * already has a dentry.
-        */
-       new = d_splice_alias(inode, found);
-       if (new) {
-               dput(found);
-               found = new;
-       }
-       return found;
-
-err_out:
        iput(inode);
        return found;
 }