Skip to content

Commit d3635ff

Browse files
trondmypdJ. Bruce Fields
authored andcommitted
nfsd: fix configuration of supported minor versions
When the user turns off all minor versions of NFSv4, that should be equivalent to turning off NFSv4 support, so a mount attempt using NFSv4 should get RPC_PROG_MISMATCH, not NFSERR_MINOR_VERS_MISMATCH. Allow the user to use either '4.0' or '4' to enable or disable minor version 0. Other minor versions are still enabled or disabled using the '4.x' format. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
1 parent 7259f1d commit d3635ff

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

fs/nfsd/nfsctl.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,7 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
561561
len = qword_get(&mesg, vers, size);
562562
if (len <= 0) return -EINVAL;
563563
do {
564+
enum vers_op cmd;
564565
sign = *vers;
565566
if (sign == '+' || sign == '-')
566567
num = simple_strtol((vers+1), &minorp, 0);
@@ -571,21 +572,20 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
571572
return -EINVAL;
572573
if (kstrtouint(minorp+1, 0, &minor) < 0)
573574
return -EINVAL;
574-
if (nfsd_minorversion(minor, sign == '-' ?
575-
NFSD_CLEAR : NFSD_SET) < 0)
576-
return -EINVAL;
577-
goto next;
578-
}
575+
} else
576+
minor = 0;
577+
cmd = sign == '-' ? NFSD_CLEAR : NFSD_SET;
579578
switch(num) {
580579
case 2:
581580
case 3:
582-
case 4:
583-
nfsd_vers(num, sign == '-' ? NFSD_CLEAR : NFSD_SET);
581+
nfsd_vers(num, cmd);
584582
break;
583+
case 4:
584+
if (nfsd_minorversion(minor, cmd) >= 0)
585+
break;
585586
default:
586587
return -EINVAL;
587588
}
588-
next:
589589
vers += len + 1;
590590
} while ((len = qword_get(&mesg, vers, size)) > 0);
591591
/* If all get turned off, turn them back on, as

fs/nfsd/nfssvc.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,16 +153,30 @@ int nfsd_vers(int vers, enum vers_op change)
153153
return 0;
154154
}
155155

156+
static void
157+
nfsd_adjust_nfsd_versions4(void)
158+
{
159+
unsigned i;
160+
161+
for (i = 0; i <= NFSD_SUPPORTED_MINOR_VERSION; i++) {
162+
if (nfsd_supported_minorversions[i])
163+
return;
164+
}
165+
nfsd_vers(4, NFSD_CLEAR);
166+
}
167+
156168
int nfsd_minorversion(u32 minorversion, enum vers_op change)
157169
{
158170
if (minorversion > NFSD_SUPPORTED_MINOR_VERSION)
159171
return -1;
160172
switch(change) {
161173
case NFSD_SET:
162174
nfsd_supported_minorversions[minorversion] = true;
175+
nfsd_vers(4, NFSD_SET);
163176
break;
164177
case NFSD_CLEAR:
165178
nfsd_supported_minorversions[minorversion] = false;
179+
nfsd_adjust_nfsd_versions4();
166180
break;
167181
case NFSD_TEST:
168182
return nfsd_supported_minorversions[minorversion];

0 commit comments

Comments
 (0)