cifs_lookup(): switch to d_splice_alias()
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 15 May 2018 01:42:29 +0000 (21:42 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 22 May 2018 18:28:03 +0000 (14:28 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/cifs/dir.c

index ecbf36c..751b8c9 100644 (file)
@@ -779,21 +779,25 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
        tlink = cifs_sb_tlink(cifs_sb);
        if (IS_ERR(tlink)) {
                free_xid(xid);
-               return (struct dentry *)tlink;
+               return ERR_CAST(tlink);
        }
        pTcon = tlink_tcon(tlink);
 
        rc = check_name(direntry, pTcon);
-       if (rc)
-               goto lookup_out;
+       if (unlikely(rc)) {
+               cifs_put_tlink(tlink);
+               free_xid(xid);
+               return ERR_PTR(rc);
+       }
 
        /* can not grab the rename sem here since it would
        deadlock in the cases (beginning of sys_rename itself)
        in which we already have the sb rename sem */
        full_path = build_path_from_dentry(direntry);
        if (full_path == NULL) {
-               rc = -ENOMEM;
-               goto lookup_out;
+               cifs_put_tlink(tlink);
+               free_xid(xid);
+               return ERR_PTR(-ENOMEM);
        }
 
        if (d_really_is_positive(direntry)) {
@@ -813,28 +817,24 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
        }
 
        if (rc == 0) {
-               d_add(direntry, newInode);
                /* since paths are not looked up by component - the parent
                   directories are presumed to be good here */
                renew_parental_timestamps(direntry);
-
        } else if (rc == -ENOENT) {
-               rc = 0;
                cifs_set_time(direntry, jiffies);
-               d_add(direntry, NULL);
-       /*      if it was once a directory (but how can we tell?) we could do
-               shrink_dcache_parent(direntry); */
-       } else if (rc != -EACCES) {
-               cifs_dbg(FYI, "Unexpected lookup error %d\n", rc);
-               /* We special case check for Access Denied - since that
-               is a common return code */
+               newInode = NULL;
+       } else {
+               if (rc != -EACCES) {
+                       cifs_dbg(FYI, "Unexpected lookup error %d\n", rc);
+                       /* We special case check for Access Denied - since that
+                       is a common return code */
+               }
+               newInode = ERR_PTR(rc);
        }
-
-lookup_out:
        kfree(full_path);
        cifs_put_tlink(tlink);
        free_xid(xid);
-       return ERR_PTR(rc);
+       return d_splice_alias(newInode, direntry);
 }
 
 static int