Date: Thu, 25 Jun 2009 12:36:56 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 165156 for review Message-ID: <200906251236.n5PCauon083863@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=165156 Change 165156 by zec@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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906251236.n5PCauon083863>