mirror of https://gitee.com/openkylin/linux.git
fs: expose LOOKUP_CACHED through openat2() RESOLVE_CACHED
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>
This commit is contained in:
parent
6c6ec2b0a3
commit
99668f6180
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue