svn commit: r360997 - in projects/nfs-over-tls/sys: fs/nfsclient rpc xdr

Rick Macklem rmacklem at FreeBSD.org
Wed May 13 00:03:41 UTC 2020


Author: rmacklem
Date: Wed May 13 00:03:39 2020
New Revision: 360997
URL: https://svnweb.freebsd.org/changeset/base/360997

Log:
  Get rid of the changes done to the krpc and xdr for dissecting ext_pgs mbufs.
  
  Also do a few code cleanups, such as comments, printfs and whitespace
  while at it.
  
  All of the ext_pgs mbuf dissection code should now be out of this tree.

Modified:
  projects/nfs-over-tls/sys/fs/nfsclient/nfs_clkrpc.c
  projects/nfs-over-tls/sys/rpc/clnt.h
  projects/nfs-over-tls/sys/rpc/clnt_bck.c
  projects/nfs-over-tls/sys/rpc/clnt_vc.c
  projects/nfs-over-tls/sys/rpc/svc.h
  projects/nfs-over-tls/sys/rpc/svc_vc.c
  projects/nfs-over-tls/sys/xdr/xdr_mbuf.c

Modified: projects/nfs-over-tls/sys/fs/nfsclient/nfs_clkrpc.c
==============================================================================
--- projects/nfs-over-tls/sys/fs/nfsclient/nfs_clkrpc.c	Tue May 12 23:51:04 2020	(r360996)
+++ projects/nfs-over-tls/sys/fs/nfsclient/nfs_clkrpc.c	Wed May 13 00:03:39 2020	(r360997)
@@ -94,7 +94,7 @@ printf("cbprogram proc=%d\n", rqst->rq_proc);
 	rqst->rq_args = NULL;
 	newnfs_realign(&nd.nd_mrep, M_WAITOK);
 	nd.nd_md = nd.nd_mrep;
-printf("cbreq nd_md=%p offs=%d\n", nd.nd_md, rqst->rq_xprt->xp_mbufoffs);
+printf("cbreq nd_md=%p\n", nd.nd_md);
 	nd.nd_dpos = mtod(nd.nd_md, char *);
 	nd.nd_nam = svc_getrpccaller(rqst);
 	nd.nd_nam2 = rqst->rq_addr;

Modified: projects/nfs-over-tls/sys/rpc/clnt.h
==============================================================================
--- projects/nfs-over-tls/sys/rpc/clnt.h	Tue May 12 23:51:04 2020	(r360996)
+++ projects/nfs-over-tls/sys/rpc/clnt.h	Wed May 13 00:03:39 2020	(r360997)
@@ -120,7 +120,6 @@ struct rpc_callextra {
 	void		*rc_feedback_arg; /* argument for callback */
 	struct rpc_timers *rc_timers;	  /* optional RTT timers */
 	struct rpc_err	rc_err;		/* detailed call status */
-	u_int		rc_mbufoffs;	/* Offset in resultsp mbuf */
 };
 #endif
 

Modified: projects/nfs-over-tls/sys/rpc/clnt_bck.c
==============================================================================
--- projects/nfs-over-tls/sys/rpc/clnt_bck.c	Tue May 12 23:51:04 2020	(r360996)
+++ projects/nfs-over-tls/sys/rpc/clnt_bck.c	Wed May 13 00:03:39 2020	(r360997)
@@ -89,7 +89,6 @@ __FBSDID("$FreeBSD$");
 #include <rpc/krpc.h>
 #include <rpc/rpcsec_tls.h>
 
