From owner-freebsd-current@FreeBSD.ORG Wed Jun 17 16:38:31 2009 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0050E1065670 for ; Wed, 17 Jun 2009 16:38:30 +0000 (UTC) (envelope-from zml@FreeBSD.org) Received: from seaxch10.isilon.com (seaxch10.isilon.com [74.85.160.26]) by mx1.freebsd.org (Postfix) with ESMTP id CB7F78FC0A for ; Wed, 17 Jun 2009 16:38:30 +0000 (UTC) (envelope-from zml@FreeBSD.org) Received: from famine.isilon.com ([10.54.190.95]) by seaxch10.isilon.com with Microsoft SMTPSVC(6.0.3790.1830); Wed, 17 Jun 2009 09:25:59 -0700 Received: from zloafman by famine.isilon.com with local (Exim 4.69) (envelope-from ) id 1MGxxW-0004Ed-TH; Wed, 17 Jun 2009 09:25:58 -0700 Date: Wed, 17 Jun 2009 09:25:57 -0700 From: Zachary Loafman To: Martin Message-ID: <20090617162557.GA16254@isilon.com> References: <4A2504AA.1020406@zedat.fu-berlin.de> <20090603235227.GB15659@hades.panopticon> <20090615173315.1cdb39e1@zelda.local> <20090616000758.714912e6@zelda.local> <20090616215803.4a3aa748@zelda.local> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="DocE+STaALJfprDB" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) X-OriginalArrivalTime: 17 Jun 2009 16:26:00.0018 (UTC) FILETIME=[4CC1DB20:01C9EF68] Cc: freebsd-current@freebsd.org Subject: Re: RPCPROG_MNT: RPC: Timed out / receiving NFS error when trying to mount NFS file system after make world X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Jun 2009 16:38:31 -0000 --DocE+STaALJfprDB Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Jun 17, 2009 at 11:35:19AM -0400, Rick Macklem wrote: > One that might be worth trying is a pre-r192913 svc_dg.c. I'll email > you a copy of that, in case you don't have an easy way to get one. This was my rev, and may have some subtle issues on 8.0 (it was originally a 6.x based patch). I've attached a lib/libc/rpc/svc_dg.c patch from Rachel Hestilow that may fix your issue. Martin, can you test it in your environment? I'll get it approved / checked in soon. -- Zach Loafman | Staff Engineer | Isilon Systems --DocE+STaALJfprDB Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="20090616-bug-55392.diff" Index: svc_dg.c =================================================================== --- svc_dg.c (revision 120171) +++ svc_dg.c (working copy) @@ -222,20 +222,25 @@ svc_dg_recvfrom(int fd, char *buf, int b if (!have_lin) return rlen; lin->sin_family = AF_INET; lin->sin_port = 0; *laddrlen = sizeof(struct sockaddr_in); return rlen; } +/* + * Wrapper that acts like recvfrom. Captures the local address for + * incoming packets so that it can be sent out later using + * IP_SENDSRCADDR. + */ static bool_t svc_dg_recv(xprt, msg) SVCXPRT *xprt; struct rpc_msg *msg; { struct svc_dg_data *su = su_data(xprt); XDR *xdrs = &(su->su_xdrs); char *reply; struct sockaddr_storage ss; socklen_t alen; @@ -273,41 +278,45 @@ again: if (su->su_cache != NULL) { if (cache_get(xprt, msg, &reply, &replylen)) { (void)_sendto(xprt->xp_fd, reply, replylen, 0, (struct sockaddr *)(void *)&ss, alen); return (FALSE); } } return (TRUE); } +/* + * Wrapper for sendto. If laddr is set to a specific address, + * it will be sent out as a source address using IP_SENDSRCADDR. + */ static int svc_dg_sendto(int fd, char *buf, int buflen, const struct sockaddr *raddr, socklen_t raddrlen, const struct sockaddr *laddr, socklen_t laddrlen) { struct msghdr msg; struct iovec msg_iov[1]; struct sockaddr_in *laddr_in = (struct sockaddr_in *)laddr; struct in_addr *lin = &laddr_in->sin_addr; char tmp[CMSG_SPACE(sizeof(*lin))]; struct cmsghdr *cmsg; memset((char *)&msg, 0, sizeof(msg)); msg_iov[0].iov_base = buf; msg_iov[0].iov_len = buflen; msg.msg_iov = msg_iov; msg.msg_iovlen = 1; msg.msg_namelen = raddrlen; msg.msg_name = (char *)raddr; - if (laddr->sa_family == AF_INET) { + if (laddr->sa_family == AF_INET && lin->s_addr != INADDR_ANY) { msg.msg_control = (caddr_t)tmp; msg.msg_controllen = CMSG_LEN(sizeof(*lin)); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_len = CMSG_LEN(sizeof(*lin)); cmsg->cmsg_level = IPPROTO_IP; cmsg->cmsg_type = IP_SENDSRCADDR; memcpy(CMSG_DATA(cmsg), lin, sizeof(*lin)); } return _sendmsg(fd, &msg, 0); --DocE+STaALJfprDB--