PERFORCE change 165156 for review

Marko Zec zec at FreeBSD.org
Thu Jun 25 12:36:58 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=165156

Change 165156 by zec at zec_amdx4 on 2009/06/25 12:36:28

	First brute-force / uninformed attempt at making NFS and
	VIMAGE play togetger.
	
	So far I'm able to export a local filesystem and mount it
	back at a different mntpoint at the same machine via NFS,
	move files back and forth, and do a clean unmount when done.
	There's still a lot of vnet recursion noise flooding the
	console, but this is the first step...

Affected files ...

.. //depot/projects/vimage-commit2/src/sys/kern/uipc_socket.c#26 edit
.. //depot/projects/vimage-commit2/src/sys/kern/vfs_export.c#11 edit
.. //depot/projects/vimage-commit2/src/sys/nfsclient/nfs_krpc.c#7 edit
.. //depot/projects/vimage-commit2/src/sys/nfsclient/nfs_socket.c#9 edit
.. //depot/projects/vimage-commit2/src/sys/nfsclient/nfs_vfsops.c#21 edit
.. //depot/projects/vimage-commit2/src/sys/nfsclient/nfsmount.h#5 edit
.. //depot/projects/vimage-commit2/src/sys/nfsserver/nfs_srvkrpc.c#10 edit
.. //depot/projects/vimage-commit2/src/sys/rpc/svc.c#6 edit

Differences ...

==== //depot/projects/vimage-commit2/src/sys/kern/uipc_socket.c#26 (text+ko) ====

@@ -285,6 +285,9 @@
 	so->so_gencnt = ++so_gencnt;
 	++numopensockets;
 #ifdef VIMAGE
+	KASSERT(vnet != NULL, ("soalloc(): NULL vnet"));
+	KASSERT(vnet->vnet_magic_n == VNET_MAGIC_N,
+	    ("soalloc(): invalid vnet: %p", vnet));
 	++vnet->sockcnt;	/* Locked with so_global_mtx. */
 	so->so_vnet = vnet;
 #endif

==== //depot/projects/vimage-commit2/src/sys/kern/vfs_export.c#11 (text+ko) ====

@@ -48,8 +48,10 @@
 #include <sys/mutex.h>
 #include <sys/rwlock.h>
 #include <sys/refcount.h>
+#include <sys/jail.h>
 #include <sys/socket.h>
 #include <sys/systm.h>
+#include <sys/vimage.h>
 #include <sys/vnode.h>
 
 #include <net/radix.h>
@@ -79,6 +81,7 @@
 struct netexport {
 	struct	netcred ne_defexported;		      /* Default export */
 	struct	radix_node_head *ne_rtable[AF_MAX+1]; /* Individual exports */
+	struct	vnet *ne_vnet;			      /* vnet for this export */
 };
 
 /*
@@ -139,6 +142,7 @@
 	}
 #endif
 
+	CURVNET_SET(nep->ne_vnet);
 	i = sizeof(struct netcred) + argp->ex_addrlen + argp->ex_masklen;
 	np = (struct netcred *) malloc(i, M_NETADDR, M_WAITOK | M_ZERO);
 	saddr = (struct sockaddr *) (np + 1);
@@ -209,9 +213,11 @@
 	np->netc_numsecflavors = argp->ex_numsecflavors;
 	bcopy(argp->ex_secflavors, np->netc_secflavors,
 	    sizeof(np->netc_secflavors));
+	CURVNET_RESTORE();
 	return (0);
 out:
 	free(np, M_NETADDR);
+	CURVNET_RESTORE();
 	return (error);
 }
 
@@ -278,6 +284,7 @@
 			MNT_IUNLOCK(mp);
 		}
 		vfs_free_addrlist(nep);
+		/* XXX TODO: unref nep->ne_vnet */
 		mp->mnt_export = NULL;
 		free(nep, M_MOUNT);
 		nep = NULL;
