]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
open_last_lookups(): move complete_walk() into do_open()
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 10 Mar 2020 14:19:24 +0000 (10:19 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 2 Apr 2020 05:09:30 +0000 (01:09 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c

index 2e9205599931030250e5c18fb1842b65c9fb8582..2c901a022faf58852df6827b971cbf9f6457ba48 100644 (file)
@@ -3128,10 +3128,7 @@ static const char *open_last_lookups(struct nameidata *nd,
        if (nd->last_type != LAST_NORM) {
                if (nd->depth)
                        put_link(nd);
-               res = handle_dots(nd, nd->last_type);
-               if (likely(!res))
-                       res = ERR_PTR(complete_walk(nd));
-               return res;
+               return handle_dots(nd, nd->last_type);
        }
 
        if (!(open_flag & O_CREAT)) {
@@ -3196,13 +3193,9 @@ finish_lookup:
        if (nd->depth)
                put_link(nd);
        res = step_into(nd, WALK_TRAILING, dentry, inode, seq);
-       if (unlikely(res)) {
+       if (unlikely(res))
                nd->flags &= ~(LOOKUP_OPEN|LOOKUP_CREATE|LOOKUP_EXCL);
-               return res;
-       }
-
-       /* Why this, you ask?  _Now_ we might have grown LOOKUP_JUMPED... */
-       return ERR_PTR(complete_walk(nd));
+       return res;
 }
 
 /*
@@ -3216,6 +3209,11 @@ static int do_open(struct nameidata *nd,
        int acc_mode;
        int error;
 
+       if (!(file->f_mode & (FMODE_OPENED | FMODE_CREATED))) {
+               error = complete_walk(nd);
+               if (error)
+                       return error;
+       }
        if (!(file->f_mode & FMODE_CREATED))
                audit_inode(nd->name, nd->path.dentry, 0);
        if (open_flag & O_CREAT) {