Date: Sun, 21 Jan 2007 11:33:21 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 113248 for review Message-ID: <200701211133.l0LBXLmg099897@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=113248 Change 113248 by zec@zec_tca51 on 2007/01/21 11:33:03 Initial attempt to make the NFS client code aware of stack virtualization. So far NFS mounts work from the default vnet, but not from the others. This problem is probably related to the fact that nfs_connect() always provides &thread0, which is bound to the default stack instance, as an argument to socreate(). As a consequence the NFS socket gets open in a wrong stack I guess... This needs more thought... Affected files ... .. //depot/projects/vimage/src/sys/kern/sys_socket.c#3 edit .. //depot/projects/vimage/src/sys/kern/uipc_socket.c#6 edit .. //depot/projects/vimage/src/sys/kern/uipc_syscalls.c#4 edit .. //depot/projects/vimage/src/sys/nfsclient/nfs_vnops.c#2 edit Differences ... ==== //depot/projects/vimage/src/sys/kern/sys_socket.c#3 (text+ko) ==== @@ -112,13 +112,11 @@ int error; NET_LOCK_GIANT(); - CURVNETB_SET(so->so_vnetb); #ifdef MAC SOCK_LOCK(so); error = mac_check_socket_send(active_cred, so); SOCK_UNLOCK(so); if (error) { - CURVNETB_RESTORE(); NET_UNLOCK_GIANT(); return (error); } @@ -129,7 +127,6 @@ psignal(uio->uio_td->td_proc, SIGPIPE); PROC_UNLOCK(uio->uio_td->td_proc); } - CURVNETB_RESTORE(); NET_UNLOCK_GIANT(); return (error); } @@ -323,9 +320,7 @@ fp->f_data = NULL; if (so) { - CURVNETB_SET(so->so_vnetb); error = soclose(so); - CURVNETB_RESTORE(); } NET_UNLOCK_GIANT(); return (error); ==== //depot/projects/vimage/src/sys/kern/uipc_socket.c#6 (text+ko) ==== @@ -508,8 +508,12 @@ struct sockaddr *nam; struct thread *td; { + int error; - return ((*so->so_proto->pr_usrreqs->pru_bind)(so, nam, td)); + CURVNETB_SET(so->so_vnetb); + error = (*so->so_proto->pr_usrreqs->pru_bind)(so, nam, td); + CURVNETB_RESTORE(); + return error; } /* @@ -667,6 +671,7 @@ KASSERT(!(so->so_state & SS_NOFDREF), ("soclose: SS_NOFDREF on enter")); + CURVNETB_SET(so->so_vnetb); funsetown(&so->so_sigio); if (so->so_state & SS_ISCONNECTED) { if ((so->so_state & SS_ISDISCONNECTING) == 0) { @@ -718,6 +723,7 @@ KASSERT((so->so_state & SS_NOFDREF) == 0, ("soclose: NOFDREF")); so->so_state |= SS_NOFDREF; sorele(so); + CURVNETB_RESTORE(); return (error); } @@ -1344,8 +1350,10 @@ KASSERT(so->so_proto->pr_usrreqs->pru_sosend != sosend, ("sosend: protocol calls sosend")); + CURVNETB_SET(so->so_vnetb); error = so->so_proto->pr_usrreqs->pru_sosend(so, addr, uio, top, control, flags, td); + CURVNETB_RESTORE(); return (error); } ==== //depot/projects/vimage/src/sys/kern/uipc_syscalls.c#4 (text+ko) ==== @@ -238,7 +238,6 @@ if (error) goto done2; so = fp->f_data; - CURVNETB_SET(so->so_vnetb); #ifdef MAC SOCK_LOCK(so); error = mac_check_socket_bind(td->td_ucred, so, sa); @@ -251,7 +250,6 @@ done1: #endif fdrop(fp, td); - CURVNETB_RESTORE(); done2: NET_UNLOCK_GIANT(); return (error); @@ -800,7 +798,6 @@ if (error) goto bad2; so = (struct socket *)fp->f_data; - CURVNETB_SET(so->so_vnetb); #ifdef MAC SOCK_LOCK(so); @@ -852,7 +849,6 @@ #endif bad: fdrop(fp, td); - CURVNETB_RESTORE(); bad2: NET_UNLOCK_GIANT(); return (error); ==== //depot/projects/vimage/src/sys/nfsclient/nfs_vnops.c#2 (text+ko) ==== @@ -40,6 +40,7 @@ */ #include "opt_inet.h" +#include "opt_vimage.h" #include <sys/param.h> #include <sys/kernel.h> @@ -60,6 +61,7 @@ #include <sys/stat.h> #include <sys/sysctl.h> #include <sys/signalvar.h> +#include <sys/vimage.h> #include <vm/vm.h> #include <vm/vm_object.h> @@ -80,6 +82,8 @@ #include <nfsclient/nfsm_subs.h> #include <net/if.h> + +#include <netinet/vinet.h> #include <netinet/in.h> #include <netinet/in_var.h> @@ -1338,6 +1342,7 @@ static int nfs_create(struct vop_create_args *ap) { + INIT_VNET_INET(curvnetb); struct vnode *dvp = ap->a_dvp; struct vattr *vap = ap->a_vap; struct componentname *cnp = ap->a_cnp; @@ -1376,8 +1381,8 @@ *tl = txdr_unsigned(NFSV3CREATE_EXCLUSIVE); tl = nfsm_build(u_int32_t *, NFSX_V3CREATEVERF); #ifdef INET - if (!TAILQ_EMPTY(&in_ifaddrhead)) - *tl++ = IA_SIN(TAILQ_FIRST(&in_ifaddrhead))->sin_addr.s_addr; + if (!TAILQ_EMPTY(&V_in_ifaddrhead)) + *tl++ = IA_SIN(TAILQ_FIRST(&V_in_ifaddrhead))->sin_addr.s_addr; else #endif *tl++ = create_verf;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200701211133.l0LBXLmg099897>