svn commit: r335130 - in head/sys/fs: nfs nfsclient

Rick Macklem rmacklem at FreeBSD.org
Thu Jun 14 10:00:21 UTC 2018


Author: rmacklem
Date: Thu Jun 14 10:00:19 2018
New Revision: 335130
URL: https://svnweb.freebsd.org/changeset/base/335130

Log:
  Move four functions in nfscl.ko to nfscommon.ko.
  
  Four functions nfscl_reqstart(), nfscl_fillsattr(), nfsm_stateidtom()
  and nfsmnt_mdssession() are now called from within the nfsd.
  As such, they needed to be moved from nfscl.ko to nfscommon.ko so that
  nfsd.ko would load when nfscl.ko wasn't loaded.
  
  Reported by:	herbert at gojira.at

Modified:
  head/sys/fs/nfs/nfs_commonsubs.c
  head/sys/fs/nfs/nfs_var.h
  head/sys/fs/nfs/nfsport.h
  head/sys/fs/nfsclient/nfs_clcomsubs.c
  head/sys/fs/nfsclient/nfs_clport.c
  head/sys/fs/nfsclient/nfsmount.h

Modified: head/sys/fs/nfs/nfs_commonsubs.c
==============================================================================
--- head/sys/fs/nfs/nfs_commonsubs.c	Thu Jun 14 09:36:25 2018	(r335129)
+++ head/sys/fs/nfs/nfs_commonsubs.c	Thu Jun 14 10:00:19 2018	(r335130)
@@ -79,6 +79,7 @@ extern struct mtx nfsrv_dslock_mtx;
 extern volatile int nfsrv_devidcnt;
 extern int nfscl_debuglevel;
 extern struct nfsdevicehead nfsrv_devidhead;
+extern struct nfsstatsv1 nfsstatsv1;
 
 SYSCTL_DECL(_vfs_nfs);
 SYSCTL_INT(_vfs_nfs, OID_AUTO, enable_uidtostring, CTLFLAG_RW,
@@ -189,7 +190,7 @@ static struct nfsrv_lughash	*nfsgroupnamehash;
  * marked 0 in this array, the code will still work, just not quite as
  * efficiently.)
  */
