Commit 35f7a14f authored by J. Bruce Fields's avatar J. Bruce Fields

nfsd4: fix minorversion support interface

You can turn on or off support for minorversions using e.g.

	echo "-4.2" >/proc/fs/nfsd/versions

However, the current implementation is a little wonky.  For example, the
above will turn off 4.2 support, but it will also turn *on* 4.1 support.

This didn't matter as long as we only had 2 minorversions, which was
true till very recently.

And do a little cleanup here.
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 1c327d96
...@@ -1293,7 +1293,7 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, ...@@ -1293,7 +1293,7 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,
* According to RFC3010, this takes precedence over all other errors. * According to RFC3010, this takes precedence over all other errors.
*/ */
status = nfserr_minor_vers_mismatch; status = nfserr_minor_vers_mismatch;
if (args->minorversion > nfsd_supported_minorversion) if (nfsd_minorversion(args->minorversion, NFSD_TEST) <= 0)
goto out; goto out;
status = nfs41_check_op_ordering(args); status = nfs41_check_op_ordering(args);
......
...@@ -53,7 +53,6 @@ struct readdir_cd { ...@@ -53,7 +53,6 @@ struct readdir_cd {
extern struct svc_program nfsd_program; extern struct svc_program nfsd_program;
extern struct svc_version nfsd_version2, nfsd_version3, extern struct svc_version nfsd_version2, nfsd_version3,
nfsd_version4; nfsd_version4;
extern u32 nfsd_supported_minorversion;
extern struct mutex nfsd_mutex; extern struct mutex nfsd_mutex;
extern spinlock_t nfsd_drc_lock; extern spinlock_t nfsd_drc_lock;
extern unsigned long nfsd_drc_max_mem; extern unsigned long nfsd_drc_max_mem;
......
...@@ -116,7 +116,10 @@ struct svc_program nfsd_program = { ...@@ -116,7 +116,10 @@ struct svc_program nfsd_program = {
}; };
u32 nfsd_supported_minorversion = 1; static bool nfsd_supported_minorversions[NFSD_SUPPORTED_MINOR_VERSION + 1] = {
[0] = 1,
[1] = 1,
};
int nfsd_vers(int vers, enum vers_op change) int nfsd_vers(int vers, enum vers_op change)
{ {
...@@ -151,15 +154,13 @@ int nfsd_minorversion(u32 minorversion, enum vers_op change) ...@@ -151,15 +154,13 @@ int nfsd_minorversion(u32 minorversion, enum vers_op change)
return -1; return -1;
switch(change) { switch(change) {
case NFSD_SET: case NFSD_SET:
nfsd_supported_minorversion = minorversion; nfsd_supported_minorversions[minorversion] = true;
break; break;
case NFSD_CLEAR: case NFSD_CLEAR:
if (minorversion == 0) nfsd_supported_minorversions[minorversion] = false;
return -1;
nfsd_supported_minorversion = minorversion - 1;
break; break;
case NFSD_TEST: case NFSD_TEST:
return minorversion <= nfsd_supported_minorversion; return nfsd_supported_minorversions[minorversion];
case NFSD_AVAIL: case NFSD_AVAIL:
return minorversion <= NFSD_SUPPORTED_MINOR_VERSION; return minorversion <= NFSD_SUPPORTED_MINOR_VERSION;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment