2017-02-22 18:48:27

by Trond Myklebust

[permalink] [raw]
Subject: [PATCH] nfsd: Allow enabling NFSv4.x without also requiring NFSv4.0

For some setups, we may want to allow clients to fall back to NFSv3, or
even to fail, if a specific minor version of NFSv4 is not enabled.
For instance, an application that relies on NFSv4.2 CLONE functionality
is simply not going to work when it falls back to NFSv4.1 or NFSv4.

Signed-off-by: Trond Myklebust <[email protected]>
---
fs/nfsd/nfsctl.c | 16 ++++++++--------
fs/nfsd/nfssvc.c | 14 ++++++++++++++
2 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index f3b2f34b10a3..81b6a0aa4b92 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -561,6 +561,7 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
len = qword_get(&mesg, vers, size);
if (len <= 0) return -EINVAL;
do {
+ enum vers_op cmd;
sign = *vers;
if (sign == '+' || sign == '-')
num = simple_strtol((vers+1), &minorp, 0);
@@ -572,21 +573,20 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
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;
- }
+ } else
+ minor = 0;
+ cmd = sign == '-' ? NFSD_CLEAR : NFSD_SET;
switch(num) {
case 2:
case 3:
- case 4:
- nfsd_vers(num, sign == '-' ? NFSD_CLEAR : NFSD_SET);
+ nfsd_vers(num, cmd);
break;
+ case 4:
+ if (nfsd_minorversion(minor, cmd) >= 0)
+ break;
default:
return -EINVAL;
}
- next:
vers += len + 1;
} while ((len = qword_get(&mesg, vers, size)) > 0);
/* If all get turned off, turn them back on, as
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index e6bfd96734c0..07bf3bd9687b 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -153,6 +153,18 @@ int nfsd_vers(int vers, enum vers_op change)
return 0;
}

+static void
+nfsd_adjust_nfsd_versions4(void)
+{
+ unsigned i;
+
+ for (i = 0; i <= NFSD_SUPPORTED_MINOR_VERSION; i++) {
+ if (nfsd_supported_minorversions[i])
+ return;
+ }
+ nfsd_vers(4, NFSD_CLEAR);
+}
+
int nfsd_minorversion(u32 minorversion, enum vers_op change)
{
if (minorversion > NFSD_SUPPORTED_MINOR_VERSION)
@@ -160,9 +172,11 @@ int nfsd_minorversion(u32 minorversion, enum vers_op change)
switch(change) {
case NFSD_SET:
nfsd_supported_minorversions[minorversion] = true;
+ nfsd_vers(4, NFSD_SET);
break;
case NFSD_CLEAR:
nfsd_supported_minorversions[minorversion] = false;
+ nfsd_adjust_nfsd_versions4();
break;
case NFSD_TEST:
return nfsd_supported_minorversions[minorversion];
--
2.9.3



2017-02-22 21:16:38

by J. Bruce Fields

[permalink] [raw]
Subject: Re: [PATCH] nfsd: Allow enabling NFSv4.x without also requiring NFSv4.0

On Wed, Feb 22, 2017 at 01:48:22PM -0500, Trond Myklebust wrote:
> For some setups, we may want to allow clients to fall back to NFSv3, or
> even to fail, if a specific minor version of NFSv4 is not enabled.
> For instance, an application that relies on NFSv4.2 CLONE functionality
> is simply not going to work when it falls back to NFSv4.1 or NFSv4.

I have a patch of Neil's queued up for 4.11 that claims to accomplish
the same thing:

http://git.linux-nfs.org/?p=bfields/linux.git;a=commit;h=e35659f1b03c03946cae8abb6b0a9e170b574f1c

If it's deficient in some way, could you make an incremental patch?

--b.

>
> Signed-off-by: Trond Myklebust <[email protected]>
> ---
> fs/nfsd/nfsctl.c | 16 ++++++++--------
> fs/nfsd/nfssvc.c | 14 ++++++++++++++
> 2 files changed, 22 insertions(+), 8 deletions(-)
>
> diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
> index f3b2f34b10a3..81b6a0aa4b92 100644
> --- a/fs/nfsd/nfsctl.c
> +++ b/fs/nfsd/nfsctl.c
> @@ -561,6 +561,7 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
> len = qword_get(&mesg, vers, size);
> if (len <= 0) return -EINVAL;
> do {
> + enum vers_op cmd;
> sign = *vers;
> if (sign == '+' || sign == '-')
> num = simple_strtol((vers+1), &minorp, 0);
> @@ -572,21 +573,20 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
> 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;
> - }
> + } else
> + minor = 0;
> + cmd = sign == '-' ? NFSD_CLEAR : NFSD_SET;
> switch(num) {
> case 2:
> case 3:
> - case 4:
> - nfsd_vers(num, sign == '-' ? NFSD_CLEAR : NFSD_SET);
> + nfsd_vers(num, cmd);
> break;
> + case 4:
> + if (nfsd_minorversion(minor, cmd) >= 0)
> + break;
> default:
> return -EINVAL;
> }
> - next:
> vers += len + 1;
> } while ((len = qword_get(&mesg, vers, size)) > 0);
> /* If all get turned off, turn them back on, as
> diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
> index e6bfd96734c0..07bf3bd9687b 100644
> --- a/fs/nfsd/nfssvc.c
> +++ b/fs/nfsd/nfssvc.c
> @@ -153,6 +153,18 @@ int nfsd_vers(int vers, enum vers_op change)
> return 0;
> }
>
> +static void
> +nfsd_adjust_nfsd_versions4(void)
> +{
> + unsigned i;
> +
> + for (i = 0; i <= NFSD_SUPPORTED_MINOR_VERSION; i++) {
> + if (nfsd_supported_minorversions[i])
> + return;
> + }
> + nfsd_vers(4, NFSD_CLEAR);
> +}
> +
> int nfsd_minorversion(u32 minorversion, enum vers_op change)
> {
> if (minorversion > NFSD_SUPPORTED_MINOR_VERSION)
> @@ -160,9 +172,11 @@ int nfsd_minorversion(u32 minorversion, enum vers_op change)
> switch(change) {
> case NFSD_SET:
> nfsd_supported_minorversions[minorversion] = true;
> + nfsd_vers(4, NFSD_SET);
> break;
> case NFSD_CLEAR:
> nfsd_supported_minorversions[minorversion] = false;
> + nfsd_adjust_nfsd_versions4();
> break;
> case NFSD_TEST:
> return nfsd_supported_minorversions[minorversion];
> --
> 2.9.3

2017-02-22 22:18:07

by Trond Myklebust

[permalink] [raw]
Subject: Re: [PATCH] nfsd: Allow enabling NFSv4.x without also requiring NFSv4.0

T24gV2VkLCAyMDE3LTAyLTIyIGF0IDE1OjUwIC0wNTAwLCBKLiBCcnVjZSBGaWVsZHMgd3JvdGU6
DQo+IE9uIFdlZCwgRmViIDIyLCAyMDE3IGF0IDAxOjQ4OjIyUE0gLTA1MDAsIFRyb25kIE15a2xl
YnVzdCB3cm90ZToNCj4gPiBGb3Igc29tZSBzZXR1cHMsIHdlIG1heSB3YW50IHRvIGFsbG93IGNs
aWVudHMgdG8gZmFsbCBiYWNrIHRvDQo+ID4gTkZTdjMsIG9yDQo+ID4gZXZlbiB0byBmYWlsLCBp
ZiBhIHNwZWNpZmljIG1pbm9yIHZlcnNpb24gb2YgTkZTdjQgaXMgbm90IGVuYWJsZWQuDQo+ID4g
Rm9yIGluc3RhbmNlLCBhbiBhcHBsaWNhdGlvbiB0aGF0IHJlbGllcyBvbiBORlN2NC4yIENMT05F
DQo+ID4gZnVuY3Rpb25hbGl0eQ0KPiA+IGlzIHNpbXBseSBub3QgZ29pbmcgdG8gd29yayB3aGVu
IGl0IGZhbGxzIGJhY2sgdG8gTkZTdjQuMSBvciBORlN2NC4NCj4gDQo+IEkgaGF2ZSBhIHBhdGNo
IG9mIE5laWwncyBxdWV1ZWQgdXAgZm9yIDQuMTEgdGhhdCBjbGFpbXMgdG8gYWNjb21wbGlzaA0K
PiB0aGUgc2FtZSB0aGluZzoNCj4gDQo+IAlodHRwOi8vZ2l0LmxpbnV4LW5mcy5vcmcvP3A9YmZp
ZWxkcy9saW51eC5naXQ7YT1jb21taXQ7aD1lMzU2NTkNCj4gZjFiMDNjMDM5NDZjYWU4YWJiNmIw
YTllMTcwYjU3NGYxYw0KPiANCj4gSWYgaXQncyBkZWZpY2llbnQgaW4gc29tZSB3YXksIGNvdWxk
IHlvdSBtYWtlIGFuIGluY3JlbWVudGFsIHBhdGNoPw0KPiANCg0KVW5sZXNzIEknbSBtaXNzaW5n
IHNvbWV0aGluZywgaXQgbG9va3MgYXMgaWYgdGhhdCB3aWxsIHN0aWxsIGVuZCB1cA0KcmV0dXJu
aW5nIG5mc2Vycl9taW5vcl92ZXJzX21pc21hdGNoIHdoZW4geW91IGRpc2FibGUgYWxsIHRoZSBt
aW5vcg0KdmVyc2lvbnMgaW4gTkZTdjQuDQoNCkluIHRoZSBwYXRjaCBJIHNlbnQsIHdlIGNhbGwg
bmZzZF92ZXJzKCkgaW4gdGhhdCBjYXNlLCBzbyB0aGF0IGtuZnNkDQpyZXR1cm5zIHRoZSBSUEMg
bGV2ZWwgZXJyb3IuDQoNCk15IHBhdGNoIGRvZXMgbmVlZCB0byBmaXggdXAgdGhlIGRpc3BsYXkg
b2YgdGhlIE5GUyBtaW5vciB2ZXJzaW9uIGluZm8uDQpJJ3ZlIGdvdCBhIHNlY29uZCBwYXRjaCB0
aGF0IGRvZXMgc28uDQoNCldpbGwgZml4IGJvdGggdXAgYW5kIHJlc2VuZCBpbmNyZW1lbnRhbGx5
IGFnYWluc3QgTmVpbCdzIHBhdGNoLg0KDQo+IC0tYi4NCj4gDQo+ID4gDQo+ID4gU2lnbmVkLW9m
Zi1ieTogVHJvbmQgTXlrbGVidXN0IDx0cm9uZC5teWtsZWJ1c3RAcHJpbWFyeWRhdGEuY29tPg0K
PiA+IC0tLQ0KPiA+IMKgZnMvbmZzZC9uZnNjdGwuYyB8IDE2ICsrKysrKysrLS0tLS0tLS0NCj4g
PiDCoGZzL25mc2QvbmZzc3ZjLmMgfCAxNCArKysrKysrKysrKysrKw0KPiA+IMKgMiBmaWxlcyBj
aGFuZ2VkLCAyMiBpbnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQ0KPiA+IA0KPiA+IGRpZmYg
LS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuYw0KPiA+IGluZGV4IGYz
YjJmMzRiMTBhMy4uODFiNmEwYWE0YjkyIDEwMDY0NA0KPiA+IC0tLSBhL2ZzL25mc2QvbmZzY3Rs
LmMNCj4gPiArKysgYi9mcy9uZnNkL25mc2N0bC5jDQo+ID4gQEAgLTU2MSw2ICs1NjEsNyBAQCBz
dGF0aWMgc3NpemVfdCBfX3dyaXRlX3ZlcnNpb25zKHN0cnVjdCBmaWxlDQo+ID4gKmZpbGUsIGNo
YXIgKmJ1Ziwgc2l6ZV90IHNpemUpDQo+ID4gwqAJCWxlbiA9IHF3b3JkX2dldCgmbWVzZywgdmVy
cywgc2l6ZSk7DQo+ID4gwqAJCWlmIChsZW4gPD0gMCkgcmV0dXJuIC1FSU5WQUw7DQo+ID4gwqAJ
CWRvIHsNCj4gPiArCQkJZW51bSB2ZXJzX29wIGNtZDsNCj4gPiDCoAkJCXNpZ24gPSAqdmVyczsN
Cj4gPiDCoAkJCWlmIChzaWduID09ICcrJyB8fCBzaWduID09ICctJykNCj4gPiDCoAkJCQludW0g
PSBzaW1wbGVfc3RydG9sKCh2ZXJzKzEpLA0KPiA+ICZtaW5vcnAsIDApOw0KPiA+IEBAIC01NzIs
MjEgKzU3MywyMCBAQCBzdGF0aWMgc3NpemVfdCBfX3dyaXRlX3ZlcnNpb25zKHN0cnVjdCBmaWxl
DQo+ID4gKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpDQo+ID4gwqAJCQkJbWlub3IgPSBz
aW1wbGVfc3RydG91bChtaW5vcnArMSwNCj4gPiBOVUxMLCAwKTsNCj4gPiDCoAkJCQlpZiAobWlu
b3IgPT0gMCkNCj4gPiDCoAkJCQkJcmV0dXJuIC1FSU5WQUw7DQo+ID4gLQkJCQlpZiAobmZzZF9t
aW5vcnZlcnNpb24obWlub3IsIHNpZ24NCj4gPiA9PSAnLScgPw0KPiA+IC0JCQkJCQnCoMKgwqDC
oMKgTkZTRF9DTEVBUiA6DQo+ID4gTkZTRF9TRVQpIDwgMCkNCj4gPiAtCQkJCQlyZXR1cm4gLUVJ
TlZBTDsNCj4gPiAtCQkJCWdvdG8gbmV4dDsNCj4gPiAtCQkJfQ0KPiA+ICsJCQl9IGVsc2UNCj4g
PiArCQkJCW1pbm9yID0gMDsNCj4gPiArCQkJY21kID0gc2lnbiA9PSAnLScgPyBORlNEX0NMRUFS
IDogTkZTRF9TRVQ7DQo+ID4gwqAJCQlzd2l0Y2gobnVtKSB7DQo+ID4gwqAJCQljYXNlIDI6DQo+
ID4gwqAJCQljYXNlIDM6DQo+ID4gLQkJCWNhc2UgNDoNCj4gPiAtCQkJCW5mc2RfdmVycyhudW0s
IHNpZ24gPT0gJy0nID8NCj4gPiBORlNEX0NMRUFSIDogTkZTRF9TRVQpOw0KPiA+ICsJCQkJbmZz
ZF92ZXJzKG51bSwgY21kKTsNCj4gPiDCoAkJCQlicmVhazsNCj4gPiArCQkJY2FzZSA0Og0KPiA+
ICsJCQkJaWYgKG5mc2RfbWlub3J2ZXJzaW9uKG1pbm9yLCBjbWQpDQo+ID4gPj0gMCkNCj4gPiAr
CQkJCQlicmVhazsNCj4gPiDCoAkJCWRlZmF1bHQ6DQo+ID4gwqAJCQkJcmV0dXJuIC1FSU5WQUw7
DQo+ID4gwqAJCQl9DQo+ID4gLQkJbmV4dDoNCj4gPiDCoAkJCXZlcnMgKz0gbGVuICsgMTsNCj4g
PiDCoAkJfSB3aGlsZSAoKGxlbiA9IHF3b3JkX2dldCgmbWVzZywgdmVycywgc2l6ZSkpID4NCj4g
PiAwKTsNCj4gPiDCoAkJLyogSWYgYWxsIGdldCB0dXJuZWQgb2ZmLCB0dXJuIHRoZW0gYmFjayBv
biwgYXMNCj4gPiBkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNzdmMuYyBiL2ZzL25mc2QvbmZzc3Zj
LmMNCj4gPiBpbmRleCBlNmJmZDk2NzM0YzAuLjA3YmYzYmQ5Njg3YiAxMDA2NDQNCj4gPiAtLS0g
YS9mcy9uZnNkL25mc3N2Yy5jDQo+ID4gKysrIGIvZnMvbmZzZC9uZnNzdmMuYw0KPiA+IEBAIC0x
NTMsNiArMTUzLDE4IEBAIGludCBuZnNkX3ZlcnMoaW50IHZlcnMsIGVudW0gdmVyc19vcCBjaGFu
Z2UpDQo+ID4gwqAJcmV0dXJuIDA7DQo+ID4gwqB9DQo+ID4gwqANCj4gPiArc3RhdGljIHZvaWQN
Cj4gPiArbmZzZF9hZGp1c3RfbmZzZF92ZXJzaW9uczQodm9pZCkNCj4gPiArew0KPiA+ICsJdW5z
aWduZWQgaTsNCj4gPiArDQo+ID4gKwlmb3IgKGkgPSAwOyBpIDw9IE5GU0RfU1VQUE9SVEVEX01J
Tk9SX1ZFUlNJT047IGkrKykgew0KPiA+ICsJCWlmIChuZnNkX3N1cHBvcnRlZF9taW5vcnZlcnNp
b25zW2ldKQ0KPiA+ICsJCQlyZXR1cm47DQo+ID4gKwl9DQo+ID4gKwluZnNkX3ZlcnMoNCwgTkZT
RF9DTEVBUik7DQo+ID4gK30NCj4gPiArDQo+ID4gwqBpbnQgbmZzZF9taW5vcnZlcnNpb24odTMy
IG1pbm9ydmVyc2lvbiwgZW51bSB2ZXJzX29wIGNoYW5nZSkNCj4gPiDCoHsNCj4gPiDCoAlpZiAo
bWlub3J2ZXJzaW9uID4gTkZTRF9TVVBQT1JURURfTUlOT1JfVkVSU0lPTikNCj4gPiBAQCAtMTYw
LDkgKzE3MiwxMSBAQCBpbnQgbmZzZF9taW5vcnZlcnNpb24odTMyIG1pbm9ydmVyc2lvbiwgZW51
bQ0KPiA+IHZlcnNfb3AgY2hhbmdlKQ0KPiA+IMKgCXN3aXRjaChjaGFuZ2UpIHsNCj4gPiDCoAlj
YXNlIE5GU0RfU0VUOg0KPiA+IMKgCQluZnNkX3N1cHBvcnRlZF9taW5vcnZlcnNpb25zW21pbm9y
dmVyc2lvbl0gPSB0cnVlOw0KPiA+ICsJCW5mc2RfdmVycyg0LCBORlNEX1NFVCk7DQo+ID4gwqAJ
CWJyZWFrOw0KPiA+IMKgCWNhc2UgTkZTRF9DTEVBUjoNCj4gPiDCoAkJbmZzZF9zdXBwb3J0ZWRf
bWlub3J2ZXJzaW9uc1ttaW5vcnZlcnNpb25dID0NCj4gPiBmYWxzZTsNCj4gPiArCQluZnNkX2Fk
anVzdF9uZnNkX3ZlcnNpb25zNCgpOw0KPiA+IMKgCQlicmVhazsNCj4gPiDCoAljYXNlIE5GU0Rf
VEVTVDoNCj4gPiDCoAkJcmV0dXJuIG5mc2Rfc3VwcG9ydGVkX21pbm9ydmVyc2lvbnNbbWlub3J2
ZXJzaW9uXTsNCj4gPiAtLcKgDQo+ID4gMi45LjMNCj4gDQo+IA0KLS0gDQpUcm9uZCBNeWtsZWJ1
c3QNCkxpbnV4IE5GUyBjbGllbnQgbWFpbnRhaW5lciwgUHJpbWFyeURhdGENCnRyb25kLm15a2xl
YnVzdEBwcmltYXJ5ZGF0YS5jb20NCg==