-int nfs_bigreply[NFSV41_NPROCS] = { 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0,
+static int nfs_bigreply[NFSV41_NPROCS] = { 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 };
 
@@ -204,6 +205,362 @@ static int nfsrv_getrefstr(struct nfsrv_descript *, u_
     int *, int *);
 static void nfsrv_refstrbigenough(int, u_char **, u_char **, int *);
 
+static struct {
+	int	op;
+	int	opcnt;
+	const u_char *tag;
+	int	taglen;
+} nfsv4_opmap[NFSV41_NPROCS] = {
+	{ 0, 1, "Null", 4 },
+	{ NFSV4OP_GETATTR, 1, "Getattr", 7, },
+	{ NFSV4OP_SETATTR, 2, "Setattr", 7, },
+	{ NFSV4OP_LOOKUP, 3, "Lookup", 6, },
+	{ NFSV4OP_ACCESS, 2, "Access", 6, },
+	{ NFSV4OP_READLINK, 2, "Readlink", 8, },
+	{ NFSV4OP_READ, 1, "Read", 4, },
+	{ NFSV4OP_WRITE, 2, "Write", 5, },
+	{ NFSV4OP_OPEN, 5, "Open", 4, },
+	{ NFSV4OP_CREATE, 5, "Create", 6, },
+	{ NFSV4OP_CREATE, 1, "Create", 6, },
+	{ NFSV4OP_CREATE, 3, "Create", 6, },
+	{ NFSV4OP_REMOVE, 1, "Remove", 6, },
+	{ NFSV4OP_REMOVE, 1, "Remove", 6, },
+	{ NFSV4OP_SAVEFH, 5, "Rename", 6, },
+	{ NFSV4OP_SAVEFH, 4, "Link", 4, },
+	{ NFSV4OP_READDIR, 2, "Readdir", 7, },
+	{ NFSV4OP_READDIR, 2, "Readdir", 7, },
+	{ NFSV4OP_GETATTR, 1, "Getattr", 7, },
+	{ NFSV4OP_GETATTR, 1, "Getattr", 7, },
+	{ NFSV4OP_GETATTR, 1, "Getattr", 7, },
+	{ NFSV4OP_COMMIT, 2, "Commit", 6, },
+	{ NFSV4OP_LOOKUPP, 3, "Lookupp", 7, },
+	{ NFSV4OP_SETCLIENTID, 1, "SetClientID", 11, },
+	{ NFSV4OP_SETCLIENTIDCFRM, 1, "SetClientIDConfirm", 18, },
+	{ NFSV4OP_LOCK, 1, "Lock", 4, },
+	{ NFSV4OP_LOCKU, 1, "LockU", 5, },
+	{ NFSV4OP_OPEN, 2, "Open", 4, },
+	{ NFSV4OP_CLOSE, 1, "Close", 5, },
+	{ NFSV4OP_OPENCONFIRM, 1, "Openconfirm", 11, },
+	{ NFSV4OP_LOCKT, 1, "LockT", 5, },
+	{ NFSV4OP_OPENDOWNGRADE, 1, "Opendowngrade", 13, },
+	{ NFSV4OP_RENEW, 1, "Renew", 5, },
+	{ NFSV4OP_PUTROOTFH, 1, "Dirpath", 7, },
+	{ NFSV4OP_RELEASELCKOWN, 1, "Rellckown", 9, },
+	{ NFSV4OP_DELEGRETURN, 1, "Delegret", 8, },
+	{ NFSV4OP_DELEGRETURN, 3, "DelegRemove", 11, },
+	{ NFSV4OP_DELEGRETURN, 7, "DelegRename1", 12, },
+	{ NFSV4OP_DELEGRETURN, 9, "DelegRename2", 12, },
+	{ NFSV4OP_GETATTR, 1, "Getacl", 6, },
+	{ NFSV4OP_SETATTR, 1, "Setacl", 6, },
+	{ NFSV4OP_EXCHANGEID, 1, "ExchangeID", 10, },
+	{ NFSV4OP_CREATESESSION, 1, "CreateSession", 13, },
+	{ NFSV4OP_DESTROYSESSION, 1, "DestroySession", 14, },
+	{ NFSV4OP_DESTROYCLIENTID, 1, "DestroyClient", 13, },
+	{ NFSV4OP_FREESTATEID, 1, "FreeStateID", 11, },
+	{ NFSV4OP_LAYOUTGET, 1, "LayoutGet", 9, },
+	{ NFSV4OP_GETDEVINFO, 1, "GetDeviceInfo", 13, },
+	{ NFSV4OP_LAYOUTCOMMIT, 1, "LayoutCommit", 12, },
+	{ NFSV4OP_LAYOUTRETURN, 1, "LayoutReturn", 12, },
+	{ NFSV4OP_RECLAIMCOMPL, 1, "ReclaimComplete", 15, },
+	{ NFSV4OP_WRITE, 1, "WriteDS", 7, },
+	{ NFSV4OP_READ, 1, "ReadDS", 6, },
+	{ NFSV4OP_COMMIT, 1, "CommitDS", 8, },
+	{ NFSV4OP_OPEN, 3, "OpenLayoutGet", 13, },
+	{ NFSV4OP_OPEN, 8, "CreateLayGet", 12, },
+};
+
+/*
+ * NFS RPCS that have large request message size.
+ */
+static int nfs_bigrequest[NFSV41_NPROCS] = {
+	0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0
+};
+
+/*
+ * Start building a request. Mostly just put the first file handle in
+ * place.
+ */
+APPLESTATIC void
+nfscl_reqstart(struct nfsrv_descript *nd, int procnum, struct nfsmount *nmp,
+    u_int8_t *nfhp, int fhlen, u_int32_t **opcntpp, struct nfsclsession *sep,
+    int vers, int minorvers)
+{
+	struct mbuf *mb;
+	u_int32_t *tl;
+	int opcnt;
+	nfsattrbit_t attrbits;
+
+	/*
+	 * First, fill in some of the fields of nd.
+	 */
+	nd->nd_slotseq = NULL;
+	if (vers == NFS_VER4) {
+		nd->nd_flag = ND_NFSV4 | ND_NFSCL;
+		if (minorvers == NFSV41_MINORVERSION)
+			nd->nd_flag |= ND_NFSV41;
+	} 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))
+				nd->nd_flag |= ND_NFSV41;
+		} else if (NFSHASNFSV3(nmp))
+			nd->nd_flag = ND_NFSV3 | ND_NFSCL;
+		else
+			nd->nd_flag = ND_NFSV2 | ND_NFSCL;
+	}
+	nd->nd_procnum = procnum;
+	nd->nd_repstat = 0;
+
+	/*
+	 * Get the first mbuf for the request.
+	 */
+	if (nfs_bigrequest[procnum])
+		NFSMCLGET(mb, M_WAITOK);
+	else
+		NFSMGET(mb);
+	mbuf_setlen(mb, 0);
+	nd->nd_mreq = nd->nd_mb = mb;
+	nd->nd_bpos = NFSMTOD(mb, caddr_t);
+	
+	/*
+	 * And fill the first file handle into the request.
+	 */
+	if (nd->nd_flag & ND_NFSV4) {
+		opcnt = nfsv4_opmap[procnum].opcnt +
+		    nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh;
+		if ((nd->nd_flag & ND_NFSV41) != 0) {
+			opcnt += nfsv4_opflag[nfsv4_opmap[procnum].op].needsseq;
+			if (procnum == NFSPROC_RENEW)
+				/*
+				 * For the special case of Renew, just do a
+				 * Sequence Op.
+				 */
+				opcnt = 1;
+			else if (procnum == NFSPROC_WRITEDS ||
+			    procnum == NFSPROC_COMMITDS)
+				/*
+				 * For the special case of a Writeor Commit to
+				 * a DS, the opcnt == 3, for Sequence, PutFH,
+				 * Write/Commit.
+				 */
+				opcnt = 3;
+		}
+		/*
+		 * What should the tag really be?
+		 */
+		(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)
+			*tl++ = txdr_unsigned(NFSV41_MINORVERSION);
+		else
+			*tl++ = txdr_unsigned(NFSV4_MINORVERSION);
+		if (opcntpp != NULL)
+			*opcntpp = tl;
+		*tl = txdr_unsigned(opcnt);
+		if ((nd->nd_flag & ND_NFSV41) != 0 &&
+		    nfsv4_opflag[nfsv4_opmap[procnum].op].needsseq > 0) {
+			if (nfsv4_opflag[nfsv4_opmap[procnum].op].loopbadsess >
+			    0)
+				nd->nd_flag |= ND_LOOPBADSESS;
+			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+			*tl = txdr_unsigned(NFSV4OP_SEQUENCE);
+			if (sep == NULL) {
+				sep = nfsmnt_mdssession(nmp);
+				nfsv4_setsequence(nmp, nd, sep,
+				    nfs_bigreply[procnum]);
+			} else
+				nfsv4_setsequence(nmp, nd, sep,
+				    nfs_bigreply[procnum]);
+		}
+		if (nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh > 0) {
+			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+			*tl = txdr_unsigned(NFSV4OP_PUTFH);
+			(void) nfsm_fhtom(nd, nfhp, fhlen, 0);
+			if (nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh
+			    == 2 && procnum != NFSPROC_WRITEDS &&
+			    procnum != NFSPROC_COMMITDS) {
+				NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+				*tl = txdr_unsigned(NFSV4OP_GETATTR);
+				/*
+				 * For Lookup Ops, we want all the directory
+				 * attributes, so we can load the name cache.
+				 */
+				if (procnum == NFSPROC_LOOKUP ||
+				    procnum == NFSPROC_LOOKUPP)
+					NFSGETATTR_ATTRBIT(&attrbits);
+				else {
+					NFSWCCATTR_ATTRBIT(&attrbits);
+					nd->nd_flag |= ND_V4WCCATTR;
+				}
+				(void) nfsrv_putattrbit(nd, &attrbits);
+			}
+		}
+		if (procnum != NFSPROC_RENEW ||
+		    (nd->nd_flag & ND_NFSV41) == 0) {
+			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+			*tl = txdr_unsigned(nfsv4_opmap[procnum].op);
+		}
+	} else {
+		(void) nfsm_fhtom(nd, nfhp, fhlen, 0);
+	}
+	if (procnum < NFSV41_NPROCS)
+		NFSINCRGLOBAL(nfsstatsv1.rpccnt[procnum]);
+}
+
+/*
+ * Put a state Id in the mbuf list.
+ */
+APPLESTATIC void
+nfsm_stateidtom(struct nfsrv_descript *nd, nfsv4stateid_t *stateidp, int flag)
+{
+	nfsv4stateid_t *st;
+
+	NFSM_BUILD(st, nfsv4stateid_t *, NFSX_STATEID);
+	if (flag == NFSSTATEID_PUTALLZERO) {
+		st->seqid = 0;
+		st->other[0] = 0;
+		st->other[1] = 0;
+		st->other[2] = 0;
+	} else if (flag == NFSSTATEID_PUTALLONE) {
+		st->seqid = 0xffffffff;
+		st->other[0] = 0xffffffff;
+		st->other[1] = 0xffffffff;
+		st->other[2] = 0xffffffff;
+	} else if (flag == NFSSTATEID_PUTSEQIDZERO) {
+		st->seqid = 0;
+		st->other[0] = stateidp->other[0];
+		st->other[1] = stateidp->other[1];
+		st->other[2] = stateidp->other[2];
+	} else {
+		st->seqid = stateidp->seqid;
+		st->other[0] = stateidp->other[0];
+		st->other[1] = stateidp->other[1];
+		st->other[2] = stateidp->other[2];
+	}
+}
+
+/*
+ * Fill in the setable attributes. The full argument indicates whether
+ * to fill in them all or just mode and time.
+ */
+void
+nfscl_fillsattr(struct nfsrv_descript *nd, struct vattr *vap,
+    struct vnode *vp, int flags, u_int32_t rdev)
+{
+	u_int32_t *tl;
+	struct nfsv2_sattr *sp;
+	nfsattrbit_t attrbits;
+
+	switch (nd->nd_flag & (ND_NFSV2 | ND_NFSV3 | ND_NFSV4)) {
+	case ND_NFSV2:
+		NFSM_BUILD(sp, struct nfsv2_sattr *, NFSX_V2SATTR);
+		if (vap->va_mode == (mode_t)VNOVAL)
+			sp->sa_mode = newnfs_xdrneg1;
+		else
+			sp->sa_mode = vtonfsv2_mode(vap->va_type, vap->va_mode);
+		if (vap->va_uid == (uid_t)VNOVAL)
+			sp->sa_uid = newnfs_xdrneg1;
+		else
+			sp->sa_uid = txdr_unsigned(vap->va_uid);
+		if (vap->va_gid == (gid_t)VNOVAL)
+			sp->sa_gid = newnfs_xdrneg1;
+		else
+			sp->sa_gid = txdr_unsigned(vap->va_gid);
+		if (flags & NFSSATTR_SIZE0)
+			sp->sa_size = 0;
+		else if (flags & NFSSATTR_SIZENEG1)
+			sp->sa_size = newnfs_xdrneg1;
+		else if (flags & NFSSATTR_SIZERDEV)
+			sp->sa_size = txdr_unsigned(rdev);
+		else
+			sp->sa_size = txdr_unsigned(vap->va_size);
+		txdr_nfsv2time(&vap->va_atime, &sp->sa_atime);
+		txdr_nfsv2time(&vap->va_mtime, &sp->sa_mtime);
+		break;
+	case ND_NFSV3:
+		if (vap->va_mode != (mode_t)VNOVAL) {
+			NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+			*tl++ = newnfs_true;
+			*tl = txdr_unsigned(vap->va_mode);
+		} else {
+			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+			*tl = newnfs_false;
+		}
+		if ((flags & NFSSATTR_FULL) && vap->va_uid != (uid_t)VNOVAL) {
+			NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+			*tl++ = newnfs_true;
+			*tl = txdr_unsigned(vap->va_uid);
+		} else {
+			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+			*tl = newnfs_false;
+		}
+		if ((flags & NFSSATTR_FULL) && vap->va_gid != (gid_t)VNOVAL) {
+			NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+			*tl++ = newnfs_true;
+			*tl = txdr_unsigned(vap->va_gid);
+		} else {
+			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+			*tl = newnfs_false;
+		}
+		if ((flags & NFSSATTR_FULL) && vap->va_size != VNOVAL) {
+			NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
+			*tl++ = newnfs_true;
+			txdr_hyper(vap->va_size, tl);
+		} else {
+			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+			*tl = newnfs_false;
+		}
+		if (vap->va_atime.tv_sec != VNOVAL) {
+			if ((vap->va_vaflags & VA_UTIMES_NULL) == 0) {
+				NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
+				*tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT);
+				txdr_nfsv3time(&vap->va_atime, tl);
+			} else {
+				NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+				*tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);
+			}
+		} else {
+			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+			*tl = txdr_unsigned(NFSV3SATTRTIME_DONTCHANGE);
+		}
+		if (vap->va_mtime.tv_sec != VNOVAL) {
+			if ((vap->va_vaflags & VA_UTIMES_NULL) == 0) {
+				NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
+				*tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT);
+				txdr_nfsv3time(&vap->va_mtime, tl);
+			} else {
+				NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+				*tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);
+			}
+		} else {
+			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+			*tl = txdr_unsigned(NFSV3SATTRTIME_DONTCHANGE);
+		}
+		break;
+	case ND_NFSV4:
+		NFSZERO_ATTRBIT(&attrbits);
+		if (vap->va_mode != (mode_t)VNOVAL)
+			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_MODE);
+		if ((flags & NFSSATTR_FULL) && vap->va_uid != (uid_t)VNOVAL)
+			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_OWNER);
+		if ((flags & NFSSATTR_FULL) && vap->va_gid != (gid_t)VNOVAL)
+			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_OWNERGROUP);
+		if ((flags & NFSSATTR_FULL) && vap->va_size != VNOVAL)
+			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);
+		if (vap->va_atime.tv_sec != VNOVAL)
+			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEACCESSSET);
+		if (vap->va_mtime.tv_sec != VNOVAL)
+			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEMODIFYSET);
+		(void) nfsv4_fillattr(nd, vp->v_mount, vp, NULL, vap, NULL, 0,
+		    &attrbits, NULL, NULL, 0, 0, 0, 0, (uint64_t)0, NULL);
+		break;
+	}
+}
 
 #ifndef APPLE
 /*

Modified: head/sys/fs/nfs/nfs_var.h
==============================================================================
--- head/sys/fs/nfs/nfs_var.h	Thu Jun 14 09:36:25 2018	(r335129)
+++ head/sys/fs/nfs/nfs_var.h	Thu Jun 14 10:00:19 2018	(r335130)
@@ -298,6 +298,11 @@ void nfsrvd_delcache(struct nfsrvcache *);
 void nfsrc_trimcache(uint64_t, uint32_t, int);
 
 /* nfs_commonsubs.c */
