Merge branch 'work.lookup' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[muen/linux.git] / fs / cifs / dir.c
index 925844343038aaa04b479fcdd2063c9ddfb811a0..9eb03e8b1adadc700f381470cefbff1df9834c1b 100644 (file)
@@ -780,21 +780,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,29 +817,25 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
                                parent_dir_inode->i_sb, xid, NULL);
        }
 
-       if ((rc == 0) && (newInode != NULL)) {
-               d_add(direntry, newInode);
+       if (rc == 0) {
                /* 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