fs: expose LOOKUP_CACHED through openat2() RESOLVE_CACHED
authorJens Axboe <axboe@kernel.dk>
Thu, 17 Dec 2020 16:19:10 +0000 (09:19 -0700)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 4 Jan 2021 16:42:26 +0000 (11:42 -0500)
Now that we support non-blocking path resolution internally, expose it
via openat2() in the struct open_how ->resolve flags. This allows
applications using openat2() to limit path resolution to the extent that
it is already cached.

If the lookup cannot be satisfied in a non-blocking manner, openat2(2)
will return -1/-EAGAIN.

Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/open.c
include/linux/fcntl.h
include/uapi/linux/openat2.h

index 1e06e443a5651adca7e114aeebb02044b7e24803..ca5444733acdeb17c0d55b545e18e828b8ccc557 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -1091,6 +1091,12 @@ inline int build_open_flags(const struct open_how *how, struct open_flags *op)
                lookup_flags |= LOOKUP_BENEATH;
        if (how->resolve & RESOLVE_IN_ROOT)
                lookup_flags |= LOOKUP_IN_ROOT;
+       if (how->resolve & RESOLVE_CACHED) {
+               /* Don't bother even trying for create/truncate/tmpfile open */
+               if (flags & (O_TRUNC | O_CREAT | O_TMPFILE))
+                       return -EAGAIN;
+               lookup_flags |= LOOKUP_CACHED;
+       }
 
        op->lookup_flags = lookup_flags;
        return 0;
index 921e750843e660c2909c678b73eb052955712203..766fcd973bebac518cfd57eaa0c7c7bbf224e8ca 100644 (file)
@@ -19,7 +19,7 @@
 /* List of all valid flags for the how->resolve argument: */
 #define VALID_RESOLVE_FLAGS \
        (RESOLVE_NO_XDEV | RESOLVE_NO_MAGICLINKS | RESOLVE_NO_SYMLINKS | \
-        RESOLVE_BENEATH | RESOLVE_IN_ROOT)
+        RESOLVE_BENEATH | RESOLVE_IN_ROOT | RESOLVE_CACHED)
 
 /* List of all open_how "versions". */
 #define OPEN_HOW_SIZE_VER0     24 /* sizeof first published struct */
index 58b1eb71136007727e8535eaeb19e2ea4a00fb9a..a5feb7604948791c7a34ec0876c24a97eb5a375b 100644 (file)
@@ -35,5 +35,9 @@ struct open_how {
 #define RESOLVE_IN_ROOT                0x10 /* Make all jumps to "/" and ".."
                                        be scoped inside the dirfd
                                        (similar to chroot(2)). */
+#define RESOLVE_CACHED         0x20 /* Only complete if resolution can be
+                                       completed through cached lookup. May
+                                       return -EAGAIN if that's not
+                                       possible. */
 
 #endif /* _UAPI_LINUX_OPENAT2_H */