From owner-p4-projects@FreeBSD.ORG Sun Jan 21 11:33:22 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6481516A40F; Sun, 21 Jan 2007 11:33:22 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 3F60E16A400 for ; Sun, 21 Jan 2007 11:33:22 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 3098F13C45B for ; Sun, 21 Jan 2007 11:33:22 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l0LBXMH7099901 for ; Sun, 21 Jan 2007 11:33:22 GMT (envelope-from zec@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l0LBXLmg099897 for perforce@freebsd.org; Sun, 21 Jan 2007 11:33:21 GMT (envelope-from zec@FreeBSD.org) Date: Sun, 21 Jan 2007 11:33:21 GMT Message-Id: <200701211133.l0LBXLmg099897@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to zec@FreeBSD.org using -f From: Marko Zec To: Perforce Change Reviews Cc: Subject: PERFORCE change 113248 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 21 Jan 2007 11:33:22 -0000 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 #include @@ -60,6 +61,7 @@ #include #include #include +#include #include #include @@ -80,6 +82,8 @@ #include #include + +#include #include #include @@ -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;