Eliminate several uses of `curproc' from the socket-layer code and from NFS. trunk
authorjonathan <jonathan@NetBSD.org>
Sat, 22 May 2004 22:52:13 +0000
branchtrunk
changeset 127396 e7661f3e490a
parent 127395 8094e4a51781
child 127397 2fdfa839f424
Eliminate several uses of `curproc' from the socket-layer code and from NFS. Add a new explicit `struct proc *p' argument to socreate(), sosend(). Use that argument instead of curproc. Follow-on changes to pass that argument to socreate(), sosend(), and (*so->so_send)() calls. These changes reviewed and independently recoded by Matt Thomas. Changes to soreceive() and (*dom->dom_exernalize() from Matt Thomas: pass soreceive()'s struct uio* uio->uio_procp to unp_externalize(). Eliminate curproc from unp_externalize. Also, now soreceive() uses its uio->uio_procp value, pass that same value downward to ((pr->pru_usrreq)() calls for consistency, instead of (struct proc * )0. Similar changes in sys/nfs to eliminate (most) uses of curproc, either via the req-> r_procp field of a struct nfsreq *req argument, or by passing down new explicit struct proc * arguments. Reviewed by: Matt Thomas, posted to tech-kern. NB: The (*pr->pru_usrreq)() change should be tested on more (all!) protocols.
sys/compat/svr4/svr4_net.c
sys/kern/sys_socket.c
sys/kern/uipc_socket.c
sys/kern/uipc_syscalls.c
sys/kern/uipc_usrreq.c
sys/miscfs/fifofs/fifo_vnops.c
sys/miscfs/portal/portal_vnops.c
sys/netsmb/smb_trantcp.c
sys/nfs/krpc.h
sys/nfs/krpc_subr.c
sys/nfs/nfs_boot.c
sys/nfs/nfs_bootdhcp.c
sys/nfs/nfs_bootparam.c
sys/nfs/nfs_nqlease.c
sys/nfs/nfs_socket.c
sys/nfs/nfs_syscalls.c
sys/nfs/nfs_var.h
sys/nfs/nfs_vfsops.c
sys/nfs/nfsdiskless.h
sys/nfs/nfsmount.h
sys/sys/domain.h
sys/sys/socketvar.h
sys/sys/un.h
--- a/sys/compat/svr4/svr4_net.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/compat/svr4/svr4_net.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: svr4_net.c,v 1.35 2003/09/13 08:32:10 jdolecek Exp $	*/
+/*	$NetBSD: svr4_net.c,v 1.36 2004/05/22 22:52:13 jonathan Exp $	*/
 
 /*-
  * Copyright (c) 1994 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_net.c,v 1.35 2003/09/13 08:32:10 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_net.c,v 1.36 2004/05/22 22:52:13 jonathan Exp $");
 
 #define COMPAT_SVR4 1
 
@@ -203,7 +203,7 @@
 	if ((error = falloc(p, &fp, &fd)) != 0)
 		return error;
 
-	if ((error = socreate(family, &so, type, protocol)) != 0) {
+	if ((error = socreate(family, &so, type, protocol, p)) != 0) {
 		DPRINTF(("socreate error %d\n", error));
 		fdremove(p->p_fd, fd);
 		FILE_UNUSE(fp, NULL);
--- a/sys/kern/sys_socket.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/kern/sys_socket.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_socket.c,v 1.39 2003/09/21 19:17:08 jdolecek Exp $	*/
+/*	$NetBSD: sys_socket.c,v 1.40 2004/05/22 22:52:13 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.39 2003/09/21 19:17:08 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.40 2004/05/22 22:52:13 jonathan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -79,7 +79,7 @@
 {
 	struct socket *so = (struct socket *) fp->f_data;
 	return ((*so->so_send)(so, (struct mbuf *)0,
-		uio, (struct mbuf *)0, (struct mbuf *)0, 0));
+		uio, (struct mbuf *)0, (struct mbuf *)0, 0, uio->uio_procp));
 }
 
 int
--- a/sys/kern/uipc_socket.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/kern/uipc_socket.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_socket.c,v 1.101 2004/05/01 02:24:38 matt Exp $	*/
+/*	$NetBSD: uipc_socket.c,v 1.102 2004/05/22 22:52:13 jonathan Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.101 2004/05/01 02:24:38 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.102 2004/05/22 22:52:13 jonathan Exp $");
 
 #include "opt_sock_counters.h"
 #include "opt_sosend_loan.h"
@@ -407,6 +407,7 @@
 
 	/* XXX KDASSERT */
 	KASSERT(npgs <= M_EXT_MAXPAGES);
+	KASSERT(uio->uio_procp != NULL);
 
 	lva = sokvaalloc(len, so);
 	if (lva == 0)
@@ -450,14 +451,12 @@
  */
 /*ARGSUSED*/
 int
-socreate(int dom, struct socket **aso, int type, int proto)
+socreate(int dom, struct socket **aso, int type, int proto, struct proc *p)
 {
-	struct proc	*p;
 	const struct protosw	*prp;
 	struct socket	*so;
 	int		error, s;
 
-	p = curproc;		/* XXX */
 	if (proto)
 		prp = pffindproto(dom, proto, type);
 	else
@@ -650,12 +649,10 @@
 }
 
 int
-soconnect(struct socket *so, struct mbuf *nam)
+soconnect(struct socket *so, struct mbuf *nam, struct proc *p)
 {
-	struct proc	*p;
 	int		s, error;
 
-	p = curproc;		/* XXX */
 	if (so->so_options & SO_ACCEPTCONN)
 		return (EOPNOTSUPP);
 	s = splsoftnet();
@@ -732,16 +729,14 @@
  */
 int
 sosend(struct socket *so, struct mbuf *addr, struct uio *uio, struct mbuf *top,
-	struct mbuf *control, int flags)
+	struct mbuf *control, int flags, struct proc *p)
 {
-	struct proc	*p;
 	struct mbuf	**mp, *m;
 	long		space, len, resid, clen, mlen;
 	int		error, s, dontroute, atomic;
 
 	sodopendfree(so);
 
-	p = curproc;		/* XXX */
 	clen = 0;
 	atomic = sosendallatonce(so) || top;
 	if (uio)
@@ -762,7 +757,8 @@
 	dontroute =
 	    (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 &&
 	    (so->so_proto->pr_flags & PR_ATOMIC);
-	p->p_stats->p_ru.ru_msgsnd++;
+	if (p)
+		p->p_stats->p_ru.ru_msgsnd++;
 	if (control)
 		clen = control->m_len;
 #define	snderr(errno)	{ error = errno; splx(s); goto release; }
@@ -935,6 +931,7 @@
 soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio,
 	struct mbuf **mp0, struct mbuf **controlp, int *flagsp)
 {
+	struct proc * p;
 	struct mbuf	*m, **mp;
 	int		flags, len, error, s, offset, moff, type, orig_resid;
 	const struct protosw	*pr;
@@ -945,6 +942,8 @@
 	mp = mp0;
 	type = 0;
 	orig_resid = uio->uio_resid;
+	p = uio->uio_procp;
+
 	if (paddr)
 		*paddr = 0;
 	if (controlp)
@@ -960,8 +959,8 @@
 	if (flags & MSG_OOB) {
 		m = m_get(M_WAIT, MT_DATA);
 		error = (*pr->pr_usrreq)(so, PRU_RCVOOB, m,
-		    (struct mbuf *)(long)(flags & MSG_PEEK), (struct mbuf *)0,
-		    (struct proc *)0);
+		    (struct mbuf *)(long)(flags & MSG_PEEK),
+		    (struct mbuf *)0, p);
 		if (error)
 			goto bad;
 		do {
@@ -978,7 +977,7 @@
 		*mp = (struct mbuf *)0;
 	if (so->so_state & SS_ISCONFIRMING && uio->uio_resid)
 		(*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0,
-		    (struct mbuf *)0, (struct mbuf *)0, (struct proc *)0);
+		    (struct mbuf *)0, (struct mbuf *)0, p);
 
  restart:
 	if ((error = sblock(&so->so_rcv, SBLOCKWAIT(flags))) != 0)
@@ -1052,8 +1051,8 @@
 	 * info, we save a copy of m->m_nextpkt into nextrecord.
 	 */
 #ifdef notyet /* XXXX */
-	if (uio->uio_procp)
-		uio->uio_procp->p_stats->p_ru.ru_msgrcv++;
+	if (p)
+		p->p_stats->p_ru.ru_msgrcv++;
 #endif
 	KASSERT(m == so->so_rcv.sb_mb);
 	SBLASTRECORDCHK(&so->so_rcv, "soreceive 1");
@@ -1092,10 +1091,11 @@
 			sbfree(&so->so_rcv, m);
 			mbuf_removed = 1;
 			if (controlp) {
-				if (pr->pr_domain->dom_externalize &&
+				struct domain *dom = pr->pr_domain;
+				if (dom->dom_externalize && p &&
 				    mtod(m, struct cmsghdr *)->cmsg_type ==
 				    SCM_RIGHTS)
-					error = (*pr->pr_domain->dom_externalize)(m);
+					error = (*dom->dom_externalize)(m, p);
 				*controlp = m;
 				so->so_rcv.sb_mb = m->m_next;
 				m->m_next = 0;
@@ -1281,8 +1281,7 @@
 				(*pr->pr_usrreq)(so, PRU_RCVD,
 				    (struct mbuf *)0,
 				    (struct mbuf *)(long)flags,
-				    (struct mbuf *)0,
-				    (struct proc *)0);
+				    (struct mbuf *)0, p);
 			SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2");
 			SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2");
 			error = sbwait(&so->so_rcv);
@@ -1319,8 +1318,7 @@
 		SBLASTMBUFCHK(&so->so_rcv, "soreceive 4");
 		if (pr->pr_flags & PR_WANTRCVD && so->so_pcb)
 			(*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0,
-			    (struct mbuf *)(long)flags, (struct mbuf *)0,
-			    (struct proc *)0);
+			    (struct mbuf *)(long)flags, (struct mbuf *)0, p);
 	}
 	if (orig_resid == uio->uio_resid && orig_resid &&
 	    (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) {
--- a/sys/kern/uipc_syscalls.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/kern/uipc_syscalls.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_syscalls.c,v 1.87 2004/05/18 11:31:49 ragge Exp $	*/
+/*	$NetBSD: uipc_syscalls.c,v 1.88 2004/05/22 22:52:13 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1990, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.87 2004/05/18 11:31:49 ragge Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.88 2004/05/22 22:52:13 jonathan Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_pipe.h"
@@ -90,7 +90,7 @@
 	fp->f_type = DTYPE_SOCKET;
 	fp->f_ops = &socketops;
 	error = socreate(SCARG(uap, domain), &so, SCARG(uap, type),
-			 SCARG(uap, protocol));
+			 SCARG(uap, protocol), p);
 	if (error) {
 		FILE_UNUSE(fp, p);
 		fdremove(fdp, fd);
@@ -288,7 +288,7 @@
 	if (error)
 		goto out;
 	MCLAIM(nam, so->so_mowner);
-	error = soconnect(so, nam);
+	error = soconnect(so, nam, p);
 	if (error)
 		goto bad;
 	if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
@@ -340,11 +340,11 @@
 	p = l->l_proc;
 	fdp = p->p_fd;
 	error = socreate(SCARG(uap, domain), &so1, SCARG(uap, type),
-			 SCARG(uap, protocol));
+			 SCARG(uap, protocol), p);
 	if (error)
 		return (error);
 	error = socreate(SCARG(uap, domain), &so2, SCARG(uap, type),
-			 SCARG(uap, protocol));
+			 SCARG(uap, protocol), p);
 	if (error)
 		goto free1;
 	/* falloc() will use the descriptor for us */
@@ -535,7 +535,7 @@
 	}
 #endif
 	len = auio.uio_resid;
-	error = (*so->so_send)(so, to, &auio, NULL, control, flags);
+	error = (*so->so_send)(so, to, &auio, NULL, control, flags, p);
 	if (error) {
 		if (auio.uio_resid != len && (error == ERESTART ||
 		    error == EINTR || error == EWOULDBLOCK))
@@ -907,9 +907,9 @@
 
 	p = l->l_proc;
 	fdp = p->p_fd;
-	if ((error = socreate(AF_LOCAL, &rso, SOCK_STREAM, 0)) != 0)
+	if ((error = socreate(AF_LOCAL, &rso, SOCK_STREAM, 0, p)) != 0)
 		return (error);
-	if ((error = socreate(AF_LOCAL, &wso, SOCK_STREAM, 0)) != 0)
+	if ((error = socreate(AF_LOCAL, &wso, SOCK_STREAM, 0, p)) != 0)
 		goto free1;
 	/* remember this socket pair implements a pipe */
 	wso->so_state |= SS_ISAPIPE;
--- a/sys/kern/uipc_usrreq.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/kern/uipc_usrreq.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_usrreq.c,v 1.77 2004/04/18 22:20:32 matt Exp $	*/
+/*	$NetBSD: uipc_usrreq.c,v 1.78 2004/05/22 22:52:13 jonathan Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000, 2004 The NetBSD Foundation, Inc.
@@ -103,7 +103,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.77 2004/04/18 22:20:32 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.78 2004/05/22 22:52:13 jonathan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -834,9 +834,8 @@
 #endif
 
 int
-unp_externalize(struct mbuf *rights)
+unp_externalize(struct mbuf *rights, struct proc *p)
 {
-	struct proc *p = curproc;		/* XXX */
 	struct cmsghdr *cm = mtod(rights, struct cmsghdr *);
 	int i, *fdp;
 	struct file **rp;
--- a/sys/miscfs/fifofs/fifo_vnops.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/miscfs/fifofs/fifo_vnops.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: fifo_vnops.c,v 1.48 2004/05/12 02:07:37 jrf Exp $	*/
+/*	$NetBSD: fifo_vnops.c,v 1.49 2004/05/22 22:52:14 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1990, 1993, 1995
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fifo_vnops.c,v 1.48 2004/05/12 02:07:37 jrf Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fifo_vnops.c,v 1.49 2004/05/22 22:52:14 jonathan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -162,13 +162,15 @@
 	if ((fip = vp->v_fifoinfo) == NULL) {
 		MALLOC(fip, struct fifoinfo *, sizeof(*fip), M_VNODE, M_WAITOK);
 		vp->v_fifoinfo = fip;
-		if ((error = socreate(AF_LOCAL, &rso, SOCK_STREAM, 0)) != 0) {
+		error = socreate(AF_LOCAL, &rso, SOCK_STREAM, 0, p);
+		if (error != 0) {
 			free(fip, M_VNODE);
 			vp->v_fifoinfo = NULL;
 			return (error);
 		}
 		fip->fi_readsock = rso;
-		if ((error = socreate(AF_LOCAL, &wso, SOCK_STREAM, 0)) != 0) {
+		error = socreate(AF_LOCAL, &wso, SOCK_STREAM, 0, p);
+		if (error != 0) {
 			(void)soclose(rso);
 			free(fip, M_VNODE);
 			vp->v_fifoinfo = NULL;
@@ -310,7 +312,7 @@
 		wso->so_state |= SS_NBIO;
 	VOP_UNLOCK(ap->a_vp, 0);
 	error = (*wso->so_send)(wso, (struct mbuf *)0, ap->a_uio, 0,
-	    (struct mbuf *)0, 0);
+	    (struct mbuf *)0, 0, curproc /*XXX*/);
 	vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY);
 	if (ap->a_ioflag & IO_NDELAY)
 		wso->so_state &= ~SS_NBIO;
--- a/sys/miscfs/portal/portal_vnops.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/miscfs/portal/portal_vnops.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: portal_vnops.c,v 1.54 2004/04/29 16:10:55 jrf Exp $	*/
+/*	$NetBSD: portal_vnops.c,v 1.55 2004/05/22 22:52:14 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: portal_vnops.c,v 1.54 2004/04/29 16:10:55 jrf Exp $");
+__KERNEL_RCSID(0, "$NetBSD: portal_vnops.c,v 1.55 2004/05/22 22:52:14 jonathan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -345,7 +345,7 @@
 	/*
 	 * Create a new socket.
 	 */
-	error = socreate(AF_LOCAL, &so, SOCK_STREAM, 0);
+	error = socreate(AF_LOCAL, &so, SOCK_STREAM, 0, p);
 	if (error)
 		goto bad;
 
@@ -420,7 +420,7 @@
 	auio.uio_resid = aiov[0].iov_len + aiov[1].iov_len;
 
 	error = (*so->so_send)(so, (struct mbuf *) 0, &auio,
-			(struct mbuf *) 0, (struct mbuf *) 0, 0);
+			(struct mbuf *) 0, (struct mbuf *) 0, 0, p);
 	if (error)
 		goto bad;
 
--- a/sys/netsmb/smb_trantcp.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/netsmb/smb_trantcp.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: smb_trantcp.c,v 1.15 2003/06/29 22:32:11 fvdl Exp $	*/
+/*	$NetBSD: smb_trantcp.c,v 1.16 2004/05/22 22:52:15 jonathan Exp $	*/
 
 /*
  * Copyright (c) 2000-2001 Boris Popov
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smb_trantcp.c,v 1.15 2003/06/29 22:32:11 fvdl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smb_trantcp.c,v 1.16 2004/05/22 22:52:15 jonathan Exp $");
  
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -83,7 +83,7 @@
 				    so, NULL, 0, m, 0, flags, p)
 #else
 #define nb_sosend(so,m,flags,p) (*(so)->so_send)(so, NULL, (struct uio *)0, \
-					m, (struct mbuf *)0, flags)
+					m, (struct mbuf *)0, flags, p)
 #endif
 
 static int  nbssn_recv(struct nbpcb *nbp, struct mbuf **mpp, int *lenp,
@@ -267,7 +267,7 @@
 	struct mbuf *m;
 #endif
 
-	error = socreate(AF_INET, &so, SOCK_STREAM, IPPROTO_TCP);
+	error = socreate(AF_INET, &so, SOCK_STREAM, IPPROTO_TCP, p);
 	if (error)
 		return error;
 	nbp->nbp_tso = so;
@@ -289,7 +289,7 @@
 	m = m_get(M_WAIT, MT_SONAME);
 	*mtod(m, struct sockaddr *) = *(struct sockaddr *)to;
 	m->m_len = sizeof(struct sockaddr);
-	error = soconnect(so, m);
+	error = soconnect(so, m, p);
 	m_free(m);
 #endif
 	if (error)
--- a/sys/nfs/krpc.h	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/krpc.h	Sat May 22 22:52:13 2004 +0000
@@ -1,14 +1,15 @@
-/*	$NetBSD: krpc.h,v 1.6 2003/05/05 13:21:00 yamt Exp $	*/
+/*	$NetBSD: krpc.h,v 1.7 2004/05/22 22:52:15 jonathan Exp $	*/
 
 #include <sys/cdefs.h>
 
 #ifdef _KERNEL
 int krpc_call __P((struct sockaddr_in *sin,
 	u_int prog, u_int vers, u_int func,
-	struct mbuf **data, struct mbuf **from));
+	struct mbuf **data, struct mbuf **from, struct proc *p));
 
 int krpc_portmap __P((struct sockaddr_in *sin,
-	u_int prog, u_int vers, u_int proto, u_int16_t *portp));
+	u_int prog, u_int vers, u_int proto, u_int16_t *portp,
+	struct proc *p));
 
 struct mbuf *xdr_string_encode __P((char *str, int len));
 struct mbuf *xdr_string_decode __P((struct mbuf *m, char *str, int *len_p));
