This is a note to let you know that I've just added the patch titled fs: add support for LOOKUP_CACHED to the 5.10-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: fs-add-support-for-lookup_cached.patch and it can be found in the queue-5.10 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From 53e825b10aa8f037c19c51997f5f8402d046d883 Mon Sep 17 00:00:00 2001 From: Jens Axboe <axboe@xxxxxxxxx> Date: Thu, 17 Dec 2020 09:19:09 -0700 Subject: fs: add support for LOOKUP_CACHED From: Jens Axboe <axboe@xxxxxxxxx> [ Upstream commit 6c6ec2b0a3e0381d886d531bd1471dfdb1509237 ] io_uring always punts opens to async context, since there's no control over whether the lookup blocks or not. Add LOOKUP_CACHED to support just doing the fast RCU based lookups, which we know will not block. If we can do a cached path resolution of the filename, then we don't have to always punt lookups for a worker. During path resolution, we always do LOOKUP_RCU first. If that fails and we terminate LOOKUP_RCU, then fail a LOOKUP_CACHED attempt as well. Cc: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- fs/namei.c | 9 +++++++++ include/linux/namei.h | 1 + 2 files changed, 10 insertions(+) --- a/fs/namei.c +++ b/fs/namei.c @@ -686,6 +686,8 @@ static bool try_to_unlazy(struct nameida BUG_ON(!(nd->flags & LOOKUP_RCU)); nd->flags &= ~LOOKUP_RCU; + if (nd->flags & LOOKUP_CACHED) + goto out1; if (unlikely(!legitimize_links(nd))) goto out1; if (unlikely(!legitimize_path(nd, &nd->path, nd->seq))) @@ -722,6 +724,8 @@ static bool try_to_unlazy_next(struct na BUG_ON(!(nd->flags & LOOKUP_RCU)); nd->flags &= ~LOOKUP_RCU; + if (nd->flags & LOOKUP_CACHED) + goto out2; if (unlikely(!legitimize_links(nd))) goto out2; if (unlikely(!legitimize_mnt(nd->path.mnt, nd->m_seq))) @@ -792,6 +796,7 @@ static int complete_walk(struct nameidat */ if (!(nd->flags & (LOOKUP_ROOT | LOOKUP_IS_SCOPED))) nd->root.mnt = NULL; + nd->flags &= ~LOOKUP_CACHED; if (!try_to_unlazy(nd)) return -ECHILD; } @@ -2204,6 +2209,10 @@ static const char *path_init(struct name int error; const char *s = nd->name->name; + /* LOOKUP_CACHED requires RCU, ask caller to retry */ + if ((flags & (LOOKUP_RCU | LOOKUP_CACHED)) == LOOKUP_CACHED) + return ERR_PTR(-EAGAIN); + if (!*s) flags &= ~LOOKUP_RCU; if (flags & LOOKUP_RCU) --- a/include/linux/namei.h +++ b/include/linux/namei.h @@ -46,6 +46,7 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LA #define LOOKUP_NO_XDEV 0x040000 /* No mountpoint crossing. */ #define LOOKUP_BENEATH 0x080000 /* No escaping from starting point. */ #define LOOKUP_IN_ROOT 0x100000 /* Treat dirfd as fs root. */ +#define LOOKUP_CACHED 0x200000 /* Only do cached lookup */ /* LOOKUP_* flags which do scope-related checks based on the dirfd. */ #define LOOKUP_IS_SCOPED (LOOKUP_BENEATH | LOOKUP_IN_ROOT) Patches currently in stable-queue which might be from axboe@xxxxxxxxx are queue-5.10/x86-process-setup-io_threads-more-like-normal-user-space-threads.patch queue-5.10/powerpc-add-support-for-tif_notify_signal.patch queue-5.10/eventfd-provide-a-eventfd_signal_mask-helper.patch queue-5.10/fs-provide-locked-helper-variant-of-close_fd_get_file.patch queue-5.10/relay-fix-type-mismatch-when-allocating-memory-in-re.patch queue-5.10/eventfd-change-int-to-__u64-in-eventfd_signal-ifndef.patch queue-5.10/io_uring-pass-in-epoll_uring_wake-for-eventfd-signaling-and-wakeups.patch queue-5.10/blk-mq-fix-possible-memleak-when-register-hctx-faile.patch queue-5.10/fix-handling-of-nd-depth-on-lookup_cached-failures-in-try_to_unlazy.patch queue-5.10/net-provide-__sys_shutdown_sock-that-takes-a-socket.patch queue-5.10/task_work-unconditionally-run-task_work-from-get_signal.patch queue-5.10/openrisc-add-support-for-tif_notify_signal.patch queue-5.10/signal-add-task_sigpending-helper.patch queue-5.10/net-remove-cmsg-restriction-from-io_uring-based-send-recvmsg-calls.patch queue-5.10/alpha-add-support-for-tif_notify_signal.patch queue-5.10/nios32-add-support-for-tif_notify_signal.patch queue-5.10/ia64-don-t-call-handle_signal-unless-there-s-actually-a-signal-queued.patch queue-5.10/task_work-remove-legacy-twa_signal-path.patch queue-5.10/revert-proc-don-t-allow-async-path-resolution-of-proc-self-components.patch queue-5.10/m68k-add-support-for-tif_notify_signal.patch queue-5.10/s390-add-support-for-tif_notify_signal.patch queue-5.10/um-add-support-for-tif_notify_signal.patch queue-5.10/tools-headers-uapi-sync-openat2.h-with-the-kernel-sources.patch queue-5.10/kernel-provide-create_io_thread-helper.patch queue-5.10/iov_iter-add-helper-to-save-iov_iter-state.patch queue-5.10/arc-unbork-5.11-bootup-fix-snafu-in-_tif_notify_signal-handling.patch queue-5.10/arch-ensure-parisc-powerpc-handle-pf_io_worker-in-copy_thread.patch queue-5.10/csky-add-support-for-tif_notify_signal.patch queue-5.10/arm-add-support-for-tif_notify_signal.patch queue-5.10/kernel-stop-masking-signals-in-create_io_thread.patch queue-5.10/fs-expose-lookup_cached-through-openat2-resolve_cached.patch queue-5.10/task_work-add-helper-for-more-targeted-task_work-canceling.patch queue-5.10/nds32-add-support-for-tif_notify_signal.patch queue-5.10/signal-kill-jobctl_task_work.patch queue-5.10/hexagon-add-support-for-tif_notify_signal.patch queue-5.10/sh-add-support-for-tif_notify_signal.patch queue-5.10/riscv-add-support-for-tif_notify_signal.patch queue-5.10/h8300-add-support-for-tif_notify_signal.patch queue-5.10/io_uring-import-5.15-stable-io_uring.patch queue-5.10/sparc-add-support-for-tif_notify_signal.patch queue-5.10/blktrace-fix-output-non-blktrace-event-when-blk_clas.patch queue-5.10/eventpoll-add-epoll_uring_wake-poll-wakeup-flag.patch queue-5.10/parisc-add-support-for-tif_notify_signal.patch queue-5.10/entry-add-support-for-tif_notify_signal.patch queue-5.10/x86-wire-up-tif_notify_signal.patch queue-5.10/task_work-use-tif_notify_signal-if-available.patch queue-5.10/drbd-fix-an-invalid-memory-access-caused-by-incorrec.patch queue-5.10/kernel-don-t-call-do_exit-for-pf_io_worker-threads.patch queue-5.10/kernel-allow-fork-with-tif_notify_signal-pending.patch queue-5.10/pata_ipx4xx_cf-fix-unsigned-comparison-with-less-tha.patch queue-5.10/mips-add-support-for-tif_notify_signal.patch queue-5.10/xtensa-add-support-for-tif_notify_signal.patch queue-5.10/c6x-add-support-for-tif_notify_signal.patch queue-5.10/microblaze-add-support-for-tif_notify_signal.patch queue-5.10/net-add-accept-helper-not-installing-fd.patch queue-5.10/ia64-add-support-for-tif_notify_signal.patch queue-5.10/arm64-add-support-for-tif_notify_signal.patch queue-5.10/arc-add-support-for-tif_notify_signal.patch queue-5.10/revert-proc-don-t-allow-async-path-resolution-of-proc-thread-self-components.patch queue-5.10/fs-make-do_renameat2-take-struct-filename.patch queue-5.10/kernel-remove-checking-for-tif_notify_signal.patch queue-5.10/arch-setup-pf_io_worker-threads-like-pf_kthread.patch queue-5.10/nvme-pci-fix-mempool-alloc-size.patch queue-5.10/fs-add-support-for-lookup_cached.patch