do_last(): reorder and simplify a bit
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 5 Mar 2016 23:14:03 +0000 (18:14 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 5 Mar 2016 23:14:03 +0000 (18:14 -0500)
bugger off on negatives a bit earlier, simplify the tests

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

index 9c590e0f66e9c2189f360bf1b742f54f969713aa..5bd9e078685596fa92bf707be80cb86a1105472a 100644 (file)
@@ -3118,6 +3118,7 @@ static int do_last(struct nameidata *nd,
                        return error;
 
                BUG_ON(nd->inode != dir->d_inode);
+               BUG_ON(nd->flags & LOOKUP_RCU);
        } else {
                /* create side of things */
                /*
@@ -3171,12 +3172,6 @@ retry_lookup:
                goto finish_open_created;
        }
 
-       /*
-        * create/update audit record if it already exists.
-        */
-       if (d_is_positive(path.dentry))
-               audit_inode(nd->name, path.dentry, 0);
-
        /*
         * If atomic_open() acquired write access it is dropped now due to
         * possible mount and symlink following (this might be optimized away if
@@ -3187,6 +3182,16 @@ retry_lookup:
                got_write = false;
        }
 
+       if (unlikely(d_is_negative(path.dentry))) {
+               path_to_nameidata(&path, nd);
+               return -ENOENT;
+       }
+
+       /*
+        * create/update audit record if it already exists.
+        */
+       audit_inode(nd->name, path.dentry, 0);
+
        if (unlikely((open_flag & (O_EXCL | O_CREAT)) == (O_EXCL | O_CREAT))) {
                path_to_nameidata(&path, nd);
                return -EEXIST;
@@ -3196,12 +3201,7 @@ retry_lookup:
        if (unlikely(error < 0))
                return error;
 
-       BUG_ON(nd->flags & LOOKUP_RCU);
        seq = 0;        /* out of RCU mode, so the value doesn't matter */
-       if (unlikely(d_is_negative(path.dentry))) {
-               path_to_nameidata(&path, nd);
-               return -ENOENT;
-       }
        inode = d_backing_inode(path.dentry);
 finish_lookup:
        if (nd->depth)