From: Greg Kroah-Hartman Date: Mon, 30 Jan 2023 10:12:34 +0000 (+0100) Subject: 5.10-stable patches X-Git-Tag: v5.10.166~28 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=03c86dcac8e83b16eb1a0bfd906040ecda816c7b;p=thirdparty%2Fkernel%2Fstable-queue.git 5.10-stable patches added patches: nfsd-ensure-knfsd-shuts-down-when-the-nfsd-pseudofs-is-unmounted.patch revert-selftests-ftrace-update-synthetic-event-syntax-errors.patch --- diff --git a/queue-5.10/nfsd-ensure-knfsd-shuts-down-when-the-nfsd-pseudofs-is-unmounted.patch b/queue-5.10/nfsd-ensure-knfsd-shuts-down-when-the-nfsd-pseudofs-is-unmounted.patch new file mode 100644 index 00000000000..dbd6e1d4184 --- /dev/null +++ b/queue-5.10/nfsd-ensure-knfsd-shuts-down-when-the-nfsd-pseudofs-is-unmounted.patch @@ -0,0 +1,187 @@ +From c6c7f2a84da459bcc3714044e74a9cb66de31039 Mon Sep 17 00:00:00 2001 +From: Trond Myklebust +Date: Sat, 13 Mar 2021 16:08:47 -0500 +Subject: nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted + +From: Trond Myklebust + +commit c6c7f2a84da459bcc3714044e74a9cb66de31039 upstream. + +In order to ensure that knfsd threads don't linger once the nfsd +pseudofs is unmounted (e.g. when the container is killed) we let +nfsd_umount() shut down those threads and wait for them to exit. + +This also should ensure that we don't need to do a kernel mount of +the pseudofs, since the thread lifetime is now limited by the +lifetime of the filesystem. + +Signed-off-by: Trond Myklebust +Signed-off-by: Chuck Lever +Signed-off-by: Nikos Tsironis +Signed-off-by: Greg Kroah-Hartman +--- + fs/nfsd/netns.h | 6 +++--- + fs/nfsd/nfs4state.c | 8 +------- + fs/nfsd/nfsctl.c | 14 ++------------ + fs/nfsd/nfsd.h | 3 +-- + fs/nfsd/nfssvc.c | 35 ++++++++++++++++++++++++++++++++++- + 5 files changed, 41 insertions(+), 25 deletions(-) + +--- a/fs/nfsd/netns.h ++++ b/fs/nfsd/netns.h +@@ -42,9 +42,6 @@ struct nfsd_net { + bool grace_ended; + time64_t boot_time; + +- /* internal mount of the "nfsd" pseudofilesystem: */ +- struct vfsmount *nfsd_mnt; +- + struct dentry *nfsd_client_dir; + + /* +@@ -121,6 +118,9 @@ struct nfsd_net { + wait_queue_head_t ntf_wq; + atomic_t ntf_refcnt; + ++ /* Allow umount to wait for nfsd state cleanup */ ++ struct completion nfsd_shutdown_complete; ++ + /* + * clientid and stateid data for construction of net unique COPY + * stateids. +--- a/fs/nfsd/nfs4state.c ++++ b/fs/nfsd/nfs4state.c +@@ -7394,14 +7394,9 @@ nfs4_state_start_net(struct net *net) + struct nfsd_net *nn = net_generic(net, nfsd_net_id); + int ret; + +- ret = get_nfsdfs(net); +- if (ret) +- return ret; + ret = nfs4_state_create_net(net); +- if (ret) { +- mntput(nn->nfsd_mnt); ++ if (ret) + return ret; +- } + locks_start_grace(net, &nn->nfsd4_manager); + nfsd4_client_tracking_init(net); + if (nn->track_reclaim_completes && nn->reclaim_str_hashtbl_size == 0) +@@ -7471,7 +7466,6 @@ nfs4_state_shutdown_net(struct net *net) + + nfsd4_client_tracking_exit(net); + nfs4_state_destroy_net(net); +- mntput(nn->nfsd_mnt); + } + + void +--- a/fs/nfsd/nfsctl.c ++++ b/fs/nfsd/nfsctl.c +@@ -1417,6 +1417,8 @@ static void nfsd_umount(struct super_blo + { + struct net *net = sb->s_fs_info; + ++ nfsd_shutdown_threads(net); ++ + kill_litter_super(sb); + put_net(net); + } +@@ -1429,18 +1431,6 @@ static struct file_system_type nfsd_fs_t + }; + MODULE_ALIAS_FS("nfsd"); + +-int get_nfsdfs(struct net *net) +-{ +- struct nfsd_net *nn = net_generic(net, nfsd_net_id); +- struct vfsmount *mnt; +- +- mnt = vfs_kern_mount(&nfsd_fs_type, SB_KERNMOUNT, "nfsd", NULL); +- if (IS_ERR(mnt)) +- return PTR_ERR(mnt); +- nn->nfsd_mnt = mnt; +- return 0; +-} +- + #ifdef CONFIG_PROC_FS + static int create_proc_exports_entry(void) + { +--- a/fs/nfsd/nfsd.h ++++ b/fs/nfsd/nfsd.h +@@ -85,13 +85,12 @@ int nfsd_get_nrthreads(int n, int *, st + int nfsd_set_nrthreads(int n, int *, struct net *); + int nfsd_pool_stats_open(struct inode *, struct file *); + int nfsd_pool_stats_release(struct inode *, struct file *); ++void nfsd_shutdown_threads(struct net *net); + + void nfsd_destroy(struct net *net); + + bool i_am_nfsd(void); + +-int get_nfsdfs(struct net *); +- + struct nfsdfs_client { + struct kref cl_ref; + void (*cl_release)(struct kref *kref); +--- a/fs/nfsd/nfssvc.c ++++ b/fs/nfsd/nfssvc.c +@@ -600,6 +600,37 @@ static const struct svc_serv_ops nfsd_th + .svo_module = THIS_MODULE, + }; + ++static void nfsd_complete_shutdown(struct net *net) ++{ ++ struct nfsd_net *nn = net_generic(net, nfsd_net_id); ++ ++ WARN_ON(!mutex_is_locked(&nfsd_mutex)); ++ ++ nn->nfsd_serv = NULL; ++ complete(&nn->nfsd_shutdown_complete); ++} ++ ++void nfsd_shutdown_threads(struct net *net) ++{ ++ struct nfsd_net *nn = net_generic(net, nfsd_net_id); ++ struct svc_serv *serv; ++ ++ mutex_lock(&nfsd_mutex); ++ serv = nn->nfsd_serv; ++ if (serv == NULL) { ++ mutex_unlock(&nfsd_mutex); ++ return; ++ } ++ ++ svc_get(serv); ++ /* Kill outstanding nfsd threads */ ++ serv->sv_ops->svo_setup(serv, NULL, 0); ++ nfsd_destroy(net); ++ mutex_unlock(&nfsd_mutex); ++ /* Wait for shutdown of nfsd_serv to complete */ ++ wait_for_completion(&nn->nfsd_shutdown_complete); ++} ++ + bool i_am_nfsd(void) + { + return kthread_func(current) == nfsd; +@@ -622,11 +653,13 @@ int nfsd_create_serv(struct net *net) + &nfsd_thread_sv_ops); + if (nn->nfsd_serv == NULL) + return -ENOMEM; ++ init_completion(&nn->nfsd_shutdown_complete); + + nn->nfsd_serv->sv_maxconn = nn->max_connections; + error = svc_bind(nn->nfsd_serv, net); + if (error < 0) { + svc_destroy(nn->nfsd_serv); ++ nfsd_complete_shutdown(net); + return error; + } + +@@ -675,7 +708,7 @@ void nfsd_destroy(struct net *net) + svc_shutdown_net(nn->nfsd_serv, net); + svc_destroy(nn->nfsd_serv); + if (destroy) +- nn->nfsd_serv = NULL; ++ nfsd_complete_shutdown(net); + } + + int nfsd_set_nrthreads(int n, int *nthreads, struct net *net) diff --git a/queue-5.10/revert-selftests-ftrace-update-synthetic-event-syntax-errors.patch b/queue-5.10/revert-selftests-ftrace-update-synthetic-event-syntax-errors.patch new file mode 100644 index 00000000000..ec932f47b19 --- /dev/null +++ b/queue-5.10/revert-selftests-ftrace-update-synthetic-event-syntax-errors.patch @@ -0,0 +1,79 @@ +From zhengyejian1@huawei.com Mon Jan 30 11:11:36 2023 +From: Zheng Yejian +Date: Tue, 17 Jan 2023 20:47:09 +0800 +Subject: Revert "selftests/ftrace: Update synthetic event syntax errors" +To: , , +Cc: , , , , , , +Message-ID: <20230117124709.2341012-1-zhengyejian1@huawei.com> + +From: Zheng Yejian + +This reverts commit 31c2e369b5335d70e913afee3ae11e54d61afef2 which is commit +b5734e997e1117afb479ffda500e36fa91aea3e8 upstream. + +The reverted commit belongs to patchset which updated synthetic event +command parsing and testcase 'trigger-synthetic_event_syntax_errors.tc' +Link: https://lore.kernel.org/all/20210211020950.102294806@goodmis.org/ + +However this testcase update was backported alone without feature +update, which makes the testcase cannot pass on stable branch. + +Revert this commit to make the testcase correct. + +Fixes: 31c2e369b533 ("selftests/ftrace: Update synthetic event syntax errors") +Reported-by: Chen Zhongjin +Signed-off-by: Zheng Yejian +Signed-off-by: Greg Kroah-Hartman +--- + tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic_event_syntax_errors.tc | 35 ++-------- + 1 file changed, 8 insertions(+), 27 deletions(-) + +--- a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic_event_syntax_errors.tc ++++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic_event_syntax_errors.tc +@@ -1,38 +1,19 @@ + #!/bin/sh + # SPDX-License-Identifier: GPL-2.0 + # description: event trigger - test synthetic_events syntax parser errors +-# requires: synthetic_events error_log "char name[]' >> synthetic_events":README ++# requires: synthetic_events error_log + + check_error() { # command-with-error-pos-by-^ + ftrace_errlog_check 'synthetic_events' "$1" 'synthetic_events' + } + +-check_dyn_error() { # command-with-error-pos-by-^ +- ftrace_errlog_check 'synthetic_events' "$1" 'dynamic_events' +-} +- + check_error 'myevent ^chr arg' # INVALID_TYPE +-check_error 'myevent ^unsigned arg' # INCOMPLETE_TYPE +- +-check_error 'myevent char ^str]; int v' # BAD_NAME +-check_error '^mye-vent char str[]' # BAD_NAME +-check_error 'myevent char ^st-r[]' # BAD_NAME +- +-check_error 'myevent char str;^[]' # INVALID_FIELD +-check_error 'myevent char str; ^int' # INVALID_FIELD +- +-check_error 'myevent char ^str[; int v' # INVALID_ARRAY_SPEC +-check_error 'myevent char ^str[kdjdk]' # INVALID_ARRAY_SPEC +-check_error 'myevent char ^str[257]' # INVALID_ARRAY_SPEC +- +-check_error '^mye;vent char str[]' # INVALID_CMD +-check_error '^myevent ; char str[]' # INVALID_CMD +-check_error '^myevent; char str[]' # INVALID_CMD +-check_error '^myevent ;char str[]' # INVALID_CMD +-check_error '^; char str[]' # INVALID_CMD +-check_error '^;myevent char str[]' # INVALID_CMD +-check_error '^myevent' # INVALID_CMD +- +-check_dyn_error '^s:junk/myevent char str[' # INVALID_DYN_CMD ++check_error 'myevent ^char str[];; int v' # INVALID_TYPE ++check_error 'myevent char ^str]; int v' # INVALID_NAME ++check_error 'myevent char ^str;[]' # INVALID_NAME ++check_error 'myevent ^char str[; int v' # INVALID_TYPE ++check_error '^mye;vent char str[]' # BAD_NAME ++check_error 'myevent char str[]; ^int' # INVALID_FIELD ++check_error '^myevent' # INCOMPLETE_CMD + + exit 0 diff --git a/queue-5.10/series b/queue-5.10/series index 27224ae8525..2737d61ee88 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -134,3 +134,5 @@ net-mdio-mux-meson-g12a-force-internal-phy-off-on-mu.patch tools-gpio-fix-c-option-of-gpio-event-mon.patch revert-input-synaptics-switch-touchpad-on-hp-laptop-15-da3001tu-to-rmi-mode.patch nouveau-explicitly-wait-on-the-fence-in-nouveau_bo_move_m2mf.patch +nfsd-ensure-knfsd-shuts-down-when-the-nfsd-pseudofs-is-unmounted.patch +revert-selftests-ftrace-update-synthetic-event-syntax-errors.patch