|
@@ -792,8 +792,9 @@ out_free:
|
|
|
static ssize_t __write_versions(struct file *file, char *buf, size_t size)
|
|
|
{
|
|
|
char *mesg = buf;
|
|
|
- char *vers, sign;
|
|
|
+ char *vers, *minorp, sign;
|
|
|
int len, num;
|
|
|
+ unsigned minor;
|
|
|
ssize_t tlen = 0;
|
|
|
char *sep;
|
|
|
|
|
@@ -814,9 +815,20 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
|
|
|
do {
|
|
|
sign = *vers;
|
|
|
if (sign == '+' || sign == '-')
|
|
|
- num = simple_strtol((vers+1), NULL, 0);
|
|
|
+ num = simple_strtol((vers+1), &minorp, 0);
|
|
|
else
|
|
|
- num = simple_strtol(vers, NULL, 0);
|
|
|
+ num = simple_strtol(vers, &minorp, 0);
|
|
|
+ if (*minorp == '.') {
|
|
|
+ if (num < 4)
|
|
|
+ return -EINVAL;
|
|
|
+ minor = simple_strtoul(minorp+1, NULL, 0);
|
|
|
+ if (minor == 0)
|
|
|
+ return -EINVAL;
|
|
|
+ if (nfsd_minorversion(minor, sign == '-' ?
|
|
|
+ NFSD_CLEAR : NFSD_SET) < 0)
|
|
|
+ return -EINVAL;
|
|
|
+ goto next;
|
|
|
+ }
|
|
|
switch(num) {
|
|
|
case 2:
|
|
|
case 3:
|
|
@@ -826,6 +838,7 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
|
|
|
default:
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
+ next:
|
|
|
vers += len + 1;
|
|
|
tlen += len;
|
|
|
} while ((len = qword_get(&mesg, vers, size)) > 0);
|
|
@@ -844,6 +857,13 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
|
|
|
num);
|
|
|
sep = " ";
|
|
|
}
|
|
|
+ if (nfsd_vers(4, NFSD_AVAIL))
|
|
|
+ for (minor = 1; minor <= NFSD_SUPPORTED_MINOR_VERSION; minor++)
|
|
|
+ len += sprintf(buf+len, " %c4.%u",
|
|
|
+ (nfsd_vers(4, NFSD_TEST) &&
|
|
|
+ nfsd_minorversion(minor, NFSD_TEST)) ?
|
|
|
+ '+' : '-',
|
|
|
+ minor);
|
|
|
len += sprintf(buf+len, "\n");
|
|
|
return len;
|
|
|
}
|