nfscl: Change the default minor version for NFSv4 mounts

When NFSv4.1 support was added to the client, the implementation was
still experimental and, as such, the default minor version was set to 0.
Since the NFSv4.1 client implementation is now believed to be solid
and the NFSv4.1/4.2 protocol is significantly better than NFSv4.0,
I beieve that NFSv4.1/4.2 should be used where possible.

This patch changes the default minor version for NFSv4 to be the highest
minor version supported by the NFSv4 server. If a specific minor version
is desired, the "minorversion" mount option can be used to override
this default.  This is compatible with the Linux NFSv4 client behaviour.

This was discussed on freebsd-current@ in mid-May 2021 under
the subject "changing the default NFSv4 minor version" and
the consensus seemed to be support for this change.
It also appeared that changing this for FreeBSD 13.1 was
not considered a POLA violation, so long as UPDATING
and RELNOTES entries were made for it.

MFC after:	2 weeks
This commit is contained in:
Rick Macklem
2021-06-24 18:52:23 -07:00
parent c94249decd
commit a145cf3f73
2 changed files with 18 additions and 5 deletions
+8 -1
View File
@@ -959,11 +959,18 @@ nfscl_getcl(struct mount *mp, struct ucred *cred, NFSPROC_T *p,
error == NFSERR_BADSESSION || error == NFSERR_BADSESSION ||
error == NFSERR_CLIDINUSE) { error == NFSERR_CLIDINUSE) {
(void) nfs_catnap(PZERO, error, "nfs_setcl"); (void) nfs_catnap(PZERO, error, "nfs_setcl");
} else if (error == NFSERR_MINORVERMISMATCH &&
tryminvers) {
if (nmp->nm_minorvers > 0)
nmp->nm_minorvers--;
else
tryminvers = false;
} }
} while (((error == NFSERR_STALECLIENTID || } while (((error == NFSERR_STALECLIENTID ||
error == NFSERR_BADSESSION || error == NFSERR_BADSESSION ||
error == NFSERR_STALEDONTRECOVER) && --trystalecnt > 0) || error == NFSERR_STALEDONTRECOVER) && --trystalecnt > 0) ||
(error == NFSERR_CLIDINUSE && --clidinusedelay > 0)); (error == NFSERR_CLIDINUSE && --clidinusedelay > 0) ||
(error == NFSERR_MINORVERMISMATCH && tryminvers));
if (error) { if (error) {
NFSLOCKCLSTATE(); NFSLOCKCLSTATE();
nfsv4_unlock(&clp->nfsc_lock, 0); nfsv4_unlock(&clp->nfsc_lock, 0);
+10 -4
View File
@@ -897,7 +897,7 @@ nfs_mount(struct mount *mp)
char *cp, *opt, *name, *secname, *tlscertname; char *cp, *opt, *name, *secname, *tlscertname;
int nametimeo = NFS_DEFAULT_NAMETIMEO; int nametimeo = NFS_DEFAULT_NAMETIMEO;
int negnametimeo = NFS_DEFAULT_NEGNAMETIMEO; int negnametimeo = NFS_DEFAULT_NEGNAMETIMEO;
int minvers = 0; int minvers = -1;
int dirlen, has_nfs_args_opt, has_nfs_from_opt, int dirlen, has_nfs_args_opt, has_nfs_from_opt,
krbnamelen, srvkrbnamelen; krbnamelen, srvkrbnamelen;
size_t hstlen; size_t hstlen;
@@ -1419,6 +1419,7 @@ mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam,
struct nfsclclient *clp; struct nfsclclient *clp;
struct nfsclds *dsp, *tdsp; struct nfsclds *dsp, *tdsp;
uint32_t lease; uint32_t lease;
bool tryminvers;
static u_int64_t clval = 0; static u_int64_t clval = 0;
#ifdef KERN_TLS #ifdef KERN_TLS
u_int maxlen; u_int maxlen;
@@ -1523,9 +1524,14 @@ mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam,
nmp->nm_wcommitsize *= 2; nmp->nm_wcommitsize *= 2;
nmp->nm_wcommitsize *= 256; nmp->nm_wcommitsize *= 256;
if ((argp->flags & NFSMNT_NFSV4) != 0) tryminvers = false;
if ((argp->flags & NFSMNT_NFSV4) != 0) {
if (minvers < 0) {
tryminvers = true;
minvers = NFSV42_MINORVERSION;
}
nmp->nm_minorvers = minvers; nmp->nm_minorvers = minvers;
else } else
nmp->nm_minorvers = 0; nmp->nm_minorvers = 0;
nfs_decode_args(mp, nmp, argp, hst, cred, td); nfs_decode_args(mp, nmp, argp, hst, cred, td);
@@ -1576,7 +1582,7 @@ mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam,
/* For NFSv4, get the clientid now. */ /* For NFSv4, get the clientid now. */
if ((argp->flags & NFSMNT_NFSV4) != 0) { if ((argp->flags & NFSMNT_NFSV4) != 0) {
NFSCL_DEBUG(3, "at getcl\n"); NFSCL_DEBUG(3, "at getcl\n");
error = nfscl_getcl(mp, cred, td, false, &clp); error = nfscl_getcl(mp, cred, td, tryminvers, &clp);
NFSCL_DEBUG(3, "aft getcl=%d\n", error); NFSCL_DEBUG(3, "aft getcl=%d\n", error);
if (error != 0) if (error != 0)
goto bad; goto bad;