stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 5.4 0/1] nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted
@ 2023-01-23 15:28 Nikos Tsironis
  2023-01-23 15:28 ` [PATCH 5.4 1/1] " Nikos Tsironis
  2023-01-23 15:42 ` [PATCH 5.4 0/1] " Chuck Lever III
  0 siblings, 2 replies; 4+ messages in thread
From: Nikos Tsironis @ 2023-01-23 15:28 UTC (permalink / raw)
  To: stable; +Cc: bfields, chuck.lever, ntsironis, linux-nfs, trond.myklebust

The bug that upstream commit c6c7f2a84da45 ("nfsd: Ensure knfsd shuts
down when the "nfsd" pseudofs is unmounted") fixes in kernel v5.13
exists in kernel v5.4 too.

That is, knfsd threads are left behind once the nfsd pseudofs is
unmounted, e.g. when the container is killed.

I backported the patch to kernel v5.4, and tested it.

Trond Myklebust (1):
  nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted

 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(-)

-- 
2.30.2


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 5.4 1/1] nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted
  2023-01-23 15:28 [PATCH 5.4 0/1] nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted Nikos Tsironis
@ 2023-01-23 15:28 ` Nikos Tsironis
  2023-01-23 15:42 ` [PATCH 5.4 0/1] " Chuck Lever III
  1 sibling, 0 replies; 4+ messages in thread
From: Nikos Tsironis @ 2023-01-23 15:28 UTC (permalink / raw)
  To: stable; +Cc: bfields, chuck.lever, ntsironis, linux-nfs, trond.myklebust

From: Trond Myklebust <trond.myklebust@hammerspace.com>

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 <trond.myklebust@hammerspace.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Nikos Tsironis <ntsironis@arrikto.com>
---
 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(-)

diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h
index ed53e206a299..82329b5102c6 100644
--- 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.
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index de2c3809d15a..5922eceb0176 100644
--- 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
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index 055cc0458f27..a2454739b1cf 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -1417,6 +1417,8 @@ static void nfsd_umount(struct super_block *sb)
 {
 	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_type = {
 };
 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)
 {
diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h
index 4ff0c5318a02..3ae9811c0bb9 100644
--- a/fs/nfsd/nfsd.h
+++ b/fs/nfsd/nfsd.h
@@ -84,11 +84,10 @@ int		nfsd_get_nrthreads(int n, int *, struct net *);
 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);
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index 70684c7ae94b..969a227186fa 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -594,6 +594,37 @@ static const struct svc_serv_ops nfsd_thread_sv_ops = {
 	.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)
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 5.4 0/1] nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted
  2023-01-23 15:28 [PATCH 5.4 0/1] nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted Nikos Tsironis
  2023-01-23 15:28 ` [PATCH 5.4 1/1] " Nikos Tsironis
@ 2023-01-23 15:42 ` Chuck Lever III
  2023-01-30 10:10   ` Greg KH
  1 sibling, 1 reply; 4+ messages in thread
From: Chuck Lever III @ 2023-01-23 15:42 UTC (permalink / raw)
  To: Nikos Tsironis
  Cc: linux-stable, Bruce Fields, Linux NFS Mailing List, Trond Myklebust



> On Jan 23, 2023, at 10:28 AM, Nikos Tsironis <ntsironis@arrikto.com> wrote:
> 
> The bug that upstream commit c6c7f2a84da45 ("nfsd: Ensure knfsd shuts
> down when the "nfsd" pseudofs is unmounted") fixes in kernel v5.13
> exists in kernel v5.4 too.
> 
> That is, knfsd threads are left behind once the nfsd pseudofs is
> unmounted, e.g. when the container is killed.
> 
> I backported the patch to kernel v5.4, and tested it.

Nikos, thanks for taking care of this!


> Trond Myklebust (1):
>  nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted
> 
> 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(-)
> 
> -- 
> 2.30.2
> 

--
Chuck Lever




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 5.4 0/1] nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted
  2023-01-23 15:42 ` [PATCH 5.4 0/1] " Chuck Lever III
@ 2023-01-30 10:10   ` Greg KH
  0 siblings, 0 replies; 4+ messages in thread
From: Greg KH @ 2023-01-30 10:10 UTC (permalink / raw)
  To: Chuck Lever III
  Cc: Nikos Tsironis, linux-stable, Bruce Fields,
	Linux NFS Mailing List, Trond Myklebust

On Mon, Jan 23, 2023 at 03:42:55PM +0000, Chuck Lever III wrote:
> 
> 
> > On Jan 23, 2023, at 10:28 AM, Nikos Tsironis <ntsironis@arrikto.com> wrote:
> > 
> > The bug that upstream commit c6c7f2a84da45 ("nfsd: Ensure knfsd shuts
> > down when the "nfsd" pseudofs is unmounted") fixes in kernel v5.13
> > exists in kernel v5.4 too.
> > 
> > That is, knfsd threads are left behind once the nfsd pseudofs is
> > unmounted, e.g. when the container is killed.
> > 
> > I backported the patch to kernel v5.4, and tested it.
> 
> Nikos, thanks for taking care of this!

Both now queued up, thanks.

greg k-h

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-01-30 10:10 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-23 15:28 [PATCH 5.4 0/1] nfsd: Ensure knfsd shuts down when the "nfsd" pseudofs is unmounted Nikos Tsironis
2023-01-23 15:28 ` [PATCH 5.4 1/1] " Nikos Tsironis
2023-01-23 15:42 ` [PATCH 5.4 0/1] " Chuck Lever III
2023-01-30 10:10   ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).