From: "J. Bruce Fields" <bfields@redhat.com>
To: Jeff Layton <jlayton@redhat.com>
Cc: linux-nfs@vger.kernel.org, Jeff Layton <jlayton@redhat.com>,
"J. Bruce Fields" <bfields@redhat.com>
Subject: [PATCH 5/7] nfsd: just keep single lockd reference for nfsd
Date: Wed, 21 Jul 2010 19:26:49 -0400 [thread overview]
Message-ID: <1279754811-8328-5-git-send-email-bfields@redhat.com> (raw)
In-Reply-To: <20100721232432.GA6689@fieldses.org>
From: Jeff Layton <jlayton@redhat.com>
Right now, nfsd keeps a lockd reference for each socket that it has
open. This is unnecessary and complicates the error handling on
startup and shutdown. Change it to just do a lockd_up when starting
the first nfsd thread just do a single lockd_down when taking down the
last nfsd thread. Because of the strange way the sv_count is handled
this requires an extra flag to tell whether the nfsd_serv holds a
reference for lockd or not.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
---
fs/nfsd/nfsctl.c | 10 ----------
fs/nfsd/nfssvc.c | 25 ++++++++++++++-----------
2 files changed, 14 insertions(+), 21 deletions(-)
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index 9e8645a..b1c5be8 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -949,15 +949,8 @@ static ssize_t __write_ports_addfd(char *buf)
if (err != 0)
return err;
- err = lockd_up();
- if (err != 0) {
- svc_destroy(nfsd_serv);
- return err;
- }
-
err = svc_addsock(nfsd_serv, fd, buf, SIMPLE_TRANSACTION_LIMIT);
if (err < 0) {
- lockd_down();
svc_destroy(nfsd_serv);
return err;
}
@@ -982,9 +975,6 @@ static ssize_t __write_ports_delfd(char *buf)
if (nfsd_serv != NULL)
len = svc_sock_names(nfsd_serv, buf,
SIMPLE_TRANSACTION_LIMIT, toclose);
- if (len >= 0)
- lockd_down();
-
kfree(toclose);
return len;
}
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index a631ea6..8a556ff 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -186,8 +186,16 @@ static int nfsd_startup(unsigned short port, int nrservs)
{
int ret;
+ ret = lockd_up();
+ if (ret)
+ return ret;
ret = nfs4_state_start();
+ if (ret)
+ goto out_lockd;
nfsd_up = true;
+ return 0;
+out_lockd:
+ lockd_down();
return ret;
}
@@ -201,6 +209,7 @@ static void nfsd_shutdown(void)
*/
if (!nfsd_up)
return;
+ lockd_down();
nfs4_state_shutdown();
nfsd_up = false;
}
@@ -208,9 +217,6 @@ static void nfsd_shutdown(void)
static void nfsd_last_thread(struct svc_serv *serv)
{
/* When last nfsd thread exits we need to do some clean-up */
- struct svc_xprt *xprt;
- list_for_each_entry(xprt, &serv->sv_permsocks, xpt_list)
- lockd_down();
nfsd_serv = NULL;
nfsd_racache_shutdown();
nfsd_shutdown();
@@ -310,19 +316,11 @@ static int nfsd_init_socks(int port)
if (error < 0)
return error;
- error = lockd_up();
- if (error < 0)
- return error;
-
error = svc_create_xprt(nfsd_serv, "tcp", PF_INET, port,
SVC_SOCK_DEFAULTS);
if (error < 0)
return error;
- error = lockd_up();
- if (error < 0)
- return error;
-
return 0;
}
@@ -400,6 +398,11 @@ int nfsd_set_nrthreads(int n, int *nthreads)
return err;
}
+/*
+ * Adjust the number of threads and return the new number of threads.
+ * This is also the function that starts the server if necessary, if
+ * this is the first time nrservs is nonzero.
+ */
int
nfsd_svc(unsigned short port, int nrservs)
{
--
1.7.0.4
next prev parent reply other threads:[~2010-07-21 23:27 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-21 13:21 [PATCH 5/5] nfsd: just keep single lockd reference for nfsd (try #4) Jeff Layton
2010-07-21 20:14 ` J. Bruce Fields
2010-07-21 23:24 ` J. Bruce Fields
2010-07-21 23:26 ` [PATCH 1/7] nfsd4: fix v4 state shutdown error paths J. Bruce Fields
2010-07-21 23:26 ` [PATCH 2/7] nfsd: fix error handling when starting nfsd with rpcbind down J. Bruce Fields
2010-07-21 23:26 ` [PATCH 3/7] nfsd: fix error handling in __write_ports_addxprt J. Bruce Fields
2010-07-21 23:26 ` [PATCH 4/7] nfsd: clean up nfsd_create_serv error handling J. Bruce Fields
2010-07-21 23:26 ` J. Bruce Fields [this message]
2010-07-21 23:26 ` [PATCH 6/7] nfsd: move more into nfsd_startup() J. Bruce Fields
2010-07-21 23:26 ` [PATCH 7/7] nfsd: minor nfsd_svc() cleanup J. Bruce Fields
2010-07-22 17:40 ` [PATCH 5/5] nfsd: just keep single lockd reference for nfsd (try #4) Jeff Layton
[not found] ` <20100722134026.62091dc2-xSBYVWDuneFaJnirhKH9O4GKTjYczspe@public.gmane.org>
2010-07-23 12:55 ` J. Bruce Fields
2010-07-22 11:59 ` Staubach_Peter
2010-07-22 12:26 ` J. Bruce Fields
2010-07-22 12:36 ` Jeff Layton
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=1279754811-8328-5-git-send-email-bfields@redhat.com \
--to=bfields@redhat.com \
--cc=jlayton@redhat.com \
--cc=linux-nfs@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.