From: Greg Kroah-Hartman Date: Mon, 30 Jan 2023 10:12:23 +0000 (+0100) Subject: 5.4-stable patches X-Git-Tag: v5.10.166~29 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8831c859d26ffc48f8fd9f9755e91c654114ea90;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: nfsd-ensure-knfsd-shuts-down-when-the-nfsd-pseudofs-is-unmounted.patch --- diff --git a/queue-5.4/nfsd-ensure-knfsd-shuts-down-when-the-nfsd-pseudofs-is-unmounted.patch b/queue-5.4/nfsd-ensure-knfsd-shuts-down-when-the-nfsd-pseudofs-is-unmounted.patch new file mode 100644 index 00000000000..4f99bf715b2 --- /dev/null +++ b/queue-5.4/nfsd-ensure-knfsd-shuts-down-when-the-nfsd-pseudofs-is-unmounted.patch @@ -0,0 +1,185 @@ +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; + time_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 +@@ -7754,14 +7754,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) +@@ -7830,7 +7825,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 +@@ -84,11 +84,10 @@ 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); + +-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 +@@ -594,6 +594,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); ++} ++ + int nfsd_create_serv(struct net *net) + { + int error; +@@ -611,11 +642,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; + } + +@@ -664,7 +697,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.4/series b/queue-5.4/series index e0e6d8ff71c..19eb4a8449b 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -104,3 +104,4 @@ net-phy-mdio-i2c-move-header-file-to-include-linux-m.patch net-xgene-move-shared-header-file-into-include-linux.patch net-mdio-mux-meson-g12a-force-internal-phy-off-on-mu.patch revert-input-synaptics-switch-touchpad-on-hp-laptop-15-da3001tu-to-rmi-mode.patch +nfsd-ensure-knfsd-shuts-down-when-the-nfsd-pseudofs-is-unmounted.patch