-
 struct cmessage {
         struct cmsghdr cmsg;
         struct cmsgcred cmcred;
@@ -209,7 +208,6 @@ clnt_bck_call(
 	struct mbuf *mreq = NULL, *results;
 	struct ct_request *cr;
 	int error, maxextsiz;
-	uint32_t junk;
 #ifdef KERN_TLS
 	u_int maxlen;
 #endif
@@ -425,9 +423,7 @@ got_reply:
 		ext->rc_feedback(FEEDBACK_OK, proc, ext->rc_feedback_arg);
 
 	xdrmbuf_create(&xdrs, cr->cr_mrep, XDR_DECODE);
-	ok = xdr_uint32_t(&xdrs, &junk);
-	if (ok)
-		ok = xdr_replymsg(&xdrs, &reply_msg);
+	ok = xdr_replymsg(&xdrs, &reply_msg);
 	cr->cr_mrep = NULL;
 
 	if (ok) {
@@ -446,14 +442,6 @@ got_reply:
 			} else {
 				KASSERT(results,
 				    ("auth validated but no result"));
-				if (ext) {
-					if ((results->m_flags & M_NOMAP) !=
-					    0)
-						ext->rc_mbufoffs =
-						    xdrs.x_handy;
-					else
-						ext->rc_mbufoffs = 0;
-				}
 				*resultsp = results;
 			}
 		}		/* end successful completion */

Modified: projects/nfs-over-tls/sys/rpc/clnt_vc.c
==============================================================================
--- projects/nfs-over-tls/sys/rpc/clnt_vc.c	Tue May 12 23:51:04 2020	(r360996)
+++ projects/nfs-over-tls/sys/rpc/clnt_vc.c	Wed May 13 00:03:39 2020	(r360997)
@@ -86,7 +86,6 @@ __FBSDID("$FreeBSD$");
 #include <rpc/krpc.h>
 #include <rpc/rpcsec_tls.h>
 
-
 struct cmessage {
         struct cmsghdr cmsg;
         struct cmsgcred cmcred;
@@ -535,19 +534,6 @@ got_reply:
 	if (ext && ext->rc_feedback)
 		ext->rc_feedback(FEEDBACK_OK, proc, ext->rc_feedback_arg);
 
-#ifdef notnow
-{ struct mbuf *m, *m2;
-int txxxx;
-if (cr->cr_mrep != NULL) {
-txxxx = m_length(cr->cr_mrep, NULL);
-if (txxxx > 0) {
-m = mb_copym_ext_pgs(cr->cr_mrep, txxxx, 16384, M_WAITOK,
-    mb_free_mext_pgs, &m2);
-m2 = cr->cr_mrep;
-cr->cr_mrep = m;
-m_freem(m2);
-} } }
-#endif
 	xdrmbuf_create(&xdrs, cr->cr_mrep, XDR_DECODE);
 	ok = xdr_replymsg(&xdrs, &reply_msg);
 	cr->cr_mrep = NULL;
@@ -569,14 +555,6 @@ m_freem(m2);
 			} else {
 				KASSERT(results,
 				    ("auth validated but no result"));
-				if (ext) {
-					if ((results->m_flags & M_NOMAP) !=
-					    0)
-						ext->rc_mbufoffs =
-						    xdrs.x_handy;
-					else
-						ext->rc_mbufoffs = 0;
-				}
 				*resultsp = results;
 			}
 		}		/* end successful completion */
@@ -932,7 +910,11 @@ clnt_vc_soupcall(struct socket *so, void *arg, int wai
 
 	CTASSERT(sizeof(xid_plus_direction) == 2 * sizeof(uint32_t));
 
-	/* RPC-over-TLS needs to block reception during handshake upcall. */
+	/*
+	 * RPC-over-TLS needs to block reception during
+	 * upcalls since the upcall will be doing I/O on
+	 * the socket via openssl library calls.
+	 */
 	mtx_lock(&ct->ct_lock);
 	if (ct->ct_dontrcv) {
 		mtx_unlock(&ct->ct_lock);
@@ -942,15 +924,13 @@ clnt_vc_soupcall(struct socket *so, void *arg, int wai
 
 	/*
 	 * If another thread is already here, it must be in
-	 * soreceive(), so just return.
+	 * soreceive(), so just return to avoid races with it.
 	 * ct_upcallrefs is protected by the SOCKBUF_LOCK(),
 	 * which is held in this function, except when
 	 * soreceive() is called.
 	 */
 	if (ct->ct_upcallrefs > 0)
-{ printf("soup another\n");
 		return (SU_OK);
-}
 	ct->ct_upcallrefs++;
 
 	/*
@@ -987,6 +967,7 @@ clnt_vc_soupcall(struct socket *so, void *arg, int wai
 		}
 		if (error != 0) {
 		wakeup_all:
+printf("wakeup_all err=%d\n", error);
 			mtx_lock(&ct->ct_lock);
 			ct->ct_error.re_status = RPC_CANTRECV;
 			ct->ct_error.re_errno = error;

Modified: projects/nfs-over-tls/sys/rpc/svc.h
==============================================================================
--- projects/nfs-over-tls/sys/rpc/svc.h	Tue May 12 23:51:04 2020	(r360996)
+++ projects/nfs-over-tls/sys/rpc/svc.h	Wed May 13 00:03:39 2020	(r360997)
@@ -175,7 +175,6 @@ typedef struct __rpc_svcxprt {
 	int		xp_upcallset;	/* socket upcall is set up */
 	uint32_t	xp_snd_cnt;	/* # of bytes to send to socket */
 	uint32_t	xp_snt_cnt;	/* # of bytes sent to socket */
-	u_int		xp_mbufoffs;	/* Offset into ext_pgs mbuf */
 	bool_t		xp_dontrcv;	/* Do not receive on the socket */
 	uint32_t	xp_tls;		/* RPC-over-TLS on socket */
 	uint64_t	xp_sslsec;	/* Userland SSL * */

Modified: projects/nfs-over-tls/sys/rpc/svc_vc.c
==============================================================================
--- projects/nfs-over-tls/sys/rpc/svc_vc.c	Tue May 12 23:51:04 2020	(r360996)
+++ projects/nfs-over-tls/sys/rpc/svc_vc.c	Wed May 13 00:03:39 2020	(r360997)
@@ -76,7 +76,6 @@ __FBSDID("$FreeBSD$");
 
 #include <security/mac/mac_framework.h>
 
-
 static bool_t svc_vc_rendezvous_recv(SVCXPRT *, struct rpc_msg *,
     struct sockaddr **, struct mbuf **);
 static enum xprt_stat svc_vc_rendezvous_stat(SVCXPRT *);
@@ -593,32 +592,6 @@ svc_vc_process_pending(SVCXPRT *xprt)
 	struct socket *so = xprt->xp_socket;
 	struct mbuf *m;
 
-#ifdef notnow
-{ struct mbuf *m1, *m2, *m3, *m4;
-	int txxxx;
-	m3 = cd->mpending;
-	m4 = NULL;
-	while (m3 != NULL && (m3->m_flags & M_NOMAP) != 0) {
-		m4 = m3;
-		m3 = m3->m_next;
-	}
-	if (m3 != NULL) {
-		txxxx = m_length(m3, NULL);
-		if (txxxx > 0) {
-			m1 = mb_copym_ext_pgs(m3, txxxx, 16384, M_WAITOK,
-			    mb_free_mext_pgs, &m2);
-			if (m4 != NULL) {
-				m4->m_next = m1;
-				m_freem(m3);
-			} else {
-				m2 = cd->mpending;
-				cd->mpending = m1;
-				m_freem(m2);
-			}
-		}
-	}
-}
-#endif
 	/*
 	 * If cd->resid is non-zero, we have part of the
 	 * record already, otherwise we are expecting a record
@@ -648,7 +621,7 @@ svc_vc_process_pending(SVCXPRT *xprt)
 		header = ntohl(header);
 		cd->eor = (header & 0x80000000) != 0;
 		cd->resid = header & 0x7fffffff;
-		cd->resid += sizeof(uint32_t);
+		m_adj(cd->mpending, sizeof(uint32_t));
 	}
 
 	/*
@@ -661,14 +634,10 @@ svc_vc_process_pending(SVCXPRT *xprt)
 	while (cd->mpending && cd->resid) {
 		m = cd->mpending;
 		if (cd->mpending->m_next
-		    || cd->mpending->m_len > cd->resid) {
-			if ((cd->mpending->m_flags & M_NOMAP) != 0)
-				cd->mpending = mb_splitatpos_ext(
-				    cd->mpending, cd->resid, M_WAITOK);
-			else
-				cd->mpending = m_split(cd->mpending,
-				    cd->resid, M_WAITOK);
-		} else
+		    || cd->mpending->m_len > cd->resid)
+			cd->mpending = m_split(cd->mpending,
+			    cd->resid, M_WAITOK);
+		else
 			cd->mpending = NULL;
 		if (cd->mreq)
 			m_last(cd->mreq)->m_next = m;
@@ -702,7 +671,7 @@ svc_vc_recv(SVCXPRT *xprt, struct rpc_msg *msg,
 	struct socket* so = xprt->xp_socket;
 	XDR xdrs;
 	int error, rcvflag;
-	uint32_t xid_plus_direction[3], junk;
+	uint32_t xid_plus_direction[2];
 	struct cmsghdr *cmsg;
 	struct tls_get_record tgr;
 
@@ -735,15 +704,15 @@ svc_vc_recv(SVCXPRT *xprt, struct rpc_msg *msg,
 				m_copydata(cd->mreq, 0,
 				    sizeof(xid_plus_direction),
 				    (char *)xid_plus_direction);
+				xid_plus_direction[0] =
+				    ntohl(xid_plus_direction[0]);
 				xid_plus_direction[1] =
 				    ntohl(xid_plus_direction[1]);
-				xid_plus_direction[2] =
-				    ntohl(xid_plus_direction[2]);
 				/* Check message direction. */
-				if (xid_plus_direction[2] == REPLY) {
+				if (xid_plus_direction[1] == REPLY) {
 					clnt_bck_svccall(xprt->xp_p2,
 					    cd->mreq,
-					    xid_plus_direction[1]);
+					    xid_plus_direction[0]);
 					cd->mreq = NULL;
 					continue;
 				}
@@ -763,18 +732,13 @@ svc_vc_recv(SVCXPRT *xprt, struct rpc_msg *msg,
 
 			sx_xunlock(&xprt->xp_lock);
 
-			if (! xdr_uint32_t(&xdrs, &junk) ||
-			    ! xdr_callmsg(&xdrs, msg)) {
+			if (! xdr_callmsg(&xdrs, msg)) {
 				XDR_DESTROY(&xdrs);
 				return (FALSE);
 			}
 
 			*addrp = NULL;
 			*mp = xdrmbuf_getall(&xdrs);
-			if (((*mp)->m_flags & M_NOMAP) != 0)
-				xprt->xp_mbufoffs = xdrs.x_handy;
-			else
-				xprt->xp_mbufoffs = 0;
 			XDR_DESTROY(&xdrs);
 
 			return (TRUE);
@@ -901,19 +865,6 @@ svc_vc_backchannel_recv(SVCXPRT *xprt, struct rpc_msg 
 	sx_xunlock(&xprt->xp_lock);
 
 printf("recv backch m=%p\n", m);
-#ifdef notnow
-{ struct mbuf *m1, *m2;
-int txxxx;
-if (m != NULL) {
-txxxx = m_length(m, NULL);
-if (txxxx > 0) {
-m1 = mb_copym_ext_pgs(m, txxxx, 16384, M_WAITOK,
-    mb_free_mext_pgs, &m2);
-m2 = m;
-m = m1;
-m_freem(m2);
-} } }
-#endif
 	xdrmbuf_create(&xdrs, m, XDR_DECODE);
 	if (! xdr_callmsg(&xdrs, msg)) {
 printf("recv backch callmsg failed\n");
@@ -922,11 +873,6 @@ printf("recv backch callmsg failed\n");
 	}
 	*addrp = NULL;
 	*mp = xdrmbuf_getall(&xdrs);
-	if (((*mp)->m_flags & M_NOMAP) != 0)
-		xprt->xp_mbufoffs = xdrs.x_handy;
-	else
-		xprt->xp_mbufoffs = 0;
-printf("backch offs=%d\n", xprt->xp_mbufoffs);
 	XDR_DESTROY(&xdrs);
 	return (TRUE);
 }

Modified: projects/nfs-over-tls/sys/xdr/xdr_mbuf.c
==============================================================================
--- projects/nfs-over-tls/sys/xdr/xdr_mbuf.c	Tue May 12 23:51:04 2020	(r360996)
+++ projects/nfs-over-tls/sys/xdr/xdr_mbuf.c	Wed May 13 00:03:39 2020	(r360997)
@@ -122,10 +122,9 @@ xdrmbuf_getall(XDR *xdrs)
 		xdrs->x_private = NULL;
 	}
 
-	if (m) {
-		if ((m->m_flags & M_NOMAP) == 0)
-			m_adj(m, xdrs->x_handy);
-	} else
+	if (m)
+		m_adj(m, xdrs->x_handy);
+	else
 		m = m_get(M_WAITOK, MT_DATA);
 	return (m);
 }
@@ -195,10 +194,7 @@ xdrmbuf_getbytes(XDR *xdrs, char *addr, u_int len)
 		sz = m->m_len - xdrs->x_handy;
 		if (sz > len)
 			sz = len;
-		if ((m->m_flags & M_NOMAP) != 0)
-			m_copydata(m, xdrs->x_handy, sz, addr);
-		else
-			bcopy(mtod(m, const char *) + xdrs->x_handy, addr, sz);
+		bcopy(mtod(m, const char *) + xdrs->x_handy, addr, sz);
 
 		addr += sz;
 		xdrs->x_handy += sz;
@@ -290,8 +286,6 @@ xdrmbuf_inline(XDR *xdrs, u_int len)
 	char *p;
 
 	if (!m)
-		return (0);
-	if ((m->m_flags & M_NOMAP) != 0)
 		return (0);
 	if (xdrs->x_op == XDR_ENCODE) {
 		available = M_TRAILINGSPACE(m) + (m->m_len - xdrs->x_handy);


More information about the svn-src-projects mailing list