--- a/sys/nfs/krpc_subr.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/krpc_subr.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: krpc_subr.c,v 1.27 2003/02/26 06:31:18 matt Exp $	*/
+/*	$NetBSD: krpc_subr.c,v 1.28 2004/05/22 22:52:15 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon Ross, Adam Glass
@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: krpc_subr.c,v 1.27 2003/02/26 06:31:18 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: krpc_subr.c,v 1.28 2004/05/22 22:52:15 jonathan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -131,10 +131,11 @@
  * Returns non-zero error on failure.
  */
 int
-krpc_portmap(sin,  prog, vers, proto, portp)
+krpc_portmap(sin,  prog, vers, proto, portp, p)
 	struct sockaddr_in *sin;		/* server address */
 	u_int prog, vers, proto;	/* host order */
 	u_int16_t *portp;	/* network order */
+	struct proc *p;
 {
 	struct sdata {
 		u_int32_t prog;		/* call program */
@@ -167,7 +168,7 @@
 
 	sin->sin_port = htons(PMAPPORT);
 	error = krpc_call(sin, PMAPPROG, PMAPVERS,
-					  PMAPPROC_GETPORT, &m, NULL);
+					  PMAPPROC_GETPORT, &m, NULL, p);
 	if (error) 
 		return error;
 
@@ -215,11 +216,12 @@
  * the address from whence the response came is saved there.
  */
 int
-krpc_call(sa, prog, vers, func, data, from_p)
+krpc_call(sa, prog, vers, func, data, from_p, p)
 	struct sockaddr_in *sa;
 	u_int prog, vers, func;
 	struct mbuf **data;	/* input/output */
 	struct mbuf **from_p;	/* output */
+	struct proc *p;
 {
 	struct socket *so;
 	struct sockaddr_in *sin;
@@ -244,7 +246,7 @@
 	/*
 	 * Create socket and set its receive timeout.
 	 */
-	if ((error = socreate(AF_INET, &so, SOCK_DGRAM, 0)))
+	if ((error = socreate(AF_INET, &so, SOCK_DGRAM, 0, p)))
 		goto out;
 
 	if ((error = nfs_boot_setrecvtimo(so)))
@@ -266,7 +268,7 @@
 	tport = IPPORT_RESERVED;
 	do {
 		tport--;
-		error = nfs_boot_sobind_ipport(so, tport);
+		error = nfs_boot_sobind_ipport(so, tport, p);
 	} while (error == EADDRINUSE &&
 			 tport > IPPORT_RESERVED / 2);
 	if (error) {
@@ -317,7 +319,8 @@
 	mhead->m_pkthdr.len = len;
 	mhead->m_pkthdr.rcvif = NULL;
 
-	error = nfs_boot_sendrecv(so, nam, 0, mhead, krpccheck, &m, &from, &xid);
+	error = nfs_boot_sendrecv(so, nam, 0, mhead, krpccheck, &m, &from,
+	    &xid, p);
 	if (error)
 		goto out;
 
--- a/sys/nfs/nfs_boot.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/nfs_boot.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_boot.c,v 1.60 2004/03/11 21:48:43 cl Exp $	*/
+/*	$NetBSD: nfs_boot.c,v 1.61 2004/05/22 22:52:15 jonathan Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1997 The NetBSD Foundation, Inc.
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_boot.c,v 1.60 2004/03/11 21:48:43 cl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_boot.c,v 1.61 2004/05/22 22:52:15 jonathan Exp $");
 
 #include "opt_nfs.h"
 #include "opt_nfs_boot.h"
@@ -95,10 +95,10 @@
 
 /* mountd RPC */
 static int md_mount __P((struct sockaddr_in *mdsin, char *path,
-	struct nfs_args *argp));
+	struct nfs_args *argp, struct proc *procp));
 
 static void nfs_boot_defrt __P((struct in_addr *));
-static  int nfs_boot_getfh __P((struct nfs_dlmount *ndm));
+static  int nfs_boot_getfh __P((struct nfs_dlmount *ndm, struct proc *));
 
 
 /*
@@ -161,7 +161,7 @@
 	/*
 	 * Now fetch the NFS file handles as appropriate.
 	 */
-	error = nfs_boot_getfh(&nd->nd_root);
+	error = nfs_boot_getfh(&nd->nd_root, procp);
 
 	if (error)
 		nfs_boot_cleanup(nd, procp);
@@ -197,7 +197,7 @@
 	 * Get a socket to use for various things in here.
 	 * After this, use "goto out" to cleanup and return.
 	 */
-	error = socreate(AF_INET, &so, SOCK_DGRAM, 0);
+	error = socreate(AF_INET, &so, SOCK_DGRAM, 0, procp);
 	if (error) {
 		printf("ifupdown: socreate, error=%d\n", error);
 		return (error);
@@ -246,7 +246,7 @@
 	 * Get a socket to use for various things in here.
 	 * After this, use "goto out" to cleanup and return.
 	 */
-	error = socreate(AF_INET, &so, SOCK_DGRAM, 0);
+	error = socreate(AF_INET, &so, SOCK_DGRAM, 0, procp);
 	if (error) {
 		printf("setaddress: socreate, error=%d\n", error);
 		return (error);
@@ -305,7 +305,7 @@
 	 * Get a socket to use for various things in here.
 	 * After this, use "goto out" to cleanup and return.
 	 */
-	error = socreate(AF_INET, &so, SOCK_DGRAM, 0);
+	error = socreate(AF_INET, &so, SOCK_DGRAM, 0, procp);
 	if (error) {
 		printf("deladdress: socreate, error=%d\n", error);
 		return (error);
@@ -360,9 +360,10 @@
 }
 
 int
-nfs_boot_sobind_ipport(so, port)
+nfs_boot_sobind_ipport(so, port, procp)
 	struct socket *so;
 	u_int16_t port;
+	struct proc *procp;
 {
 	struct mbuf *m;
 	struct sockaddr_in *sin;
@@ -374,7 +375,7 @@
 	sin->sin_family = AF_INET;
 	sin->sin_addr.s_addr = INADDR_ANY;
 	sin->sin_port = htons(port);
-	error = sobind(so, m, curproc);
+	error = sobind(so, m, procp);
 	m_freem(m);
 	return (error);
 }
@@ -389,7 +390,7 @@
 #define TOTAL_TIMEOUT   30	/* seconds */
 
 int
-nfs_boot_sendrecv(so, nam, sndproc, snd, rcvproc, rcv, from_p, context)
+nfs_boot_sendrecv(so, nam, sndproc, snd, rcvproc, rcv, from_p, context, procp)
 	struct socket *so;
 	struct mbuf *nam;
 	int (*sndproc) __P((struct mbuf*, void*, int));
@@ -397,6 +398,7 @@
 	int (*rcvproc) __P((struct mbuf*, void*));
 	struct mbuf **rcv, **from_p;
 	void *context;
+	struct proc *procp;
 {
 	int error, rcvflg, timo, secs, waited;
 	struct mbuf *m, *from;
@@ -434,7 +436,7 @@
 		error = ENOBUFS;
 		goto out;
 	}
-	error = (*so->so_send)(so, nam, NULL, m, NULL, 0);
+	error = (*so->so_send)(so, nam, NULL, m, NULL, 0, procp);
 	if (error) {
 		printf("nfs_boot: sosend: %d\n", error);
 		goto out;
@@ -457,6 +459,7 @@
 			m = NULL;
 		}
 		uio.uio_resid = 1 << 16; /* ??? */
+		uio.uio_procp = procp;
 		rcvflg = 0;
 		error = (*so->so_receive)(so, &from, &uio, &m, NULL, &rcvflg);
 		if (error == EWOULDBLOCK) {
@@ -557,8 +560,9 @@
  * (once for root and once for swap)
  */
 static int
-nfs_boot_getfh(ndm)
+nfs_boot_getfh(ndm, p)
 	struct nfs_dlmount *ndm;	/* output */
+	struct proc *p;
 {
 	struct nfs_args *args;
 	struct sockaddr_in *sin;
@@ -613,7 +617,7 @@
 	 * Get file handle using RPC to mountd/mount
 	 */
 	sin = (struct sockaddr_in *)&ndm->ndm_saddr;
-	error = md_mount(sin, pathname, args);
+	error = md_mount(sin, pathname, args, p);
 	if (error) {
 		printf("nfs_boot: mountd `%s', error=%d\n",
 		       ndm->ndm_host, error);
@@ -628,7 +632,7 @@
 	error = krpc_portmap(sin, NFS_PROG,
 		    (args->flags & NFSMNT_NFSV3) ? NFS_VER3 : NFS_VER2,
 		    (args->sotype == SOCK_STREAM) ? IPPROTO_TCP : IPPROTO_UDP,
-		    &port);
+		    &port, p);
 	if (port == htons(0))
 		error = EIO;
 	if (error) {
@@ -652,10 +656,11 @@
  * Also, sets sin->sin_port to the NFS service port.
  */
 static int
-md_mount(mdsin, path, argp)
+md_mount(mdsin, path, argp, procp)
 	struct sockaddr_in *mdsin;		/* mountd server address */
 	char *path;
 	struct nfs_args *argp;
+	struct proc *procp;
 {
 	/* The RPC structures */
 	struct rdata {
@@ -679,7 +684,7 @@
 		 * Get port number for MOUNTD.
 		 */
 		error = krpc_portmap(mdsin, RPCPROG_MNT, mntver,
-		                    IPPROTO_UDP, &mdsin->sin_port);
+		                    IPPROTO_UDP, &mdsin->sin_port, procp);
 		if (error)
 			continue;
 
@@ -690,7 +695,7 @@
 
 		/* Do RPC to mountd. */
 		error = krpc_call(mdsin, RPCPROG_MNT, mntver,
-		                  RPCMNT_MOUNT, &m, NULL);
+		                  RPCMNT_MOUNT, &m, NULL, procp);
 		if (error != EPROGMISMATCH)
 			break;
 		/* Try lower version of mountd. */
--- a/sys/nfs/nfs_bootdhcp.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/nfs_bootdhcp.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_bootdhcp.c,v 1.26 2004/05/06 12:32:59 drochner Exp $	*/
+/*	$NetBSD: nfs_bootdhcp.c,v 1.27 2004/05/22 22:52:15 jonathan Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1997 The NetBSD Foundation, Inc.
@@ -51,7 +51,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_bootdhcp.c,v 1.26 2004/05/06 12:32:59 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_bootdhcp.c,v 1.27 2004/05/22 22:52:15 jonathan Exp $");
 
 #include "opt_nfs_boot.h"
 
@@ -451,7 +451,7 @@
 	int vcilen;
 #endif
 
-	error = socreate(AF_INET, &so, SOCK_DGRAM, 0);
+	error = socreate(AF_INET, &so, SOCK_DGRAM, 0, procp);
 	if (error) {
 		printf("bootp: socreate, error=%d\n", error);
 		return (error);
@@ -538,7 +538,7 @@
 	/*
 	 * Bind the local endpoint to a bootp client port.
 	 */
-	if ((error = nfs_boot_sobind_ipport(so, IPPORT_BOOTPC))) {
+	if ((error = nfs_boot_sobind_ipport(so, IPPORT_BOOTPC, procp))) {
 		DPRINT("bind failed\n");
 		goto out;
 	}
@@ -607,7 +607,7 @@
 #endif
 
 	error = nfs_boot_sendrecv(so, nam, bootpset, m,
-				  bootpcheck, 0, 0, &bpc);
+				  bootpcheck, 0, 0, &bpc, procp);
 	if (error)
 		goto out;
 
@@ -633,7 +633,7 @@
 		bpc.expected_dhcpmsgtype = DHCPACK;
 
 		error = nfs_boot_sendrecv(so, nam, bootpset, m,
-					  bootpcheck, 0, 0, &bpc);
+					  bootpcheck, 0, 0, &bpc, procp);
 		if (error)
 			goto out;
 	}
--- a/sys/nfs/nfs_bootparam.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/nfs_bootparam.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_bootparam.c,v 1.23 2003/06/29 22:32:15 fvdl Exp $	*/
+/*	$NetBSD: nfs_bootparam.c,v 1.24 2004/05/22 22:52:15 jonathan Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1997 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_bootparam.c,v 1.23 2003/06/29 22:32:15 fvdl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_bootparam.c,v 1.24 2004/05/22 22:52:15 jonathan Exp $");
 
 #include "opt_nfs_boot.h"
 #include "opt_inet.h"
@@ -94,9 +94,9 @@
 
 /* bootparam RPC */
 static int bp_whoami __P((struct sockaddr_in *bpsin,
-	struct in_addr *my_ip, struct in_addr *gw_ip));
+	struct in_addr *my_ip, struct in_addr *gw_ip, struct proc *p));
 static int bp_getfile __P((struct sockaddr_in *bpsin, char *key,
-	struct nfs_dlmount *ndm));
+	struct nfs_dlmount *ndm, struct proc *p));
 
 
 /*
@@ -180,7 +180,7 @@
 	sin->sin_addr.s_addr = INADDR_BROADCAST;
 
 	/* Do the RPC/bootparam/whoami. */
