diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2017-04-04 17:57:26 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2017-04-05 13:27:57 -0400 |
commit | d53fe5fe72d2b8d645ad362840da42021363384d (patch) | |
tree | 49c6aab2abbbf3e254de0e0a6c786c455ca40ad6 /utils/nfsd/nfsd.c | |
parent | c9eab79f70e80df51829193858304a797621ecdd (diff) | |
download | nfs-utils-d53fe5fe72d2b8d645ad362840da42021363384d.tar.gz nfs-utils-d53fe5fe72d2b8d645ad362840da42021363384d.tar.xz nfs-utils-d53fe5fe72d2b8d645ad362840da42021363384d.zip |
nfsd: Allow the caller to turn off NFSv4.0 without turning off NFSv4.x
The new semantic is that '-N4' turns off all NFSv4 minor versions, while
'-V4' turns them all on. In order to turn off just minor version x (x >= 0),
use -N4.x, and to turn it back on. '-V4.x'.
Note that on older kernels, attempting to use -N4.0 and -V4.0 is
equivalent to specifying -N4 or -V4.
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/nfsd/nfsd.c')
-rw-r--r-- | utils/nfsd/nfsd.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c index 20f4b79..1708521 100644 --- a/utils/nfsd/nfsd.c +++ b/utils/nfsd/nfsd.c @@ -67,6 +67,7 @@ main(int argc, char **argv) int socket_up = 0; unsigned int minorvers = 0; unsigned int minorversset = 0; + unsigned int minormask = 0; unsigned int versbits = NFSCTL_VERDEFAULT; unsigned int protobits = NFSCTL_ALLBITS; int grace = -1; @@ -104,10 +105,16 @@ main(int argc, char **argv) else NFSCTL_VERUNSET(versbits, i); } + + nfssvc_get_minormask(&minormask); /* We assume the kernel will default all minor versions to 'on', * and allow the config file to disable some. */ - for (i = NFS4_MINMINOR; i <= NFS4_MAXMINOR; i++) { + if (NFSCTL_VERISSET(versbits, 4)) { + NFSCTL_MINORSET(minorversset, 0); + NFSCTL_MINORSET(minorvers, 0); + } + for (i = 1; i <= NFS4_MAXMINOR; i++) { char tag[20]; sprintf(tag, "vers4.%d", i); /* The default for minor version support is to let the @@ -119,12 +126,12 @@ main(int argc, char **argv) * (i.e. don't set the bit in minorversset). */ if (!conf_get_bool("nfsd", tag, 1)) { - NFSCTL_VERSET(minorversset, i); - NFSCTL_VERUNSET(minorvers, i); + NFSCTL_MINORSET(minorversset, i); + NFSCTL_MINORUNSET(minorvers, i); } if (conf_get_bool("nfsd", tag, 0)) { - NFSCTL_VERSET(minorversset, i); - NFSCTL_VERSET(minorvers, i); + NFSCTL_MINORSET(minorversset, i); + NFSCTL_MINORSET(minorvers, i); } } @@ -179,13 +186,17 @@ main(int argc, char **argv) case 4: if (*p == '.') { int i = atoi(p+1); - if (i < NFS4_MINMINOR || i > NFS4_MAXMINOR) { + if (i < 0 || i > NFS4_MAXMINOR) { fprintf(stderr, "%s: unsupported minor version\n", optarg); exit(1); } - NFSCTL_VERSET(minorversset, i); - NFSCTL_VERUNSET(minorvers, i); - break; + NFSCTL_MINORSET(minorversset, i); + NFSCTL_MINORUNSET(minorvers, i); + if (minorvers != 0) + break; + } else { + minorvers = 0; + minorversset = minormask; } case 3: case 2: @@ -201,14 +212,14 @@ main(int argc, char **argv) case 4: if (*p == '.') { int i = atoi(p+1); - if (i < NFS4_MINMINOR || i > NFS4_MAXMINOR) { + if (i < 0 || i > NFS4_MAXMINOR) { fprintf(stderr, "%s: unsupported minor version\n", optarg); exit(1); } - NFSCTL_VERSET(minorversset, i); - NFSCTL_VERSET(minorvers, i); - break; - } + NFSCTL_MINORSET(minorversset, i); + NFSCTL_MINORSET(minorvers, i); + } else + minorvers = minorversset = minormask; case 3: case 2: NFSCTL_VERSET(versbits, c); |