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