PERFORCE change 119250 for review

Marko Zec zec at FreeBSD.org
Fri May 4 18:00:08 UTC 2007


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

Change 119250 by zec at zec_zoo on 2007/05/04 17:59:15

	A set of kludges which allow for NFS netbooting.  Basically
	the key is to properly set / restore curvnet whenever necessary...

Affected files ...

.. //depot/projects/vimage/src/sys/nfsclient/nfs_diskless.c#5 edit
.. //depot/projects/vimage/src/sys/nfsclient/nfs_socket.c#4 edit
.. //depot/projects/vimage/src/sys/nfsclient/nfs_vfsops.c#5 edit
.. //depot/projects/vimage/src/sys/nfsclient/nfs_vnops.c#5 edit

Differences ...

==== //depot/projects/vimage/src/sys/nfsclient/nfs_diskless.c#5 (text+ko) ====

@@ -151,7 +151,7 @@
 void
 nfs_setup_diskless(void)
 {
-	INIT_VNET_NET(&vnet_0);
+	INIT_VNET_NET(curvnet);
 	struct nfs_diskless *nd = &nfs_diskless;
 	struct ifnet *ifp;
 	struct ifaddr *ifa;

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

@@ -40,6 +40,7 @@
  */
 
 #include "opt_inet6.h"
+#include "opt_vimage.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -58,6 +59,7 @@
 #include <sys/sysctl.h>
 #include <sys/syslog.h>
 #include <sys/vnode.h>
+#include <sys/vimage.h>
 
 #include <netinet/in.h>
 #include <netinet/tcp.h>
@@ -1454,6 +1456,7 @@
 			mtx_unlock(&nmp->nm_mtx);
 			continue;
 		}
+		CURVNET_SET(so->so_vnet);
 		/*
 		 * If there is enough space and the window allows..
 		 *	Resend it
@@ -1521,6 +1524,7 @@
 			mtx_unlock(&rep->r_mtx);
 			mtx_unlock(&nmp->nm_mtx);
 		}
+		CURVNET_RESTORE();
 	}
 	mtx_unlock(&nfs_reqq_mtx);
 	callout_reset(&nfs_callout, nfs_ticks, nfs_timer, NULL);

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

@@ -401,7 +401,7 @@
 int
 nfs_mountroot(struct mount *mp, struct thread *td)
 {
-	INIT_VPROCG(&vprocg_0);
+	INIT_VPROCG(td->td_ucred->cr_vimage->v_procg);
 	struct nfsv3_diskless *nd = &nfsv3_diskless;
 	struct socket *so;
 	struct vnode *vp;
@@ -413,14 +413,17 @@
 
 	NET_ASSERT_GIANT();
 
+	CURVNET_SET(td->td_ucred->cr_vimage->v_vnet);
 #if defined(BOOTP_NFSROOT) && defined(BOOTP)
 	bootpc_init();		/* use bootp to get nfs_diskless filled in */
 #elif defined(NFS_ROOT)
 	nfs_setup_diskless();
 #endif
 
-	if (nfs_diskless_valid == 0)
+	if (nfs_diskless_valid == 0) {
+		CURVNET_RESTORE();
 		return (-1);
+	}
 	if (nfs_diskless_valid == 1)
 		nfs_convert_diskless();
 
@@ -502,6 +505,7 @@
 	printf("NFS ROOT: %s\n", buf);
 	if ((error = nfs_mountdiskless(buf, MNT_RDONLY,
 	    &nd->root_saddr, &nd->root_args, td, &vp, mp)) != 0) {
+		CURVNET_RESTORE();
 		return (error);
 	}
 
@@ -516,6 +520,8 @@
 		if (V_hostname[i] == '\0')
 			break;
 	inittodr(ntohl(nd->root_time));
+
+	CURVNET_RESTORE();
 	return (0);
 }
 

==== //depot/projects/vimage/src/sys/nfsclient/nfs_vnops.c#5 (text+ko) ====

@@ -1351,7 +1351,6 @@
 static int
 nfs_create(struct vop_create_args *ap)
 {
-	INIT_VNET_INET(curvnet);
 	struct vnode *dvp = ap->a_dvp;
 	struct vattr *vap = ap->a_vap;
 	struct componentname *cnp = ap->a_cnp;
@@ -1390,6 +1389,7 @@
 			*tl = txdr_unsigned(NFSV3CREATE_EXCLUSIVE);
 			tl = nfsm_build(u_int32_t *, NFSX_V3CREATEVERF);
 #ifdef INET
+			INIT_VNET_INET(VFSTONFS(dvp->v_mount)->nm_so->so_vnet);
 			if (!TAILQ_EMPTY(&V_in_ifaddrhead))
 				*tl++ = IA_SIN(TAILQ_FIRST(&V_in_ifaddrhead))->sin_addr.s_addr;
 			else


More information about the p4-projects mailing list