+void nfscl_reqstart(struct nfsrv_descript *, int, struct nfsmount *,
+    u_int8_t *, int, u_int32_t **, struct nfsclsession *, int, int);
+void nfsm_stateidtom(struct nfsrv_descript *, nfsv4stateid_t *, int);
+void nfscl_fillsattr(struct nfsrv_descript *, struct vattr *,
+      vnode_t, int, u_int32_t);
 void newnfs_init(void);
 int nfsaddr_match(int, union nethostaddr *, NFSSOCKADDR_T);
 int nfsaddr2_match(NFSSOCKADDR_T, NFSSOCKADDR_T);
@@ -347,11 +352,7 @@ struct nfsdevice *nfsv4_findmirror(struct nfsmount *);
 /* nfs_clcomsubs.c */
 void nfsm_uiombuf(struct nfsrv_descript *, struct uio *, int);
 struct mbuf *nfsm_uiombuflist(struct uio *, int, struct mbuf **, char **);
-void nfscl_reqstart(struct nfsrv_descript *, int, struct nfsmount *,
-    u_int8_t *, int, u_int32_t **, struct nfsclsession *, int, int);
 nfsuint64 *nfscl_getcookie(struct nfsnode *, off_t off, int);
-void nfscl_fillsattr(struct nfsrv_descript *, struct vattr *,
-      vnode_t, int, u_int32_t);
 u_int8_t *nfscl_getmyip(struct nfsmount *, struct in6_addr *, int *);
 int nfsm_getfh(struct nfsrv_descript *, struct nfsfh **);
 int nfscl_mtofh(struct nfsrv_descript *, struct nfsfh **,
@@ -363,7 +364,6 @@ int nfscl_wcc_data(struct nfsrv_descript *, vnode_t,
 int nfsm_loadattr(struct nfsrv_descript *, struct nfsvattr *);
 int nfscl_request(struct nfsrv_descript *, vnode_t,
          NFSPROC_T *, struct ucred *, void *);
-void nfsm_stateidtom(struct nfsrv_descript *, nfsv4stateid_t *, int);
 
 /* nfs_nfsdsubs.c */
 void nfsd_fhtovp(struct nfsrv_descript *, struct nfsrvfh *, int,

Modified: head/sys/fs/nfs/nfsport.h
==============================================================================
--- head/sys/fs/nfs/nfsport.h	Thu Jun 14 09:36:25 2018	(r335129)
+++ head/sys/fs/nfs/nfsport.h	Thu Jun 14 10:00:19 2018	(r335130)
@@ -1054,6 +1054,27 @@ extern const char nfs_vnode_tag[];
  */
 #define	nfsds_failerr(e)	((e) == ENXIO || (e) == EIO)
 
+/*
+ * Get a pointer to the MDS session, which is always the first element
+ * in the list.
+ * This macro can only be safely used when the NFSLOCKMNT() lock is held.
+ * The inline function can be used when the lock isn't held.
+ */
+#define	NFSMNT_MDSSESSION(m)	(&(TAILQ_FIRST(&((m)->nm_sess))->nfsclds_sess))
+
+static __inline struct nfsclsession *
+nfsmnt_mdssession(struct nfsmount *nmp)
+{
+	struct nfsclsession *tsep;
+
+	tsep = NULL;
+	mtx_lock(&nmp->nm_mtx);
+	if (TAILQ_FIRST(&nmp->nm_sess) != NULL)
+		tsep = NFSMNT_MDSSESSION(nmp);
+	mtx_unlock(&nmp->nm_mtx);
+	return (tsep);
+}
+
 #endif	/* _KERNEL */
 
 #endif	/* _NFS_NFSPORT_H */

Modified: head/sys/fs/nfsclient/nfs_clcomsubs.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clcomsubs.c	Thu Jun 14 09:36:25 2018	(r335129)
+++ head/sys/fs/nfsclient/nfs_clcomsubs.c	Thu Jun 14 10:00:19 2018	(r335130)
@@ -49,219 +49,12 @@ 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];
-extern int	nfs_bigreply[NFSV41_NPROCS];
 NFSCLSTATEMUTEX;
 #endif	/* !APPLEKEXT */
 
 static nfsuint64 nfs_nullcookie = {{ 0, 0 }};
-static struct {
-	int	op;
-	int	opcnt;
-	const u_char *tag;
-	int	taglen;
-} nfsv4_opmap[NFSV41_NPROCS] = {
-	{ 0, 1, "Null", 4 },
-	{ NFSV4OP_GETATTR, 1, "Getattr", 7, },
-	{ NFSV4OP_SETATTR, 2, "Setattr", 7, },
-	{ NFSV4OP_LOOKUP, 3, "Lookup", 6, },
-	{ NFSV4OP_ACCESS, 2, "Access", 6, },
-	{ NFSV4OP_READLINK, 2, "Readlink", 8, },
-	{ NFSV4OP_READ, 1, "Read", 4, },
-	{ NFSV4OP_WRITE, 2, "Write", 5, },
-	{ NFSV4OP_OPEN, 5, "Open", 4, },
-	{ NFSV4OP_CREATE, 5, "Create", 6, },
-	{ NFSV4OP_CREATE, 1, "Create", 6, },
-	{ NFSV4OP_CREATE, 3, "Create", 6, },
-	{ NFSV4OP_REMOVE, 1, "Remove", 6, },
-	{ NFSV4OP_REMOVE, 1, "Remove", 6, },
-	{ NFSV4OP_SAVEFH, 5, "Rename", 6, },
-	{ NFSV4OP_SAVEFH, 4, "Link", 4, },
-	{ NFSV4OP_READDIR, 2, "Readdir", 7, },
-	{ NFSV4OP_READDIR, 2, "Readdir", 7, },
-	{ NFSV4OP_GETATTR, 1, "Getattr", 7, },
-	{ NFSV4OP_GETATTR, 1, "Getattr", 7, },
-	{ NFSV4OP_GETATTR, 1, "Getattr", 7, },
-	{ NFSV4OP_COMMIT, 2, "Commit", 6, },
-	{ NFSV4OP_LOOKUPP, 3, "Lookupp", 7, },
-	{ NFSV4OP_SETCLIENTID, 1, "SetClientID", 11, },
-	{ NFSV4OP_SETCLIENTIDCFRM, 1, "SetClientIDConfirm", 18, },
-	{ NFSV4OP_LOCK, 1, "Lock", 4, },
-	{ NFSV4OP_LOCKU, 1, "LockU", 5, },
-	{ NFSV4OP_OPEN, 2, "Open", 4, },
-	{ NFSV4OP_CLOSE, 1, "Close", 5, },
-	{ NFSV4OP_OPENCONFIRM, 1, "Openconfirm", 11, },
-	{ NFSV4OP_LOCKT, 1, "LockT", 5, },
-	{ NFSV4OP_OPENDOWNGRADE, 1, "Opendowngrade", 13, },
-	{ NFSV4OP_RENEW, 1, "Renew", 5, },
-	{ NFSV4OP_PUTROOTFH, 1, "Dirpath", 7, },
-	{ NFSV4OP_RELEASELCKOWN, 1, "Rellckown", 9, },
-	{ NFSV4OP_DELEGRETURN, 1, "Delegret", 8, },
-	{ NFSV4OP_DELEGRETURN, 3, "DelegRemove", 11, },
-	{ NFSV4OP_DELEGRETURN, 7, "DelegRename1", 12, },
-	{ NFSV4OP_DELEGRETURN, 9, "DelegRename2", 12, },
-	{ NFSV4OP_GETATTR, 1, "Getacl", 6, },
-	{ NFSV4OP_SETATTR, 1, "Setacl", 6, },
-	{ NFSV4OP_EXCHANGEID, 1, "ExchangeID", 10, },
-	{ NFSV4OP_CREATESESSION, 1, "CreateSession", 13, },
-	{ NFSV4OP_DESTROYSESSION, 1, "DestroySession", 14, },
-	{ NFSV4OP_DESTROYCLIENTID, 1, "DestroyClient", 13, },
-	{ NFSV4OP_FREESTATEID, 1, "FreeStateID", 11, },
-	{ NFSV4OP_LAYOUTGET, 1, "LayoutGet", 9, },
-	{ NFSV4OP_GETDEVINFO, 1, "GetDeviceInfo", 13, },
-	{ NFSV4OP_LAYOUTCOMMIT, 1, "LayoutCommit", 12, },
-	{ NFSV4OP_LAYOUTRETURN, 1, "LayoutReturn", 12, },
-	{ NFSV4OP_RECLAIMCOMPL, 1, "ReclaimComplete", 15, },
-	{ NFSV4OP_WRITE, 1, "WriteDS", 7, },
-	{ NFSV4OP_READ, 1, "ReadDS", 6, },
-	{ NFSV4OP_COMMIT, 1, "CommitDS", 8, },
-	{ NFSV4OP_OPEN, 3, "OpenLayoutGet", 13, },
-	{ NFSV4OP_OPEN, 8, "CreateLayGet", 12, },
-};
 
 /*
- * NFS RPCS that have large request message size.
- */
-static int nfs_bigrequest[NFSV41_NPROCS] = {
-	0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0
-};
-
-/*
- * Start building a request. Mostly just put the first file handle in
- * place.
- */
-APPLESTATIC void
-nfscl_reqstart(struct nfsrv_descript *nd, int procnum, struct nfsmount *nmp,
-    u_int8_t *nfhp, int fhlen, u_int32_t **opcntpp, struct nfsclsession *sep,
-    int vers, int minorvers)
-{
-	struct mbuf *mb;
-	u_int32_t *tl;
-	int opcnt;
-	nfsattrbit_t attrbits;
-
-	/*
-	 * First, fill in some of the fields of nd.
-	 */
-	nd->nd_slotseq = NULL;
-	if (vers == NFS_VER4) {
-		nd->nd_flag = ND_NFSV4 | ND_NFSCL;
-		if (minorvers == NFSV41_MINORVERSION)
-			nd->nd_flag |= ND_NFSV41;
-	} 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))
-				nd->nd_flag |= ND_NFSV41;
-		} else if (NFSHASNFSV3(nmp))
-			nd->nd_flag = ND_NFSV3 | ND_NFSCL;
-		else
-			nd->nd_flag = ND_NFSV2 | ND_NFSCL;
-	}
-	nd->nd_procnum = procnum;
-	nd->nd_repstat = 0;
-
-	/*
-	 * Get the first mbuf for the request.
-	 */
-	if (nfs_bigrequest[procnum])
-		NFSMCLGET(mb, M_WAITOK);
-	else
-		NFSMGET(mb);
-	mbuf_setlen(mb, 0);
-	nd->nd_mreq = nd->nd_mb = mb;
-	nd->nd_bpos = NFSMTOD(mb, caddr_t);
-	
-	/*
-	 * And fill the first file handle into the request.
-	 */
-	if (nd->nd_flag & ND_NFSV4) {
-		opcnt = nfsv4_opmap[procnum].opcnt +
-		    nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh;
-		if ((nd->nd_flag & ND_NFSV41) != 0) {
-			opcnt += nfsv4_opflag[nfsv4_opmap[procnum].op].needsseq;
-			if (procnum == NFSPROC_RENEW)
-				/*
-				 * For the special case of Renew, just do a
-				 * Sequence Op.
-				 */
-				opcnt = 1;
-			else if (procnum == NFSPROC_WRITEDS ||
-			    procnum == NFSPROC_COMMITDS)
-				/*
-				 * For the special case of a Writeor Commit to
-				 * a DS, the opcnt == 3, for Sequence, PutFH,
-				 * Write/Commit.
-				 */
-				opcnt = 3;
-		}
-		/*
-		 * What should the tag really be?
-		 */
-		(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)
-			*tl++ = txdr_unsigned(NFSV41_MINORVERSION);
-		else
-			*tl++ = txdr_unsigned(NFSV4_MINORVERSION);
-		if (opcntpp != NULL)
-			*opcntpp = tl;
-		*tl = txdr_unsigned(opcnt);
-		if ((nd->nd_flag & ND_NFSV41) != 0 &&
-		    nfsv4_opflag[nfsv4_opmap[procnum].op].needsseq > 0) {
-			if (nfsv4_opflag[nfsv4_opmap[procnum].op].loopbadsess >
-			    0)
-				nd->nd_flag |= ND_LOOPBADSESS;
-			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-			*tl = txdr_unsigned(NFSV4OP_SEQUENCE);
-			if (sep == NULL) {
-				sep = nfsmnt_mdssession(nmp);
-				nfsv4_setsequence(nmp, nd, sep,
-				    nfs_bigreply[procnum]);
-			} else
-				nfsv4_setsequence(nmp, nd, sep,
-				    nfs_bigreply[procnum]);
-		}
-		if (nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh > 0) {
-			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-			*tl = txdr_unsigned(NFSV4OP_PUTFH);
-			(void) nfsm_fhtom(nd, nfhp, fhlen, 0);
-			if (nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh
-			    == 2 && procnum != NFSPROC_WRITEDS &&
-			    procnum != NFSPROC_COMMITDS) {
-				NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-				*tl = txdr_unsigned(NFSV4OP_GETATTR);
-				/*
-				 * For Lookup Ops, we want all the directory
-				 * attributes, so we can load the name cache.
-				 */
-				if (procnum == NFSPROC_LOOKUP ||
-				    procnum == NFSPROC_LOOKUPP)
-					NFSGETATTR_ATTRBIT(&attrbits);
-				else {
-					NFSWCCATTR_ATTRBIT(&attrbits);
-					nd->nd_flag |= ND_V4WCCATTR;
-				}
-				(void) nfsrv_putattrbit(nd, &attrbits);
-			}
-		}
-		if (procnum != NFSPROC_RENEW ||
-		    (nd->nd_flag & ND_NFSV41) == 0) {
-			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-			*tl = txdr_unsigned(nfsv4_opmap[procnum].op);
-		}
-	} else {
-		(void) nfsm_fhtom(nd, nfhp, fhlen, 0);
-	}
-	if (procnum < NFSV41_NPROCS)
-		NFSINCRGLOBAL(nfsstatsv1.rpccnt[procnum]);
-}
-
-/*
  * copies a uio scatter/gather list to an mbuf chain.
  * NOTE: can ony handle iovcnt == 1
  */
