From owner-svn-src-projects@FreeBSD.ORG Wed Mar 7 03:16:46 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 1C2621065672; Wed, 7 Mar 2012 03:16:46 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id F1EE38FC1D; Wed, 7 Mar 2012 03:16:45 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q273GjX6072803; Wed, 7 Mar 2012 03:16:45 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q273GjtN072801; Wed, 7 Mar 2012 03:16:45 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201203070316.q273GjtN072801@svn.freebsd.org> From: Rick Macklem Date: Wed, 7 Mar 2012 03:16:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r232637 - projects/nfsv4.1-client/sys/fs/nfsclient X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 Mar 2012 03:16:46 -0000 Author: rmacklem Date: Wed Mar 7 03:16:45 2012 New Revision: 232637 URL: http://svn.freebsd.org/changeset/base/232637 Log: Add a check for the case of the DS IP address being the same as the one for the MDS and consider using the MDS's session, if they are the same. This avoids doing a TCP connect and an NFSv4.1 EXCHANGE_ID to determine if it is the same server for this case. Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Wed Mar 7 03:11:28 2012 (r232636) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Wed Mar 7 03:16:45 2012 (r232637) @@ -5087,12 +5087,12 @@ static int nfsrpc_fillsa(struct nfsmount *nmp, struct sockaddr_storage *ssp, struct nfsclds **dspp, NFSPROC_T *p) { - struct sockaddr_in *sad, *ssd; - struct sockaddr_in6 *sad6, *ssd6; + struct sockaddr_in *msad, *sad, *ssd; + struct sockaddr_in6 *msad6, *sad6, *ssd6; struct nfsclclient *clp; struct nfssockreq *nrp; struct nfsclds *dsp, *tdsp; - int error; + int error, same_as_mds; enum nfsclds_state retv; uint32_t sequenceid; @@ -5103,6 +5103,7 @@ nfsrpc_fillsa(struct nfsmount *nmp, stru NFSUNLOCKCLSTATE(); if (clp == NULL) return (EPERM); + same_as_mds = 0; nrp = malloc(sizeof(*nrp), M_NFSSOCKREQ, M_WAITOK | M_ZERO); if (ssp->ss_family == AF_INET) { ssd = (struct sockaddr_in *)ssp; @@ -5112,6 +5113,12 @@ nfsrpc_fillsa(struct nfsmount *nmp, stru sad->sin_port = ssd->sin_port; sad->sin_addr.s_addr = ssd->sin_addr.s_addr; nrp->nr_nam = (struct sockaddr *)sad; + /* Now check to see if this address is the same as the MDS. */ + msad = (struct sockaddr_in *)nmp->nm_sockreq.nr_nam; + if (msad != NULL && msad->sin_family == AF_INET && + sad->sin_addr.s_addr == msad->sin_addr.s_addr && + sad->sin_port == msad->sin_port) + same_as_mds = 1; } else if (ssp->ss_family == AF_INET6) { ssd6 = (struct sockaddr_in6 *)ssp; sad6 = malloc(sizeof(*sad6), M_SONAME, M_WAITOK | M_ZERO); @@ -5121,10 +5128,28 @@ nfsrpc_fillsa(struct nfsmount *nmp, stru NFSBCOPY(&ssd6->sin6_addr, &sad6->sin6_addr, sizeof(struct in6_addr)); nrp->nr_nam = (struct sockaddr *)sad6; + /* Now check to see if this address is the same as the MDS. */ + msad6 = (struct sockaddr_in6 *)nmp->nm_sockreq.nr_nam; + if (msad6 != NULL && msad6->sin6_family == AF_INET6 && + IN6_ARE_ADDR_EQUAL(&sad6->sin6_addr, &msad6->sin6_addr) && + sad6->sin6_port == msad6->sin6_port) + same_as_mds = 1; } else { free(nrp, M_NFSSOCKREQ); return (EPERM); } + + /* + * If same address as the MDS and the MDS is a DS, use the MDS session. + */ + if (same_as_mds != 0 && + (TAILQ_FIRST(&nmp->nm_sess)->nfsclds_flags & NFSCLDS_DS) != 0) { + free(nrp->nr_nam, M_SONAME); + free(nrp, M_NFSSOCKREQ); + *dspp = TAILQ_FIRST(&nmp->nm_sess); + return (0); + } + nrp->nr_sotype = SOCK_STREAM; mtx_init(&nrp->nr_mtx, "nfssock", NULL, MTX_DEF); nrp->nr_prog = NFS_PROG;