VFS: only lookup once
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 17 Sep 2014 23:06:19 +0000 (16:06 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 17 Sep 2014 23:06:19 +0000 (16:06 -0700)
Path lookups were looking up twice on failure, optimisticly assuming we'd want
to O_CREAT(E) too.

This isn't a huge deal.  It was more of a problem when our path lookups were
buggy and took 20usec.  Then the extra lookup was expensive.

kern/src/vfs.c

index f2d33db..5dcc314 100644 (file)
@@ -1391,6 +1391,10 @@ struct file *do_file_open(char *path, int flags, int mode)
                kref_get(&file_d->d_kref, 1);
                goto open_the_file;
        }
+       if (!(flags & O_CREAT)) {
+               set_errno(ENOENT);
+               goto out_path_only;
+       }
        /* So it didn't already exist, release the path from the previous lookup,
         * and then we try to create it. */
        path_release(nd);       
@@ -1406,6 +1410,7 @@ struct file *do_file_open(char *path, int flags, int mode)
        file_d = do_lookup(nd->dentry, nd->last.name); 
        if (!file_d) {
                if (!(flags & O_CREAT)) {
+                       warn("Extremely unlikely race, probably a bug");
                        set_errno(ENOENT);
                        goto out_path_only;
                }