svn commit: r338706 - in projects/nfsv42/sys/fs: nfs nfsclient nfsserver
Rick Macklem
rmacklem at FreeBSD.org
Mon Sep 17 00:59:59 UTC 2018
Author: rmacklem
Date: Mon Sep 17 00:59:56 2018
New Revision: 338706
URL: https://svnweb.freebsd.org/changeset/base/338706
Log:
Add the basic support for NFSv4.2 to the client and server.
There are no new operations supported yet.
Modified:
projects/nfsv42/sys/fs/nfs/nfs.h
projects/nfsv42/sys/fs/nfs/nfs_commonsubs.c
projects/nfsv42/sys/fs/nfs/nfsport.h
projects/nfsv42/sys/fs/nfs/nfsproto.h
projects/nfsv42/sys/fs/nfsclient/nfs_clcomsubs.c
projects/nfsv42/sys/fs/nfsclient/nfs_clrpcops.c
projects/nfsv42/sys/fs/nfsclient/nfs_clstate.c
projects/nfsv42/sys/fs/nfsclient/nfs_clvfsops.c
projects/nfsv42/sys/fs/nfsserver/nfs_nfsdsocket.c
projects/nfsv42/sys/fs/nfsserver/nfs_nfsdstate.c
projects/nfsv42/sys/fs/nfsserver/nfs_nfsdsubs.c
Modified: projects/nfsv42/sys/fs/nfs/nfs.h
==============================================================================
--- projects/nfsv42/sys/fs/nfs/nfs.h Mon Sep 17 00:20:22 2018 (r338705)
+++ projects/nfsv42/sys/fs/nfs/nfs.h Mon Sep 17 00:59:56 2018 (r338706)
@@ -686,6 +686,7 @@ struct nfsrv_descript {
#define ND_CURSTATEID 0x80000000
#define ND_SAVEDCURSTATEID 0x100000000
#define ND_HASSLOTID 0x200000000
+#define ND_NFSV42 0x400000000
/*
* ND_GSS should be the "or" of all GSS type authentications.
Modified: projects/nfsv42/sys/fs/nfs/nfs_commonsubs.c
==============================================================================
--- projects/nfsv42/sys/fs/nfs/nfs_commonsubs.c Mon Sep 17 00:20:22 2018 (r338705)
+++ projects/nfsv42/sys/fs/nfs/nfs_commonsubs.c Mon Sep 17 00:59:56 2018 (r338706)
@@ -106,7 +106,7 @@ SYSCTL_INT(_vfs_nfs, OID_AUTO, pnfsmirror, CTLFLAG_RD,
* non-idempotent Ops.
* Define it here, since it is used by both the client and server.
*/
-struct nfsv4_opflag nfsv4_opflag[NFSV41_NOPS] = {
+struct nfsv4_opflag nfsv4_opflag[NFSV42_NOPS] = {
{ 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* undef */
{ 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* undef */
{ 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* undef */
@@ -166,6 +166,19 @@ struct nfsv4_opflag nfsv4_opflag[NFSV41_NOPS] = {
{ 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Want Delegation */
{ 0, 0, 0, 0, LK_EXCLUSIVE, 0, 0 }, /* Destroy ClientID */
{ 0, 0, 0, 0, LK_EXCLUSIVE, 1, 0 }, /* Reclaim Complete */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Allocate */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Copy */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Copy Notify */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Deallocate */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* IO Advise */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Layout Error */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Layout Stats */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Offload Cancel */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Offload Status */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Read Plus */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Seek */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Write Same */
+ { 0, 0, 0, 0, LK_EXCLUSIVE, 1, 1 }, /* Clone */
};
#endif /* !APPLEKEXT */
@@ -300,13 +313,17 @@ nfscl_reqstart(struct nfsrv_descript *nd, int procnum,
nd->nd_flag = ND_NFSV4 | ND_NFSCL;
if (minorvers == NFSV41_MINORVERSION)
nd->nd_flag |= ND_NFSV41;
+ else if (minorvers == NFSV42_MINORVERSION)
+ nd->nd_flag |= (ND_NFSV41 | ND_NFSV42);
} else if (vers == NFS_VER3)
nd->nd_flag = ND_NFSV3 | ND_NFSCL;
else {
if (NFSHASNFSV4(nmp)) {
nd->nd_flag = ND_NFSV4 | ND_NFSCL;
- if (NFSHASNFSV4N(nmp))
+ if (nmp->nm_minorvers == 1)
nd->nd_flag |= ND_NFSV41;
+ else if (nmp->nm_minorvers == 2)
+ nd->nd_flag |= (ND_NFSV41 | ND_NFSV42);
} else if (NFSHASNFSV3(nmp))
nd->nd_flag = ND_NFSV3 | ND_NFSCL;
else
@@ -355,7 +372,9 @@ nfscl_reqstart(struct nfsrv_descript *nd, int procnum,
(void) nfsm_strtom(nd, nfsv4_opmap[procnum].tag,
nfsv4_opmap[procnum].taglen);
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
- if ((nd->nd_flag & ND_NFSV41) != 0)
+ if ((nd->nd_flag & ND_NFSV42) != 0)
+ *tl++ = txdr_unsigned(NFSV42_MINORVERSION);
+ else if ((nd->nd_flag & ND_NFSV41) != 0)
*tl++ = txdr_unsigned(NFSV41_MINORVERSION);
else
*tl++ = txdr_unsigned(NFSV4_MINORVERSION);
Modified: projects/nfsv42/sys/fs/nfs/nfsport.h
==============================================================================
--- projects/nfsv42/sys/fs/nfs/nfsport.h Mon Sep 17 00:20:22 2018 (r338705)
+++ projects/nfsv42/sys/fs/nfs/nfsport.h Mon Sep 17 00:59:56 2018 (r338706)
@@ -257,9 +257,29 @@
/*
* Must be one more than last op#.
- * NFSv4.2 isn't implemented yet, but define the op# limit for it.
*/
#define NFSV41_NOPS 59
+
+/*
+ * Additional operations for NFSv4.2.
+ */
+#define NFSV4OP_ALLOCATE 59
+#define NFSV4OP_COPY 60
+#define NFSV4OP_COPYNOTIFY 61
+#define NFSV4OP_DEALLOCATE 62
+#define NFSV4OP_IOADVISE 63
+#define NFSV4OP_LAYOUTERROR 64
+#define NFSV4OP_LAYOUTSTATS 65
+#define NFSV4OP_OFFLOADCANCEL 66
+#define NFSV4OP_OFFLOADSTATUS 67
+#define NFSV4OP_READPLUS 68
+#define NFSV4OP_SEEK 69
+#define NFSV4OP_WRITESAME 70
+#define NFSV4OP_CLONE 71
+
+/*
+ * Must be one more than the last op#.
+ */
#define NFSV42_NOPS 72
/* Quirky case if the illegal op code */
@@ -309,6 +329,12 @@
#define NFSV4OP_CBNOTIFYDEVID 14
#define NFSV41_CBNOPS 15
+
+/*
+ * Additional callback operations for NFSv4.2.
+ */
+#define NFSV4OP_CBOFFLOAD 15
+
#define NFSV42_CBNOPS 16
/*
Modified: projects/nfsv42/sys/fs/nfs/nfsproto.h
==============================================================================
--- projects/nfsv42/sys/fs/nfs/nfsproto.h Mon Sep 17 00:20:22 2018 (r338705)
+++ projects/nfsv42/sys/fs/nfs/nfsproto.h Mon Sep 17 00:59:56 2018 (r338706)
@@ -78,6 +78,7 @@
#define NFS_FABLKSIZE 512 /* Size in bytes of a block wrt fa_blocks */
#define NFSV4_MINORVERSION 0 /* V4 Minor version */
#define NFSV41_MINORVERSION 1 /* V4 Minor version */
+#define NFSV42_MINORVERSION 2 /* V4 Minor version */
#define NFSV4_CBVERS 1 /* V4 CB Version */
#define NFSV41_CBVERS 4 /* V4.1 CB Version */
#define NFSV4_SMALLSTR 50 /* Strings small enough for stack */
@@ -920,6 +921,10 @@ struct nfsv3_sattr {
#define NFSATTRBIT_MODESETMASKED 74
#define NFSATTRBIT_SUPPATTREXCLCREAT 75
#define NFSATTRBIT_FSCHARSETCAP 76
+#define NFSATTRBIT_CLONEBLKSIZE 77
+#define NFSATTRBIT_SPACEFREED 78
+#define NFSATTRBIT_CHANGEATTRTYPE 79
+#define NFSATTRBIT_SECLABEL 80
#define NFSATTRBM_SUPPORTEDATTRS 0x00000001
#define NFSATTRBM_TYPE 0x00000002
@@ -998,8 +1003,12 @@ struct nfsv3_sattr {
#define NFSATTRBM_MODESETMASKED 0x00000400
#define NFSATTRBM_SUPPATTREXCLCREAT 0x00000800
#define NFSATTRBM_FSCHARSETCAP 0x00001000
+#define NFSATTRBM_CLONEBLKSIZE 0x00002000
+#define NFSATTRBM_SPACEFREED 0x00004000
+#define NFSATTRBM_CHANGEATTRTYPE 0x00008000
+#define NFSATTRBM_SECLABEL 0x00010000
-#define NFSATTRBIT_MAX 77
+#define NFSATTRBIT_MAX 81
/*
* Sets of attributes that are supported, by words in the bitmap.
Modified: projects/nfsv42/sys/fs/nfsclient/nfs_clcomsubs.c
==============================================================================
--- projects/nfsv42/sys/fs/nfsclient/nfs_clcomsubs.c Mon Sep 17 00:20:22 2018 (r338705)
+++ projects/nfsv42/sys/fs/nfsclient/nfs_clcomsubs.c Mon Sep 17 00:59:56 2018 (r338706)
@@ -45,7 +45,6 @@ __FBSDID("$FreeBSD$");
#include <fs/nfs/nfsport.h>
extern struct nfsstatsv1 nfsstatsv1;
-extern struct nfsv4_opflag nfsv4_opflag[NFSV41_NOPS];
extern int ncl_mbuf_mlen;
extern enum vtype newnv2tov_type[8];
extern enum vtype nv34tov_type[8];
Modified: projects/nfsv42/sys/fs/nfsclient/nfs_clrpcops.c
==============================================================================
--- projects/nfsv42/sys/fs/nfsclient/nfs_clrpcops.c Mon Sep 17 00:20:22 2018 (r338705)
+++ projects/nfsv42/sys/fs/nfsclient/nfs_clrpcops.c Mon Sep 17 00:59:56 2018 (r338706)
@@ -5091,9 +5091,10 @@ nfsrpc_getdeviceinfo(struct nfsmount *nmp, uint8_t *de
NFSM_DISSECT(tl, uint32_t *, 5 * NFSX_UNSIGNED);
vers = fxdr_unsigned(uint32_t, *tl++);
minorvers = fxdr_unsigned(uint32_t, *tl++);
- if ((vers == NFS_VER4 && minorvers ==
- NFSV41_MINORVERSION) || (vers == NFS_VER3 &&
- gotvers == 0)) {
+ if ((vers == NFS_VER4 && (minorvers ==
+ NFSV41_MINORVERSION || minorvers ==
+ NFSV42_MINORVERSION)) || (vers ==
+ NFS_VER3 && gotvers == 0)) {
gotvers = vers;
/* We'll take this one. */
ndi->nfsdi_versindex = i;
Modified: projects/nfsv42/sys/fs/nfsclient/nfs_clstate.c
==============================================================================
--- projects/nfsv42/sys/fs/nfsclient/nfs_clstate.c Mon Sep 17 00:20:22 2018 (r338705)
+++ projects/nfsv42/sys/fs/nfsclient/nfs_clstate.c Mon Sep 17 00:59:56 2018 (r338706)
@@ -3283,7 +3283,9 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)
NFSM_BUILD(retopsp, u_int32_t *, NFSX_UNSIGNED);
NFSM_DISSECT(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
minorvers = fxdr_unsigned(u_int32_t, *tl++);
- if (minorvers != NFSV4_MINORVERSION && minorvers != NFSV41_MINORVERSION)
+ if (minorvers != NFSV4_MINORVERSION &&
+ minorvers != NFSV41_MINORVERSION &&
+ minorvers != NFSV42_MINORVERSION)
nd->nd_repstat = NFSERR_MINORVERMISMATCH;
cbident = fxdr_unsigned(u_int32_t, *tl++);
if (nd->nd_repstat)
@@ -3301,14 +3303,16 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)
if (op < NFSV4OP_CBGETATTR ||
(op > NFSV4OP_CBRECALL && minorvers == NFSV4_MINORVERSION) ||
(op > NFSV4OP_CBNOTIFYDEVID &&
- minorvers == NFSV41_MINORVERSION)) {
+ minorvers == NFSV41_MINORVERSION) ||
+ (op > NFSV4OP_CBOFFLOAD &&
+ minorvers == NFSV42_MINORVERSION)) {
nd->nd_repstat = NFSERR_OPILLEGAL;
*repp = nfscl_errmap(nd, minorvers);
retops++;
break;
}
nd->nd_procnum = op;
- if (op < NFSV41_CBNOPS)
+ if (op < NFSV42_CBNOPS)
nfsstatsv1.cbrpccnt[nd->nd_procnum]++;
switch (op) {
case NFSV4OP_CBGETATTR:
@@ -3610,7 +3614,7 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)
}
break;
default:
- if (i == 0 && minorvers == NFSV41_MINORVERSION)
+ if (i == 0 && minorvers != NFSV4_MINORVERSION)
error = NFSERR_OPNOTINSESS;
else {
NFSCL_DEBUG(1, "unsupp callback %d\n", op);
Modified: projects/nfsv42/sys/fs/nfsclient/nfs_clvfsops.c
==============================================================================
--- projects/nfsv42/sys/fs/nfsclient/nfs_clvfsops.c Mon Sep 17 00:20:22 2018 (r338705)
+++ projects/nfsv42/sys/fs/nfsclient/nfs_clvfsops.c Mon Sep 17 00:59:56 2018 (r338706)
@@ -1150,7 +1150,7 @@ nfs_mount(struct mount *mp)
if (vfs_getopt(mp->mnt_optnew, "minorversion", (void **)&opt, NULL) ==
0) {
ret = sscanf(opt, "%d", &minvers);
- if (ret != 1 || minvers < 0 || minvers > 1 ||
+ if (ret != 1 || minvers < 0 || minvers > 2 ||
(args.flags & NFSMNT_NFSV4) == 0) {
vfs_mount_error(mp, "illegal minorversion: %s", opt);
error = EINVAL;
Modified: projects/nfsv42/sys/fs/nfsserver/nfs_nfsdsocket.c
==============================================================================
--- projects/nfsv42/sys/fs/nfsserver/nfs_nfsdsocket.c Mon Sep 17 00:20:22 2018 (r338705)
+++ projects/nfsv42/sys/fs/nfsserver/nfs_nfsdsocket.c Mon Sep 17 00:59:56 2018 (r338706)
@@ -137,7 +137,7 @@ int (*nfsrv3_procs2[NFS_V3NPROCS])(struct nfsrv_descri
(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
};
-int (*nfsrv4_ops0[NFSV41_NOPS])(struct nfsrv_descript *,
+int (*nfsrv4_ops0[NFSV42_NOPS])(struct nfsrv_descript *,
int, vnode_t , NFSPROC_T *, struct nfsexstuff *) = {
(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
@@ -198,9 +198,22 @@ int (*nfsrv4_ops0[NFSV41_NOPS])(struct nfsrv_descript
nfsrvd_notsupp,
nfsrvd_destroyclientid,
nfsrvd_reclaimcomplete,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
+ nfsrvd_notsupp,
};
-int (*nfsrv4_ops1[NFSV41_NOPS])(struct nfsrv_descript *,
+int (*nfsrv4_ops1[NFSV42_NOPS])(struct nfsrv_descript *,
int, vnode_t , vnode_t *, fhandle_t *,
NFSPROC_T *, struct nfsexstuff *) = {
(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
@@ -262,9 +275,22 @@ int (*nfsrv4_ops1[NFSV41_NOPS])(struct nfsrv_descript
(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
};
-int (*nfsrv4_ops2[NFSV41_NOPS])(struct nfsrv_descript *,
+int (*nfsrv4_ops2[NFSV42_NOPS])(struct nfsrv_descript *,
int, vnode_t , vnode_t , NFSPROC_T *,
struct nfsexstuff *, struct nfsexstuff *) = {
(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
@@ -326,6 +352,19 @@ int (*nfsrv4_ops2[NFSV41_NOPS])(struct nfsrv_descript
(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
+ (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
};
#endif /* !APPLEKEXT */
@@ -377,7 +416,7 @@ static void nfsrvd_compound(struct nfsrv_descript *nd,
static int nfs_retfh[NFS_V3NPROCS] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1,
1, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0 };
-extern struct nfsv4_opflag nfsv4_opflag[NFSV41_NOPS];
+extern struct nfsv4_opflag nfsv4_opflag[NFSV42_NOPS];
static int nfsv3to4op[NFS_V3NPROCS] = {
NFSPROC_NULL,
@@ -746,7 +785,9 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram
(void) nfsm_strtom(nd, tag, taglen);
NFSM_BUILD(retopsp, u_int32_t *, NFSX_UNSIGNED);
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
- if (minorvers != NFSV4_MINORVERSION && minorvers != NFSV41_MINORVERSION)
+ if (minorvers != NFSV4_MINORVERSION &&
+ minorvers != NFSV41_MINORVERSION &&
+ minorvers != NFSV42_MINORVERSION)
nd->nd_repstat = NFSERR_MINORVERMISMATCH;
if (nd->nd_repstat)
numops = 0;
@@ -771,9 +812,9 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram
nfsrvd_statstart(op, &start_time);
statsinprog = 1;
- if (op < NFSV4OP_ACCESS ||
+ if (op < NFSV4OP_ACCESS || op >= NFSV42_NOPS ||
(op >= NFSV4OP_NOPS && (nd->nd_flag & ND_NFSV41) == 0) ||
- (op >= NFSV41_NOPS && (nd->nd_flag & ND_NFSV41) != 0)) {
+ (op >= NFSV41_NOPS && (nd->nd_flag & ND_NFSV42) == 0)) {
nd->nd_repstat = NFSERR_OPILLEGAL;
*repp++ = txdr_unsigned(NFSV4OP_OPILLEGAL);
*repp = nfsd_errmap(nd);
Modified: projects/nfsv42/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/nfsv42/sys/fs/nfsserver/nfs_nfsdstate.c Mon Sep 17 00:20:22 2018 (r338705)
+++ projects/nfsv42/sys/fs/nfsserver/nfs_nfsdstate.c Mon Sep 17 00:59:56 2018 (r338706)
@@ -4478,7 +4478,10 @@ nfsrv_cbcallargs(struct nfsrv_descript *nd, struct nfs
(void)nfsm_strtom(nd, optag, len);
NFSM_BUILD(tl, uint32_t *, 4 * NFSX_UNSIGNED);
if ((nd->nd_flag & ND_NFSV41) != 0) {
- *tl++ = txdr_unsigned(NFSV41_MINORVERSION);
+ if ((nd->nd_flag & ND_NFSV42) != 0)
+ *tl++ = txdr_unsigned(NFSV42_MINORVERSION);
+ else
+ *tl++ = txdr_unsigned(NFSV41_MINORVERSION);
*tl++ = txdr_unsigned(callback);
*tl++ = txdr_unsigned(2);
*tl = txdr_unsigned(NFSV4OP_CBSEQUENCE);
Modified: projects/nfsv42/sys/fs/nfsserver/nfs_nfsdsubs.c
==============================================================================
--- projects/nfsv42/sys/fs/nfsserver/nfs_nfsdsubs.c Mon Sep 17 00:20:22 2018 (r338705)
+++ projects/nfsv42/sys/fs/nfsserver/nfs_nfsdsubs.c Mon Sep 17 00:59:56 2018 (r338706)
@@ -2121,6 +2121,8 @@ nfsd_getminorvers(struct nfsrv_descript *nd, u_char *t
*tagstrp = tagstr;
if (*minversp == NFSV41_MINORVERSION)
nd->nd_flag |= ND_NFSV41;
+ else if (*minversp == NFSV42_MINORVERSION)
+ nd->nd_flag |= (ND_NFSV41 | ND_NFSV42);
nfsmout:
if (error != 0) {
if (tagstr != NULL && taglen > NFSV4_SMALLSTR)
More information about the svn-src-projects
mailing list