@@ -289,6 +296,8 @@
 		if (nep == NULL) {
 			nep = malloc(sizeof(struct netexport), M_MOUNT, M_WAITOK | M_ZERO);
 			mp->mnt_export = nep;
+			nep->ne_vnet = TD_TO_VNET(curthread);
+			/* XXX TODO: ref nep->ne_vnet */
 		}
 		if (argp->ex_flags & MNT_EXPUBLIC) {
 			if ((error = vfs_setpublicfs(mp, nep, argp)) != 0)

==== //depot/projects/vimage-commit2/src/sys/nfsclient/nfs_krpc.c#7 (text+ko) ====

@@ -57,6 +57,7 @@
 #include <sys/syscallsubr.h>
 #include <sys/sysctl.h>
 #include <sys/syslog.h>
+#include <sys/vimage.h>
 #include <sys/vnode.h>
 
 #include <rpc/rpc.h>
@@ -508,6 +509,8 @@
 	nf.nf_lastmsg = now.tv_sec -
 		((nmp->nm_tprintf_delay) - (nmp->nm_tprintf_initial_delay));
 
+	CURVNET_SET(nmp->nm_vnet);
+
 	/*
 	 * XXX if not already connected call nfs_connect now. Longer
 	 * term, change nfs_mount to call nfs_connect unconditionally
@@ -519,6 +522,7 @@
 	auth = nfs_getauth(nmp, cred);
 	if (!auth) {
 		m_freem(mreq);
+		CURVNET_RESTORE();
 		return (EACCES);
 	}
 	bzero(&ext, sizeof(ext));
@@ -599,6 +603,7 @@
 	if (error == ENOMEM) {
 		m_freem(mrep);
 		AUTH_DESTROY(auth);
+		CURVNET_RESTORE();
 		return (error);
 	}
 
@@ -663,6 +668,7 @@
 	*mdp = md;
 	*dposp = dpos;
 	AUTH_DESTROY(auth);
+	CURVNET_RESTORE();
 	return (0);
 
 nfsmout:
@@ -687,6 +693,7 @@
 	m_freem(mreq);
 	if (auth)
 		AUTH_DESTROY(auth);
+	CURVNET_RESTORE();
 	return (error);
 }
 

==== //depot/projects/vimage-commit2/src/sys/nfsclient/nfs_socket.c#9 (text+ko) ====

@@ -1157,6 +1157,8 @@
 	    ((nmp->nm_tprintf_delay) - (nmp->nm_tprintf_initial_delay));
 	mrest_len = m_length(mrest, NULL);
 
+	CURVNET_SET(nmp->nm_vnet);
+
 	/*
 	 * Get the RPC header with authorization.
 	 */
@@ -1309,6 +1311,7 @@
 		m_freem(rep->r_mreq);
 		mtx_destroy(&rep->r_mtx);
 		free((caddr_t)rep, M_NFSREQ);
+		CURVNET_RESTORE();
 		return (error);
 	}
 
@@ -1328,6 +1331,7 @@
 		m_freem(rep->r_mreq);
 		mtx_destroy(&rep->r_mtx);
 		free((caddr_t)rep, M_NFSREQ);
+		CURVNET_RESTORE();
 		return (error);
 	}
 
@@ -1377,6 +1381,7 @@
 			m_freem(rep->r_mreq);
 			mtx_destroy(&rep->r_mtx);
 			free((caddr_t)rep, M_NFSREQ);
+			CURVNET_RESTORE();
 			return (error);
 		}
 
@@ -1386,6 +1391,7 @@
 		m_freem(rep->r_mreq);
 		mtx_destroy(&rep->r_mtx);
 		free((caddr_t)rep, M_NFSREQ);
+		CURVNET_RESTORE();
 		return (0);
 	}
 	m_freem(mrep);
@@ -1394,6 +1400,7 @@
 	m_freem(rep->r_mreq);
 	mtx_destroy(&rep->r_mtx);
 	free((caddr_t)rep, M_NFSREQ);
+	CURVNET_RESTORE();
 	return (error);
 }
 

==== //depot/projects/vimage-commit2/src/sys/nfsclient/nfs_vfsops.c#21 (text+ko) ====

@@ -55,6 +55,7 @@
 #include <sys/socketvar.h>
 #include <sys/sockio.h>
 #include <sys/sysctl.h>
