fs: expose LOOKUP_CACHED through openat2() RESOLVE_CACHED
[linux-block.git] / fs / open.c
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;