Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 Mar 2012 03:16:45 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r232637 - projects/nfsv4.1-client/sys/fs/nfsclient
Message-ID:  <201203070316.q273GjtN072801@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201203070316.q273GjtN072801>