summaryrefslogtreecommitdiffstats
path: root/usr.sbin/mountd
diff options
context:
space:
mode:
authorrmacklem <rmacklem@FreeBSD.org>2012-10-15 00:17:16 +0000
committerrmacklem <rmacklem@FreeBSD.org>2012-10-15 00:17:16 +0000
commit3b6779863aae43214bbd97da920155fd3c28722e (patch)
tree7afb0418c60c7c14e0b9dd1f86c05adf0f564c6a /usr.sbin/mountd
parent63907e64f4afa3f9fe9237e11c2aedcd371e33e0 (diff)
downloadFreeBSD-src-3b6779863aae43214bbd97da920155fd3c28722e.zip
FreeBSD-src-3b6779863aae43214bbd97da920155fd3c28722e.tar.gz
Add a new '-S' option to mountd, which tells it to suspend
execution of the nfsd threads while it is reloading the exports. This avoids clients from getting intermittent access errors when the exports are being reloaded non-atomically. It is not an ideal solution, since requests will back up while the nfsd threads are suspended. Also, when this option is used, if mountd crashes while reloading exports, mountd will have to be restarted to get the nfsd threads to resume execution. This has been tested by Vincent Hoffman (vince at unsane.co.uk) and John Hickey (jh at deterlab.net). The nfse patch offers a more comprehensive solution for this issue. PR: kern/9619, kern/131342 Reviewed by: kib MFC after: 2 weeks
Diffstat (limited to 'usr.sbin/mountd')
-rw-r--r--usr.sbin/mountd/mountd.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/usr.sbin/mountd/mountd.c b/usr.sbin/mountd/mountd.c
index b066fc7..543fc14 100644
--- a/usr.sbin/mountd/mountd.c
+++ b/usr.sbin/mountd/mountd.c
@@ -246,6 +246,7 @@ static int mallocd_svcport = 0;
static int *sock_fd;
static int sock_fdcnt;
static int sock_fdpos;
+static int suspend_nfsd = 0;
int opt_flags;
static int have_v6 = 1;
@@ -311,7 +312,7 @@ main(int argc, char **argv)
else
close(s);
- while ((c = getopt(argc, argv, "2deh:lnop:r")) != -1)
+ while ((c = getopt(argc, argv, "2deh:lnop:rS")) != -1)
switch (c) {
case '2':
force_v2 = 1;
@@ -363,6 +364,9 @@ main(int argc, char **argv)
out_of_mem();
}
break;
+ case 'S':
+ suspend_nfsd = 1;
+ break;
default:
usage();
};
@@ -921,7 +925,7 @@ usage(void)
{
fprintf(stderr,
"usage: mountd [-2] [-d] [-e] [-l] [-n] [-p <port>] [-r] "
- "[-h <bindip>] [export_file ...]\n");
+ "[-S] [-h <bindip>] [export_file ...]\n");
exit(1);
}
@@ -1659,6 +1663,8 @@ get_exportlist(void)
int done;
struct nfsex_args eargs;
+ if (suspend_nfsd != 0)
+ (void)nfssvc(NFSSVC_SUSPENDNFSD, NULL);
v4root_dirpath[0] = '\0';
bzero(&export, sizeof(export));
export.ex_flags = MNT_DELEXPORT;
@@ -1787,6 +1793,9 @@ get_exportlist(void)
*/
if (run_v4server > 0 && has_publicfh == 0)
(void) nfssvc(NFSSVC_NOPUBLICFH, NULL);
+
+ /* Resume the nfsd. If they weren't suspended, this is harmless. */
+ (void)nfssvc(NFSSVC_RESUMENFSD, NULL);
}
/*
OpenPOWER on IntegriCloud