summaryrefslogtreecommitdiffstats
path: root/utils/mountd
diff options
context:
space:
mode:
authorneilbrown <neilbrown>2004-09-06 02:15:04 +0000
committerneilbrown <neilbrown>2004-09-06 02:15:04 +0000
commitaf93e0306d87bba3f703386fd6390e9bf8e76816 (patch)
treeec1caa91d3ccb07af6bd36ff583148390e56ea1d /utils/mountd
parent2c91715a9c8dbf18df1666f70e78d6e36e123ca0 (diff)
downloadnfs-utils-af93e0306d87bba3f703386fd6390e9bf8e76816.tar.gz
nfs-utils-af93e0306d87bba3f703386fd6390e9bf8e76816.tar.xz
nfs-utils-af93e0306d87bba3f703386fd6390e9bf8e76816.zip
Support --ha-callout for high-availability callouts
Diffstat (limited to 'utils/mountd')
-rw-r--r--utils/mountd/mountd.c14
-rw-r--r--utils/mountd/mountd.man23
-rw-r--r--utils/mountd/rmtab.c10
3 files changed, 43 insertions, 4 deletions
diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c
index 8f6f9cb..7cc1b1b 100644
--- a/utils/mountd/mountd.c
+++ b/utils/mountd/mountd.c
@@ -36,6 +36,11 @@ static struct nfs_fh_len *get_rootfh(struct svc_req *, dirpath *, int *, int v3)
int new_cache = 0;
+/* PRC: a high-availability callout program can be specified with -H
+ * When this is done, the program will receive callouts whenever clients
+ * send mount or unmount requests -- the callout is not needed for 2.6 kernel */
+char *ha_callout_prog = NULL;
+
static struct option longopts[] =
{
{ "foreground", 0, 0, 'F' },
@@ -48,6 +53,7 @@ static struct option longopts[] =
{ "version", 0, 0, 'v' },
{ "port", 1, 0, 'p' },
{ "no-tcp", 0, 0, 'n' },
+ { "ha-callout", 1, 0, 'H' },
{ NULL, 0, 0, 0 }
};
@@ -444,7 +450,7 @@ main(int argc, char **argv)
/* Parse the command line options and arguments. */
opterr = 0;
- while ((c = getopt_long(argc, argv, "o:n:Fd:f:p:P:hN:V:v", longopts, NULL)) != EOF)
+ while ((c = getopt_long(argc, argv, "o:n:Fd:f:p:P:hH:N:V:v", longopts, NULL)) != EOF)
switch (c) {
case 'o':
descriptors = atoi(optarg);
@@ -463,6 +469,9 @@ main(int argc, char **argv)
case 'f':
export_file = optarg;
break;
+ case 'H': /* PRC: specify a high-availability callout program */
+ ha_callout_prog = optarg;
+ break;
case 'h':
usage(argv [0], 0);
break;
@@ -596,6 +605,7 @@ usage(const char *prog, int n)
"Usage: %s [-F|--foreground] [-h|--help] [-v|--version] [-d kind|--debug kind]\n"
" [-o num|--descriptors num] [-f exports-file|--exports-file=file]\n"
" [-p|--port port] [-V version|--nfs-version version]\n"
-" [-N version|--no-nfs-version version] [-n|--no-tcp]\n", prog);
+" [-N version|--no-nfs-version version] [-n|--no-tcp]\n"
+" [-H ha-callout-prog]\n", prog);
exit(n);
}
diff --git a/utils/mountd/mountd.man b/utils/mountd/mountd.man
index 3d2b1a8..64e508a 100644
--- a/utils/mountd/mountd.man
+++ b/utils/mountd/mountd.man
@@ -2,7 +2,8 @@
.\" mountd(8)
.\"
.\" Copyright (C) 1999 Olaf Kirch <okir@monad.swb.de>
-.TH rpc.mountd 8 "25 Aug 2000"
+.\" Modified by Paul Clements, 2004.
+.TH rpc.mountd 8 "31 Aug 2004"
.SH NAME
rpc.mountd \- NFS mount daemon
.SH SYNOPSIS
@@ -98,6 +99,26 @@ Force
to bind to the specified port num, instead of using the random port
number assigned by the portmapper.
.TP
+.B \-H " or " \-\-ha-callout prog
+Specify a high availability callout program, which will receive callouts
+for all client mount and unmount requests. This allows
+.B rpc.mountd
+to be used in a High Availability NFS (HA-NFS) environment. This callout is not
+needed (and should not be used) with 2.6 and later kernels (instead,
+mount the nfsd filesystem on
+.B /proc/fs/nfsd
+).
+The program will be called with 4 arguments.
+The first will be
+.B mount
+or
+.B unmount
+depending on the reason for the callout.
+The second will be the name of the client performing the mount.
+The third will be the path that the client is mounting.
+The last is the number of concurrent mounts that we believe the client
+has of that path.
+.TP
.B \-V " or " \-\-nfs-version
This option can be used to request that
.B rpc.mountd
diff --git a/utils/mountd/rmtab.c b/utils/mountd/rmtab.c
index 844de51..90fbef4 100644
--- a/utils/mountd/rmtab.c
+++ b/utils/mountd/rmtab.c
@@ -19,6 +19,7 @@
#include "exportfs.h"
#include "xio.h"
#include "mountd.h"
+#include "ha-callout.h"
#include <limits.h> /* PATH_MAX */
@@ -61,6 +62,8 @@ mountlist_add(char *host, const char *path)
host) == 0
&& strcmp(rep->r_path, path) == 0) {
rep->r_count++;
+ /* PRC: do the HA callout: */
+ ha_callout("mount", rep->r_client, rep->r_path, rep->r_count);
putrmtabent(rep, &pos);
endrmtabent();
xfunlock(lockid);
@@ -75,6 +78,8 @@ mountlist_add(char *host, const char *path)
xe.r_path [sizeof (xe.r_path) - 1] = '\0';
xe.r_count = 1;
if (setrmtabent("a")) {
+ /* PRC: do the HA callout: */
+ ha_callout("mount", xe.r_client, xe.r_path, xe.r_count);
putrmtabent(&xe, NULL);
endrmtabent();
}
@@ -103,8 +108,11 @@ mountlist_del(char *hname, const char *path)
while ((rep = getrmtabent(1, NULL)) != NULL) {
match = !strcmp (rep->r_client, hname)
&& !strcmp(rep->r_path, path);
- if (match)
+ if (match) {
rep->r_count--;
+ /* PRC: do the HA callout: */
+ ha_callout("unmount", rep->r_client, rep->r_path, rep->r_count);
+ }
if (!match || rep->r_count)
fputrmtabent(fp, rep, NULL);
}