@@ -592,38 +385,6 @@ nfscl_mtofh(struct nfsrv_descript *nd, struct nfsfh **
 	}
 nfsmout:
 	return (error);
-}
-
-/*
- * Put a state Id in the mbuf list.
- */
-APPLESTATIC void
-nfsm_stateidtom(struct nfsrv_descript *nd, nfsv4stateid_t *stateidp, int flag)
-{
-	nfsv4stateid_t *st;
-
-	NFSM_BUILD(st, nfsv4stateid_t *, NFSX_STATEID);
-	if (flag == NFSSTATEID_PUTALLZERO) {
-		st->seqid = 0;
-		st->other[0] = 0;
-		st->other[1] = 0;
-		st->other[2] = 0;
-	} else if (flag == NFSSTATEID_PUTALLONE) {
-		st->seqid = 0xffffffff;
-		st->other[0] = 0xffffffff;
-		st->other[1] = 0xffffffff;
-		st->other[2] = 0xffffffff;
-	} else if (flag == NFSSTATEID_PUTSEQIDZERO) {
-		st->seqid = 0;
-		st->other[0] = stateidp->other[0];
-		st->other[1] = stateidp->other[1];
-		st->other[2] = stateidp->other[2];
-	} else {
-		st->seqid = stateidp->seqid;
-		st->other[0] = stateidp->other[0];
-		st->other[1] = stateidp->other[1];
-		st->other[2] = stateidp->other[2];
-	}
 }
 
 /*

Modified: head/sys/fs/nfsclient/nfs_clport.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clport.c	Thu Jun 14 09:36:25 2018	(r335129)
+++ head/sys/fs/nfsclient/nfs_clport.c	Thu Jun 14 10:00:19 2018	(r335130)
@@ -819,124 +819,6 @@ nfsmout:
 }
 
 /*
- * Fill in the setable attributes. The full argument indicates whether
- * to fill in them all or just mode and time.
- */
-void
-nfscl_fillsattr(struct nfsrv_descript *nd, struct vattr *vap,
-    struct vnode *vp, int flags, u_int32_t rdev)
-{
-	u_int32_t *tl;
-	struct nfsv2_sattr *sp;
-	nfsattrbit_t attrbits;
-
-	switch (nd->nd_flag & (ND_NFSV2 | ND_NFSV3 | ND_NFSV4)) {
-	case ND_NFSV2:
-		NFSM_BUILD(sp, struct nfsv2_sattr *, NFSX_V2SATTR);
-		if (vap->va_mode == (mode_t)VNOVAL)
-			sp->sa_mode = newnfs_xdrneg1;
-		else
-			sp->sa_mode = vtonfsv2_mode(vap->va_type, vap->va_mode);
-		if (vap->va_uid == (uid_t)VNOVAL)
-			sp->sa_uid = newnfs_xdrneg1;
-		else
-			sp->sa_uid = txdr_unsigned(vap->va_uid);
-		if (vap->va_gid == (gid_t)VNOVAL)
-			sp->sa_gid = newnfs_xdrneg1;
-		else
-			sp->sa_gid = txdr_unsigned(vap->va_gid);
-		if (flags & NFSSATTR_SIZE0)
-			sp->sa_size = 0;
-		else if (flags & NFSSATTR_SIZENEG1)
-			sp->sa_size = newnfs_xdrneg1;
-		else if (flags & NFSSATTR_SIZERDEV)
-			sp->sa_size = txdr_unsigned(rdev);
-		else
-			sp->sa_size = txdr_unsigned(vap->va_size);
-		txdr_nfsv2time(&vap->va_atime, &sp->sa_atime);
-		txdr_nfsv2time(&vap->va_mtime, &sp->sa_mtime);
-		break;
-	case ND_NFSV3:
-		if (vap->va_mode != (mode_t)VNOVAL) {
-			NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
-			*tl++ = newnfs_true;
-			*tl = txdr_unsigned(vap->va_mode);
-		} else {
-			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-			*tl = newnfs_false;
-		}
-		if ((flags & NFSSATTR_FULL) && vap->va_uid != (uid_t)VNOVAL) {
-			NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
-			*tl++ = newnfs_true;
-			*tl = txdr_unsigned(vap->va_uid);
-		} else {
-			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-			*tl = newnfs_false;
-		}
-		if ((flags & NFSSATTR_FULL) && vap->va_gid != (gid_t)VNOVAL) {
-			NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
-			*tl++ = newnfs_true;
-			*tl = txdr_unsigned(vap->va_gid);
-		} else {
-			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-			*tl = newnfs_false;
-		}
-		if ((flags & NFSSATTR_FULL) && vap->va_size != VNOVAL) {
-			NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
-			*tl++ = newnfs_true;
-			txdr_hyper(vap->va_size, tl);
-		} else {
-			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-			*tl = newnfs_false;
-		}
-		if (vap->va_atime.tv_sec != VNOVAL) {
-			if ((vap->va_vaflags & VA_UTIMES_NULL) == 0) {
-				NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
-				*tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT);
-				txdr_nfsv3time(&vap->va_atime, tl);
-			} else {
-				NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-				*tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);
-			}
-		} else {
-			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-			*tl = txdr_unsigned(NFSV3SATTRTIME_DONTCHANGE);
-		}
-		if (vap->va_mtime.tv_sec != VNOVAL) {
-			if ((vap->va_vaflags & VA_UTIMES_NULL) == 0) {
-				NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
-				*tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT);
-				txdr_nfsv3time(&vap->va_mtime, tl);
-			} else {
-				NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-				*tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);
-			}
-		} else {
-			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
-			*tl = txdr_unsigned(NFSV3SATTRTIME_DONTCHANGE);
-		}
-		break;
-	case ND_NFSV4:
-		NFSZERO_ATTRBIT(&attrbits);
-		if (vap->va_mode != (mode_t)VNOVAL)
-			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_MODE);
-		if ((flags & NFSSATTR_FULL) && vap->va_uid != (uid_t)VNOVAL)
-			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_OWNER);
-		if ((flags & NFSSATTR_FULL) && vap->va_gid != (gid_t)VNOVAL)
-			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_OWNERGROUP);
-		if ((flags & NFSSATTR_FULL) && vap->va_size != VNOVAL)
-			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);
-		if (vap->va_atime.tv_sec != VNOVAL)
-			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEACCESSSET);
-		if (vap->va_mtime.tv_sec != VNOVAL)
-			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEMODIFYSET);
-		(void) nfsv4_fillattr(nd, vp->v_mount, vp, NULL, vap, NULL, 0,
-		    &attrbits, NULL, NULL, 0, 0, 0, 0, (uint64_t)0, NULL);
-		break;
-	}
-}
-
-/*
  * nfscl_request() - mostly a wrapper for newnfs_request().
  */
 int