-	error = bp_whoami(sin, &my_ip, &gw_ip);
+	error = bp_whoami(sin, &my_ip, &gw_ip, procp);
 	if (error) {
 		printf("nfs_boot: bootparam whoami, error=%d\n", error);
 		goto delout;
@@ -192,7 +192,7 @@
 	 * Now fetch the server:pathname strings and server IP
 	 * for root and swap.  Missing swap is not fatal.
 	 */
-	error = bp_getfile(sin, "root", &nd->nd_root);
+	error = bp_getfile(sin, "root", &nd->nd_root, procp);
 	if (error) {
 		printf("nfs_boot: bootparam get root: %d\n", error);
 		goto delout;
@@ -201,7 +201,7 @@
 #ifndef NFS_BOOTPARAM_NOGATEWAY
 	gw_ndm = malloc(sizeof(*gw_ndm), M_NFSMNT, M_WAITOK);
 	memset((caddr_t)gw_ndm, 0, sizeof(*gw_ndm));
-	error = bp_getfile(sin, "gateway", gw_ndm);
+	error = bp_getfile(sin, "gateway", gw_ndm, procp);
 	if (error) {
 		/* No gateway supplied. No error, but try fallback. */
 		error = 0;
@@ -291,10 +291,11 @@
  * know about us (don't want to broadcast a getport call).
  */
 static int
-bp_whoami(bpsin, my_ip, gw_ip)
+bp_whoami(bpsin, my_ip, gw_ip, p)
 	struct sockaddr_in *bpsin;
 	struct in_addr *my_ip;
 	struct in_addr *gw_ip;
+	struct proc *p;
 {
 	/* RPC structures for PMAPPROC_CALLIT */
 	struct whoami_call {
@@ -334,7 +335,7 @@
 	bpsin->sin_port = htons(PMAPPORT);
 	from = NULL;
 	error = krpc_call(bpsin, PMAPPROG, PMAPVERS,
-			PMAPPROC_CALLIT, &m, &from);
+			PMAPPROC_CALLIT, &m, &from, p);
 	if (error)
 		return error;
 
@@ -398,10 +399,11 @@
  *	server pathname
  */
 static int
-bp_getfile(bpsin, key, ndm)
+bp_getfile(bpsin, key, ndm, p)
 	struct sockaddr_in *bpsin;
 	char *key;
 	struct nfs_dlmount *ndm;
+	struct proc *p;
 {
 	char pathname[MNAMELEN];
 	struct in_addr inaddr;
@@ -426,7 +428,7 @@
 
 	/* RPC: bootparam/getfile */
 	error = krpc_call(bpsin, BOOTPARAM_PROG, BOOTPARAM_VERS,
-	                  BOOTPARAM_GETFILE, &m, NULL);
+	                  BOOTPARAM_GETFILE, &m, NULL, p);
 	if (error)
 		return error;
 
--- a/sys/nfs/nfs_nqlease.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/nfs_nqlease.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_nqlease.c,v 1.55 2004/04/21 02:22:49 christos Exp $	*/
+/*	$NetBSD: nfs_nqlease.c,v 1.56 2004/05/22 22:52:15 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -49,7 +49,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_nqlease.c,v 1.55 2004/04/21 02:22:49 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_nqlease.c,v 1.56 2004/05/22 22:52:15 jonathan Exp $");
 
 #include "fs_nfs.h"
 #include "opt_nfs.h"
@@ -270,7 +270,7 @@
 		} else {
 			lp->lc_flag |= LC_NONCACHABLE;
 			nqsrv_locklease(lp);
-			nqsrv_send_eviction(vp, lp, slp, nam, cred);
+			nqsrv_send_eviction(vp, lp, slp, nam, cred, procp);
 			nqsrv_waitfor_expiry(lp);
 			nqsrv_unlocklease(lp);
 		}
@@ -453,12 +453,13 @@
  * Send out eviction notice messages to all other hosts for the lease.
  */
 void
-nqsrv_send_eviction(vp, lp, slp, nam, cred)
+nqsrv_send_eviction(vp, lp, slp, nam, cred, p)
 	struct vnode *vp;
 	struct nqlease *lp;
 	struct nfssvc_sock *slp;
 	struct mbuf *nam;
 	struct ucred *cred;
+	struct proc *p;
 {
 	struct nqhost *lph = &lp->lc_host;
 	struct mbuf *m;
@@ -549,7 +550,7 @@
 				if (solockp)
 					*solockp |= NFSMNT_SNDLOCK;
 				(void) nfs_send(so, nam2, m,
-						(struct nfsreq *)0);
+						(struct nfsreq *)0, p);
 				if (solockp)
 					nfs_sndunlock(solockp);
 			}
@@ -888,9 +889,10 @@
  * Client vacated message function.
  */
 int
-nqnfs_vacated(vp, cred)
+nqnfs_vacated(vp, cred, p)
 	struct vnode *vp;
 	struct ucred *cred;
+	struct proc *p;
 {
 	caddr_t cp;
 	struct mbuf *m;
@@ -927,7 +929,7 @@
 	myrep.r_nmp = nmp;
 	if (nmp->nm_soflags & PR_CONNREQUIRED)
 		(void) nfs_sndlock(&nmp->nm_iflag, (struct nfsreq *)0);
-	(void) nfs_send(nmp->nm_so, nmp->nm_nam, m, &myrep);
+	(void) nfs_send(nmp->nm_so, nmp->nm_nam, m, &myrep, p);
 	if (nmp->nm_soflags & PR_CONNREQUIRED)
 		nfs_sndunlock(&nmp->nm_iflag);
 nfsmout:
@@ -1081,7 +1083,7 @@
 		    myrep.r_nmp = nmp;
 		    myrep.r_mrep = (struct mbuf *)0;
 		    myrep.r_procp = (struct proc *)0;
-		    (void) nfs_reply(&myrep);
+		    (void) nfs_reply(&myrep, p);
 		}
 
 		/*
@@ -1105,7 +1107,7 @@
 						(void) nfs_vinvalbuf(vp,
 						       V_SAVE, cred, p, 0);
 						np->n_flag &= ~NQNFSEVICTED;
-						(void) nqnfs_vacated(vp, cred);
+						(void) nqnfs_vacated(vp, cred, p);
 					} else if (vp->v_type == VREG) {
 						(void) VOP_FSYNC(vp, cred,
 						    FSYNC_WAIT, 0, 0, p);
--- a/sys/nfs/nfs_socket.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/nfs_socket.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_socket.c,v 1.104 2004/05/10 10:40:42 yamt Exp $	*/
+/*	$NetBSD: nfs_socket.c,v 1.105 2004/05/22 22:52:15 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1989, 1991, 1993, 1995
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_socket.c,v 1.104 2004/05/10 10:40:42 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_socket.c,v 1.105 2004/05/22 22:52:15 jonathan Exp $");
 
 #include "fs_nfs.h"
 #include "opt_nfs.h"
@@ -154,9 +154,10 @@
  * We do not free the sockaddr if error.
  */
 int
-nfs_connect(nmp, rep)
+nfs_connect(nmp, rep, p)
 	struct nfsmount *nmp;
 	struct nfsreq *rep;
+	struct proc *p;
 {
 	struct socket *so;
 	int s, error, rcvreserve, sndreserve;
@@ -169,8 +170,8 @@
 
 	nmp->nm_so = (struct socket *)0;
 	saddr = mtod(nmp->nm_nam, struct sockaddr *);
-	error = socreate(saddr->sa_family, &nmp->nm_so, nmp->nm_sotype, 
-		nmp->nm_soproto);
+	error = socreate(saddr->sa_family, &nmp->nm_so,
+		nmp->nm_sotype, nmp->nm_soproto, p);
 	if (error)
 		goto bad;
 	so = nmp->nm_so;
@@ -235,7 +236,7 @@
 			goto bad;
 		}
 	} else {
-		error = soconnect(so, nmp->nm_nam);
+		error = soconnect(so, nmp->nm_nam, p);
 		if (error)
 			goto bad;
 
@@ -332,15 +333,16 @@
  * nb: Must be called with the nfs_sndlock() set on the mount point.
  */
 int
-nfs_reconnect(rep)
+nfs_reconnect(rep, p)
 	struct nfsreq *rep;
+	struct proc *p;
 {
 	struct nfsreq *rp;
 	struct nfsmount *nmp = rep->r_nmp;
 	int error;
 
 	nfs_disconnect(nmp);
-	while ((error = nfs_connect(nmp, rep)) != 0) {
+	while ((error = nfs_connect(nmp, rep, p)) != 0) {
 		if (error == EINTR || error == ERESTART)
 			return (EINTR);
 		(void) tsleep((caddr_t)&lbolt, PSOCK, "nfscn2", 0);
@@ -421,15 +423,25 @@
  * - do any cleanup required by recoverable socket errors (? ? ?)
  */
 int
-nfs_send(so, nam, top, rep)
+nfs_send(so, nam, top, rep, p)
 	struct socket *so;
 	struct mbuf *nam;
 	struct mbuf *top;
 	struct nfsreq *rep;
+	struct proc *p;
 {
 	struct mbuf *sendnam;
 	int error, soflags, flags;
 
+	/* XXX nfs_doio()/nfs_request() calls with  rep->r_procp == NULL */
+	if (p == NULL && rep->r_procp == NULL) {
+#ifdef DIAGNOSTIC
+		printf("nfs_send: proc botch: rep %p arg %p curproc %p\n",
+		       rep->r_procp, p, curproc );
+#endif
+		p = curproc;
+	}
+
 	if (rep) {
 		if (rep->r_flags & R_SOFTTERM) {
 			m_freem(top);
@@ -454,7 +466,7 @@
 		flags = 0;
 
 	error = (*so->so_send)(so, sendnam, (struct uio *)0, top,
-		(struct mbuf *)0, flags);
+		    (struct mbuf *)0, flags,  p);
 	if (error) {
 		if (rep) {
 			if (error == ENOBUFS && so->so_type == SOCK_DGRAM) {
@@ -514,10 +526,11 @@
  * we have read any of it, even if the system call has been interrupted.
  */
 int
-nfs_receive(rep, aname, mp)
+nfs_receive(rep, aname, mp, p)
 	struct nfsreq *rep;
 	struct mbuf **aname;
 	struct mbuf **mp;
+	struct proc *p;
 {
 	struct socket *so;
 	struct uio auio;
@@ -527,7 +540,6 @@
 	u_int32_t len;
 	struct mbuf **getnam;
 	int error, sotype, rcvflg;
-	struct proc *p = curproc;	/* XXX */
 
 	/*
 	 * Set up arguments for soreceive()
@@ -564,7 +576,7 @@
 		}
 		so = rep->r_nmp->nm_so;
 		if (!so) {
-			error = nfs_reconnect(rep); 
+			error = nfs_reconnect(rep, p); 
 			if (error) {
 				nfs_sndunlock(&rep->r_nmp->nm_iflag);
 				return (error);
@@ -574,10 +586,10 @@
 		while (rep->r_flags & R_MUSTRESEND) {
 			m = m_copym(rep->r_mreq, 0, M_COPYALL, M_WAIT);
 			nfsstats.rpcretries++;
-			error = nfs_send(so, rep->r_nmp->nm_nam, m, rep);
+			error = nfs_send(so, rep->r_nmp->nm_nam, m, rep, p);
 			if (error) {
 				if (error == EINTR || error == ERESTART ||
-				    (error = nfs_reconnect(rep)) != 0) {
+				    (error = nfs_reconnect(rep, p)) != 0) {
 					nfs_sndunlock(&rep->r_nmp->nm_iflag);
 					return (error);
 				}
@@ -689,7 +701,7 @@
 				 rep->r_nmp->nm_mountp->mnt_stat.f_mntfromname);
 			error = nfs_sndlock(&rep->r_nmp->nm_iflag, rep);
 			if (!error)
-				error = nfs_reconnect(rep);
+				error = nfs_reconnect(rep, p);
 			if (!error)
 				goto tryagain;
 			else
@@ -730,8 +742,9 @@
  */
 /* ARGSUSED */
 int
-nfs_reply(myrep)
+nfs_reply(myrep, procp)
 	struct nfsreq *myrep;
+	struct proc *procp;
 {
 	struct nfsreq *rep;
 	struct nfsmount *nmp = myrep->r_nmp;
@@ -760,7 +773,7 @@
 		 * Get the next Rpc reply off the socket
 		 */
 		nmp->nm_waiters++;
-		error = nfs_receive(myrep, &nam, &mrep);
+		error = nfs_receive(myrep, &nam, &mrep, procp);
 		nfs_rcvunlock(nmp);
 		if (error) {
 
@@ -1050,7 +1063,7 @@
 			error = nfs_sndlock(&nmp->nm_iflag, rep);
 		if (!error) {
 			m = m_copym(rep->r_mreq, 0, M_COPYALL, M_WAIT);
-			error = nfs_send(nmp->nm_so, nmp->nm_nam, m, rep);
+			error = nfs_send(nmp->nm_so, nmp->nm_nam, m, rep, procp);
 			if (nmp->nm_soflags & PR_CONNREQUIRED)
 				nfs_sndunlock(&nmp->nm_iflag);
 		}
@@ -1067,7 +1080,7 @@
 	 * Wait for the reply from our send or the timer's.
 	 */
 	if (!error || error == EPIPE)
-		error = nfs_reply(rep);
+		error = nfs_reply(rep, procp);
 
 	/*
 	 * RPC done, unlink the request.
@@ -2009,7 +2022,8 @@
 		slp->ns_flag |= SLP_NEEDQ; goto dorecs;
 	}
 #endif
-	auio.uio_procp = NULL;
+	/* XXX: was NULL, soreceive() requires non-NULL uio->uio_procp */
+	auio.uio_procp = curproc;	/* XXX curproc */
 	if (so->so_type == SOCK_STREAM) {
 		/*
 		 * If there are already records on the queue, defer soreceive()
--- a/sys/nfs/nfs_syscalls.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/nfs_syscalls.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_syscalls.c,v 1.74 2004/03/17 10:43:35 yamt Exp $	*/
+/*	$NetBSD: nfs_syscalls.c,v 1.75 2004/05/22 22:52:16 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_syscalls.c,v 1.74 2004/03/17 10:43:35 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_syscalls.c,v 1.75 2004/05/22 22:52:16 jonathan Exp $");
 
 #include "fs_nfs.h"
 #include "opt_nfs.h"
@@ -750,7 +750,7 @@
 					(void) nfs_sndlock(solockp, NULL);
 				if (slp->ns_flag & SLP_VALID) {
 					error =
-					    nfs_send(so, nd->nd_nam2, m, NULL);
+					    nfs_send(so, nd->nd_nam2, m, NULL, p);
 				} else {
 					error = EPIPE;
 					m_freem(m);
--- a/sys/nfs/nfs_var.h	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/nfs_var.h	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_var.h,v 1.44 2004/05/10 10:40:42 yamt Exp $	*/
+/*	$NetBSD: nfs_var.h,v 1.45 2004/05/22 22:52:16 jonathan Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -144,7 +144,7 @@
 int nqsrv_cmpnam __P((struct nfssvc_sock *, struct mbuf *, struct nqhost *));
 void nqsrv_send_eviction __P((struct vnode *, struct nqlease *,
 			      struct nfssvc_sock *, struct mbuf *,
-			      struct ucred *));
+			      struct ucred *, struct proc *));
 void nqsrv_waitfor_expiry __P((struct nqlease *));
 void nqnfs_serverd __P((void));
 int nqnfsrv_getlease __P((struct nfsrv_descript *, struct nfssvc_sock *,
@@ -152,7 +152,7 @@
 int nqnfsrv_vacated __P((struct nfsrv_descript *, struct nfssvc_sock *,
 			 struct proc *, struct mbuf **));
 int nqnfs_getlease __P((struct vnode *, int, struct ucred *, struct proc *));
-int nqnfs_vacated __P((struct vnode *, struct ucred *));
+int nqnfs_vacated __P((struct vnode *, struct ucred *, struct proc *));
 int nqnfs_callback __P((struct nfsmount *, struct mbuf *, struct mbuf *,
 			caddr_t));
 
@@ -210,14 +210,15 @@
 		      int));
 
 /* nfs_socket.c */
-int nfs_connect __P((struct nfsmount *, struct nfsreq *));
-int nfs_reconnect __P((struct nfsreq *));
+int nfs_connect __P((struct nfsmount *, struct nfsreq *, struct proc *));
+int nfs_reconnect __P((struct nfsreq *, struct proc *));
 void nfs_disconnect __P((struct nfsmount *));
 void nfs_safedisconnect __P((struct nfsmount *));
 int nfs_send __P((struct socket *, struct mbuf *, struct mbuf *,
-		  struct nfsreq *));
-int nfs_receive __P((struct nfsreq *, struct mbuf **, struct mbuf **));
-int nfs_reply __P((struct nfsreq *));
+		  struct nfsreq *, struct proc *));
+int nfs_receive __P((struct nfsreq *, struct mbuf **, struct mbuf **,
+		     struct proc *));
+int nfs_reply __P((struct nfsreq *, struct proc *));
 int nfs_request __P((struct nfsnode *, struct mbuf *, int, struct proc *,
 		     struct ucred *, struct mbuf **, struct mbuf **,
 		     caddr_t *, int *));
--- a/sys/nfs/nfs_vfsops.c	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/nfs_vfsops.c	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_vfsops.c,v 1.137 2004/04/27 17:37:31 jrf Exp $	*/
+/*	$NetBSD: nfs_vfsops.c,v 1.138 2004/05/22 22:52:16 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993, 1995
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_vfsops.c,v 1.137 2004/04/27 17:37:31 jrf Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_vfsops.c,v 1.138 2004/05/22 22:52:16 jonathan Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -415,9 +415,10 @@
 }
 
 void
-nfs_decode_args(nmp, argp)
+nfs_decode_args(nmp, argp, p)
 	struct nfsmount *nmp;
 	struct nfs_args *argp;
+	struct proc *p;
 {
 	int s;
 	int adjsock;
@@ -538,7 +539,7 @@
 	if (nmp->nm_so && adjsock) {
 		nfs_safedisconnect(nmp);
 		if (nmp->nm_sotype == SOCK_DGRAM)
-			while (nfs_connect(nmp, (struct nfsreq *)0)) {
+			while (nfs_connect(nmp, (struct nfsreq *)0, p)) {
 				printf("nfs_args: retrying connect\n");
 				(void) tsleep((caddr_t)&lbolt,
 					      PSOCK, "nfscn3", 0);
@@ -629,7 +630,7 @@
 		    ~(NFSMNT_NFSV3|NFSMNT_NQNFS|NFSMNT_XLATECOOKIE)) |
 		    (nmp->nm_flag &
 			(NFSMNT_NFSV3|NFSMNT_NQNFS|NFSMNT_XLATECOOKIE));
-		nfs_decode_args(nmp, &args);
+		nfs_decode_args(nmp, &args, p);
 		return (0);
 	}
 	if (args.fhsize < 0 || args.fhsize > NFSX_V3FHMAX)
@@ -752,7 +753,7 @@
 	nmp->nm_sotype = argp->sotype;
 	nmp->nm_soproto = argp->proto;
 
-	nfs_decode_args(nmp, argp);
+	nfs_decode_args(nmp, argp, p);
 
 	mp->mnt_fs_bshift = ffs(MIN(nmp->nm_rsize, nmp->nm_wsize)) - 1;
 	mp->mnt_dev_bshift = DEV_BSHIFT;
@@ -762,7 +763,7 @@
 	 * the first request, in case the server is not responding.
 	 */
 	if (nmp->nm_sotype == SOCK_DGRAM &&
-		(error = nfs_connect(nmp, (struct nfsreq *)0)))
+		(error = nfs_connect(nmp, (struct nfsreq *)0, p)))
 		goto bad;
 
 	/*
--- a/sys/nfs/nfsdiskless.h	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/nfsdiskless.h	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfsdiskless.h,v 1.22 2004/05/01 06:16:42 matt Exp $	*/
+/*	$NetBSD: nfsdiskless.h,v 1.23 2004/05/22 22:52:16 jonathan Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1997 The NetBSD Foundation, Inc.
@@ -77,11 +77,11 @@
 void nfs_boot_flushrt __P((struct ifnet *));
 int nfs_boot_setrecvtimo __P((struct socket *));
 int nfs_boot_enbroadcast __P((struct socket *));
-int nfs_boot_sobind_ipport __P((struct socket *, u_int16_t));
+int nfs_boot_sobind_ipport __P((struct socket *, u_int16_t, struct proc *));
 int nfs_boot_sendrecv __P((struct socket *, struct mbuf *,
 			   int (*)(struct mbuf*, void*, int), struct mbuf*,
 			   int (*)(struct mbuf*, void*), struct mbuf**,
-			   struct mbuf**, void*));
+			   struct mbuf**, void*, struct proc *));
 
 int nfs_bootdhcp  __P((struct nfs_diskless *, struct proc *));
 int nfs_bootparam __P((struct nfs_diskless *, struct proc *));
--- a/sys/nfs/nfsmount.h	Sat May 22 22:13:50 2004 +0000
+++ b/sys/nfs/nfsmount.h	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfsmount.h,v 1.31 2004/04/27 17:37:31 jrf Exp $	*/
+/*	$NetBSD: nfsmount.h,v 1.32 2004/05/22 22:52:16 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -180,7 +180,8 @@
 		struct mbuf *nam, const char *pth, const char *hst,
 		struct vnode **vpp, struct proc *p));
 int	nfs_mountroot __P((void));
-void	nfs_decode_args __P((struct nfsmount *, struct nfs_args *));
+void	nfs_decode_args __P((struct nfsmount *, struct nfs_args *,
+		struct proc *p));
 int	nfs_start __P((struct mount *mp, int flags, struct proc *p));
 int	nfs_unmount __P((struct mount *mp, int mntflags, struct proc *p));
 int	nfs_root __P((struct mount *mp, struct vnode **vpp));
--- a/sys/sys/domain.h	Sat May 22 22:13:50 2004 +0000
+++ b/sys/sys/domain.h	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: domain.h,v 1.18 2004/04/22 01:34:17 matt Exp $	*/
+/*	$NetBSD: domain.h,v 1.19 2004/05/22 22:52:16 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -42,6 +42,7 @@
 /*
  * Forward structure declarations for function prototypes [sic].
  */
+struct	proc;
 struct	mbuf;
 struct	ifnet;
 
@@ -51,7 +52,7 @@
 	void	(*dom_init)		/* initialize domain data structures */
 			(void);
 	int	(*dom_externalize)	/* externalize access rights */
-			(struct mbuf *);
+			(struct mbuf *, struct proc *);
 	void	(*dom_dispose)		/* dispose of internalized rights */
 			(struct mbuf *);
 	const struct protosw *dom_protosw, *dom_protoswNPROTOSW;
--- a/sys/sys/socketvar.h	Sat May 22 22:13:50 2004 +0000
+++ b/sys/sys/socketvar.h	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: socketvar.h,v 1.74 2004/04/22 01:01:42 matt Exp $	*/
+/*	$NetBSD: socketvar.h,v 1.75 2004/05/22 22:52:16 jonathan Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1990, 1993
@@ -122,7 +122,7 @@
 	caddr_t		so_upcallarg;	/* Arg for above */
 	int		(*so_send) (struct socket *, struct mbuf *,
 					struct uio *, struct mbuf *,
-					struct mbuf *, int);
+					struct mbuf *, int, struct proc *);
 	int		(*so_receive) (struct socket *,
 					struct mbuf **,
 					struct uio *, struct mbuf **,
@@ -303,9 +303,9 @@
 void	socantrcvmore(struct socket *);
 void	socantsendmore(struct socket *);
 int	soclose(struct socket *);
-int	soconnect(struct socket *, struct mbuf *);
+int	soconnect(struct socket *, struct mbuf *, struct proc *);
 int	soconnect2(struct socket *, struct socket *);
-int	socreate(int, struct socket **, int, int);
+int	socreate(int, struct socket **, int, int, struct proc *);
 int	sodisconnect(struct socket *);
 void	sofree(struct socket *);
 int	sogetopt(struct socket *, int, int, struct mbuf **);
@@ -324,7 +324,7 @@
 int	soreserve(struct socket *, u_long, u_long);
 void	sorflush(struct socket *);
 int	sosend(struct socket *, struct mbuf *, struct uio *,
-	    struct mbuf *, struct mbuf *, int);
+	    struct mbuf *, struct mbuf *, int, struct proc *);
 int	sosetopt(struct socket *, int, int, struct mbuf *);
 int	soshutdown(struct socket *, int);
 void	sowakeup(struct socket *, struct sockbuf *, int);
--- a/sys/sys/un.h	Sat May 22 22:13:50 2004 +0000
+++ b/sys/sys/un.h	Sat May 22 22:52:13 2004 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: un.h,v 1.35 2004/04/18 21:43:45 matt Exp $	*/
+/*	$NetBSD: un.h,v 1.36 2004/05/22 22:52:17 jonathan Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -79,7 +79,7 @@
 void	unp_mark (struct file *);
 void	unp_scan (struct mbuf *, void (*)(struct file *), int);
 void	unp_shutdown (struct unpcb *);
-int 	unp_externalize (struct mbuf *);
+int 	unp_externalize (struct mbuf *, struct proc *);
 int	unp_internalize (struct mbuf *, struct proc *);
 void 	unp_dispose (struct mbuf *);
 int	unp_output (struct mbuf *, struct mbuf *, struct unpcb *,