From: cel@kernel.org
To: <stable@vger.kernel.org>
Cc: <linux-nfs@vger.kernel.org>, Petr Vorel <pvorel@suse.cz>,
sherry.yang@oracle.com, calum.mackay@oracle.com,
kernel-team@fb.com, NeilBrown <neilb@suse.de>,
Jeff Layton <jlayton@kernel.org>
Subject: [PATCH 5.10.y 07/19] NFSD: simplify error paths in nfsd_svc()
Date: Thu, 5 Sep 2024 11:30:49 -0400 [thread overview]
Message-ID: <20240905153101.59927-8-cel@kernel.org> (raw)
In-Reply-To: <20240905153101.59927-1-cel@kernel.org>
From: NeilBrown <neilb@suse.de>
[ Upstream commit bf32075256e9dd9c6b736859e2c5813981339908 ]
The error paths in nfsd_svc() are needlessly complex and can result in a
final call to svc_put() without nfsd_last_thread() being called. This
results in the listening sockets not being closed properly.
The per-netns setup provided by nfsd_startup_new() and removed by
nfsd_shutdown_net() is needed precisely when there are running threads.
So we don't need nfsd_up_before. We don't need to know if it *was* up.
We only need to know if any threads are left. If none are, then we must
call nfsd_shutdown_net(). But we don't need to do that explicitly as
nfsd_last_thread() does that for us.
So simply call nfsd_last_thread() before the last svc_put() if there are
no running threads. That will always do the right thing.
Also discard:
pr_info("nfsd: last server has exited, flushing export cache\n");
It may not be true if an attempt to start the first server failed, and
it isn't particularly helpful and it simply reports normal behaviour.
Signed-off-by: NeilBrown <neilb@suse.de>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
fs/nfsd/nfssvc.c | 14 ++++----------
1 file changed, 4 insertions(+), 10 deletions(-)
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index a68e9904224a..3fdff9a3b182 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -567,7 +567,6 @@ void nfsd_last_thread(struct net *net)
return;
nfsd_shutdown_net(net);
- pr_info("nfsd: last server has exited, flushing export cache\n");
nfsd_export_flush(net);
}
@@ -782,7 +781,6 @@ int
nfsd_svc(int nrservs, struct net *net, const struct cred *cred)
{
int error;
- bool nfsd_up_before;
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
struct svc_serv *serv;
@@ -802,8 +800,6 @@ nfsd_svc(int nrservs, struct net *net, const struct cred *cred)
error = nfsd_create_serv(net);
if (error)
goto out;
-
- nfsd_up_before = nn->nfsd_net_up;
serv = nn->nfsd_serv;
error = nfsd_startup_net(net, cred);
@@ -811,17 +807,15 @@ nfsd_svc(int nrservs, struct net *net, const struct cred *cred)
goto out_put;
error = svc_set_num_threads(serv, NULL, nrservs);
if (error)
- goto out_shutdown;
+ goto out_put;
error = serv->sv_nrthreads;
- if (error == 0)
- nfsd_last_thread(net);
-out_shutdown:
- if (error < 0 && !nfsd_up_before)
- nfsd_shutdown_net(net);
out_put:
/* Threads now hold service active */
if (xchg(&nn->keep_active, 0))
svc_put(serv);
+
+ if (serv->sv_nrthreads == 0)
+ nfsd_last_thread(net);
svc_put(serv);
out:
mutex_unlock(&nfsd_mutex);
--
2.45.1
next prev parent reply other threads:[~2024-09-05 15:31 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-05 15:30 [PATCH 5.10.y 00/19] Backport "make svc_stat per-net instead of global" cel
2024-09-05 15:30 ` [PATCH 5.10.y 01/19] nfsd: move reply cache initialization into nfsd startup cel
2024-09-08 13:03 ` Greg KH
2024-09-05 15:30 ` [PATCH 5.10.y 02/19] nfsd: move init of percpu reply_cache_stats counters back to nfsd_init_net cel
2024-09-05 15:30 ` [PATCH 5.10.y 03/19] NFSD: Refactor nfsd_reply_cache_free_locked() cel
2024-09-05 15:30 ` [PATCH 5.10.y 04/19] NFSD: Rename nfsd_reply_cache_alloc() cel
2024-09-05 15:30 ` [PATCH 5.10.y 05/19] NFSD: Replace nfsd_prune_bucket() cel
2024-09-05 15:30 ` [PATCH 5.10.y 06/19] NFSD: Refactor the duplicate reply cache shrinker cel
2024-09-05 15:30 ` cel [this message]
2024-09-05 15:30 ` [PATCH 5.10.y 08/19] NFSD: Rewrite synopsis of nfsd_percpu_counters_init() cel
2024-09-05 15:30 ` [PATCH 5.10.y 09/19] NFSD: Fix frame size warning in svc_export_parse() cel
2024-09-05 15:30 ` [PATCH 5.10.y 10/19] sunrpc: don't change ->sv_stats if it doesn't exist cel
2024-09-05 15:30 ` [PATCH 5.10.y 11/19] nfsd: stop setting ->pg_stats for unused stats cel
2024-09-05 15:30 ` [PATCH 5.10.y 12/19] sunrpc: pass in the sv_stats struct through svc_create_pooled cel
2024-09-05 15:30 ` [PATCH 5.10.y 13/19] sunrpc: remove ->pg_stats from svc_program cel
2024-09-05 15:30 ` [PATCH 5.10.y 14/19] sunrpc: use the struct net as the svc proc private cel
2024-09-05 15:30 ` [PATCH 5.10.y 15/19] nfsd: rename NFSD_NET_* to NFSD_STATS_* cel
2024-09-05 15:30 ` [PATCH 5.10.y 16/19] nfsd: expose /proc/net/sunrpc/nfsd in net namespaces cel
2024-09-05 15:30 ` [PATCH 5.10.y 17/19] nfsd: make all of the nfsd stats per-network namespace cel
2024-09-05 15:31 ` [PATCH 5.10.y 18/19] nfsd: remove nfsd_stats, make th_cnt a global counter cel
2024-09-05 15:31 ` [PATCH 5.10.y 19/19] nfsd: make svc_stat per-network namespace instead of global cel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240905153101.59927-8-cel@kernel.org \
--to=cel@kernel.org \
--cc=calum.mackay@oracle.com \
--cc=jlayton@kernel.org \
--cc=kernel-team@fb.com \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.de \
--cc=pvorel@suse.cz \
--cc=sherry.yang@oracle.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.