Modified: head/sys/fs/nfsclient/nfsmount.h
==============================================================================
--- head/sys/fs/nfsclient/nfsmount.h	Thu Jun 14 09:36:25 2018	(r335129)
+++ head/sys/fs/nfsclient/nfsmount.h	Thu Jun 14 10:00:19 2018	(r335130)
@@ -116,27 +116,6 @@ struct	nfsmount {
  */
 #define	VFSTONFS(mp)	((struct nfsmount *)((mp)->mnt_data))
 
-/*
- * Get a pointer to the MDS session, which is always the first element
- * in the list.
- * This macro can only be safely used when the NFSLOCKMNT() lock is held.
- * The inline function can be used when the lock isn't held.
- */
-#define	NFSMNT_MDSSESSION(m)	(&(TAILQ_FIRST(&((m)->nm_sess))->nfsclds_sess))
-
-static __inline struct nfsclsession *
-nfsmnt_mdssession(struct nfsmount *nmp)
-{
-	struct nfsclsession *tsep;
-
-	tsep = NULL;
-	mtx_lock(&nmp->nm_mtx);
-	if (TAILQ_FIRST(&nmp->nm_sess) != NULL)
-		tsep = NFSMNT_MDSSESSION(nmp);
-	mtx_unlock(&nmp->nm_mtx);
-	return (tsep);
-}
-
 #ifndef NFS_DEFAULT_NAMETIMEO
 #define NFS_DEFAULT_NAMETIMEO		60
 #endif


More information about the svn-src-all mailing list