+#include <sys/vimage.h>
 #include <sys/vnode.h>
 #include <sys/signalvar.h>
 
@@ -1193,6 +1194,9 @@
 	vfs_getnewfsid(mp);
 	nmp->nm_mountp = mp;
 	mtx_init(&nmp->nm_mtx, "NFSmount lock", NULL, MTX_DEF);			
+#ifdef VIMAGE
+	nmp->nm_vnet = CRED_TO_VNET(cred);
+#endif
 
 	/*
 	 * V2 can only handle 32 bit filesizes.  A 4GB-1 limit may be too

==== //depot/projects/vimage-commit2/src/sys/nfsclient/nfsmount.h#5 (text+ko) ====

@@ -131,6 +131,9 @@
 	fsid_t	nm_fsid;
 	u_int	nm_lease_time;
 	time_t	nm_last_renewal;
+
+	/* VIMAGE */
+	struct vnet *nm_vnet;		/* vnet this mount was created in */
 };
 
 #if defined(_KERNEL)

==== //depot/projects/vimage-commit2/src/sys/nfsserver/nfs_srvkrpc.c#10 (text+ko) ====

@@ -62,6 +62,7 @@
 #include <sys/fcntl.h>
 #include <sys/lockf.h>
 #include <sys/eventhandler.h>
+#include <sys/vimage.h>
 
 #include <netinet/in.h>
 #include <netinet/tcp.h>
@@ -458,6 +459,7 @@
 	 * Steal the socket from userland so that it doesn't close
 	 * unexpectedly.
 	 */
+	CURVNET_SET(TD_TO_VNET(td));
 	if (so->so_type == SOCK_DGRAM)
 		xprt = svc_dg_create(nfsrv_pool, so, 0, 0);
 	else
@@ -469,6 +471,7 @@
 		svc_reg(xprt, NFS_PROG, NFS_VER3, nfssvc_program, NULL);
 		SVC_RELEASE(xprt);
 	}
+	CURVNET_RESTORE();
 
 	return (0);
 }
@@ -526,7 +529,9 @@
 			nfsrv_pool->sp_maxthreads = 4;
 		}
 			
+		CURVNET_SET(TD_TO_VNET(curthread));
 		svc_run(nfsrv_pool);
+		CURVNET_RESTORE();
 
 #ifdef KGSSAPI
 		rpc_gss_clear_svc_name(NFS_PROG, NFS_VER2);

==== //depot/projects/vimage-commit2/src/sys/rpc/svc.c#6 (text+ko) ====

@@ -50,6 +50,7 @@
 #include <sys/lock.h>
 #include <sys/kernel.h>
 #include <sys/kthread.h>
+#include <sys/jail.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
 #include <sys/mutex.h>
@@ -58,6 +59,7 @@
 #include <sys/socketvar.h>
 #include <sys/systm.h>
 #include <sys/ucred.h>
+#include <sys/vimage.h>
 
 #include <rpc/rpc.h>
 #include <rpc/rpcb_clnt.h>
@@ -791,6 +793,8 @@
 	/* now receive msgs from xprtprt (support batch calls) */
 	r = malloc(sizeof(*r), M_RPC, M_WAITOK|M_ZERO);
 
+	CURVNET_SET(TD_TO_VNET(curthread));
+
 	msg.rm_call.cb_cred.oa_base = r->rq_credarea;
 	msg.rm_call.cb_verf.oa_base = &r->rq_credarea[MAX_AUTH_BYTES];
 	r->rq_clntcred = &r->rq_credarea[2*MAX_AUTH_BYTES];
@@ -865,6 +869,7 @@
 		xprt_unregister(xprt);
 	}
 
+	CURVNET_RESTORE();
 	return (stat);
 }
 
@@ -890,7 +895,9 @@
 				 * dispatch method - they must call
 				 * svc_freereq.
 				 */
+				CURVNET_SET(TD_TO_VNET(curthread));
 				(*s->sc_dispatch)(rqstp, xprt);
+				CURVNET_RESTORE();
 				return;
 			}  /* found correct version */
 			prog_found = TRUE;


More information about the p4-projects mailing list