From owner-svn-src-projects@freebsd.org  Fri Aug 18 01:23:55 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 9D780DE4648
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 18 Aug 2017 01:23:55 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 74A0B6CDC5;
 Fri, 18 Aug 2017 01:23:55 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v7I1NsBp045283;
 Fri, 18 Aug 2017 01:23:54 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v7I1NsmL045281;
 Fri, 18 Aug 2017 01:23:54 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201708180123.v7I1NsmL045281@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 18 Aug 2017 01:23:54 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r322640 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
X-SVN-Commit-Author: rmacklem
X-SVN-Commit-Paths: projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Commit-Revision: 322640
X-SVN-Commit-Repository: base
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 18 Aug 2017 01:23:55 -0000

Author: rmacklem
Date: Fri Aug 18 01:23:54 2017
New Revision: 322640
URL: https://svnweb.freebsd.org/changeset/base/322640

Log:
  Fix the searches of the device id lists so that they include the mirror
  entries. Also, modify nfsrv_dssetsockmnt() so that it only returns ENOENT
  if none of the DSs were found. This will allow a mirrored system to run in
  a degraded mode when one mirror is offline.
  
  The mirroring is now working for normal operation, although Flex File layout
  has not yet been tested (all I/O goes through MDS when mirroring is set up).
  
  Now, the fun part is to code handling of a DS mirror failure and resilvering
  of a DS mirror to bring it back online.
  Also, testing of Flex File layout against a recent Linux client needs to be
  done.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Fri Aug 18 01:19:46 2017	(r322639)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Fri Aug 18 01:23:54 2017	(r322640)
@@ -4188,10 +4188,10 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 	struct vnode *dvp, **tdvpp;
 	struct nfsmount *nmp;
 	struct sockaddr *sad;
-	struct nfsdevice *ds;
+	struct nfsdevice *ds, *mds;
 	struct pnfsdsfile *pf;
 	uint32_t dsdir;
-	int error, fhiszero, i, j, mirrorcnt;
+	int done, error, fhiszero, gotone, i, j, mirrorcnt;
 
 	*mirrorcntp = 1;
 	fhiszero = 0;
@@ -4209,6 +4209,7 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 	    buflen != sizeof(*pf) * mirrorcnt))
 		error = ENOATTR;
 	pf = (struct pnfsdsfile *)buf;
+	gotone = 0;
 	for (i = 0; i < mirrorcnt && error == 0; i++, pf++) {
 		sad = (struct sockaddr *)&pf->dsf_sin;
 		dsdir = pf->dsf_dir;
@@ -4220,8 +4221,21 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 			if (NFSBCMP(&zerofh, &pf->dsf_fh, sizeof(zerofh)) == 0)
 				fhiszero = 1;
 			/* Use the socket address to find the mount point. */
+			done = 0;
 			NFSDDSLOCK();
 			TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) {
+				TAILQ_FOREACH(mds, &ds->nfsdev_mirrors,
+				    nfsdev_list) {
+					dvp = mds->nfsdev_dvp;
+					nmp = VFSTONFS(dvp->v_mount);
+					if (nfsaddr2_match(sad, nmp->nm_nam)) {
+						ds = mds;
+						done = 1;
+						break;
+					}
+				}
+				if (done != 0)
+					break;
 				dvp = ds->nfsdev_dvp;
 				nmp = VFSTONFS(dvp->v_mount);
 				if (nfsaddr2_match(sad, nmp->nm_nam))
@@ -4229,6 +4243,7 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 			}
 			NFSDDSUNLOCK();
 			if (ds != NULL) {
+				gotone = 1;
 				if (dvpp != NULL || fhiszero != 0) {
 					dvp = ds->nfsdev_dsdir[dsdir];
 					error = vn_lock(dvp, lktype);
@@ -4251,26 +4266,30 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 					    NFSX_V4DEVICEID);
 					devid += NFSX_V4DEVICEID;
 				}
-			} else
-				error = ENOENT;
-		}
-		if (error == 0) {
-			if (dvpp != NULL) {
-				*tdvpp++ = dvp;
-				*nmpp++ = nmp;
+				if (error == 0) {
+					if (dvpp != NULL) {
+						*tdvpp++ = dvp;
+						*nmpp++ = nmp;
+					}
+					if (fhp != NULL)
+						NFSBCOPY(&pf->dsf_fh, fhp++,
+						    NFSX_MYFH);
+					if (fnamep != NULL && i == 0)
+						strlcpy(fnamep,
+						    pf->dsf_filename,
+						    sizeof(pf->dsf_filename));
+				} else
+					NFSD_DEBUG(4, "nfsrv_dsgetsockmnt "
+					    "err=%d\n", error);
 			}
-			if (fhp != NULL)
-				NFSBCOPY(&pf->dsf_fh, fhp++, NFSX_MYFH);
-			if (fnamep != NULL && i == 0)
-				strlcpy(fnamep, pf->dsf_filename,
-				    sizeof(pf->dsf_filename));
-		} else
-			NFSD_DEBUG(4, "nfsrv_dsgetsockmnt err=%d\n", error);
+		}
 	}
+	if (error == 0 && gotone == 0)
+		error = ENOENT;
 
 	if (error == 0)
 		*mirrorcntp = mirrorcnt;
-	else if (i > 1 && dvpp != NULL) {
+	else if (i > 1 && dvpp != NULL && gotone != 0) {
 		/*
 		 * If the error didn't occur on the first one and dvpp != NULL,
 		 * the one(s) prior to the failure will have locked dvp's that

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Fri Aug 18 01:19:46 2017	(r322639)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Fri Aug 18 01:23:54 2017	(r322640)
@@ -6596,8 +6596,8 @@ int
 nfsrv_getdevinfo(char *devid, int layouttype, uint32_t *maxcnt,
     uint32_t *notify, int *devaddrlen, char **devaddr)
 {
-	struct nfsdevice *ds;
-	int i;
+	struct nfsdevice *ds, *mds;
+	int done, i;
 
 	if (layouttype != NFSLAYOUT_NFSV4_1_FILES)
 		return (NFSERR_UNKNLAYOUTTYPE);
@@ -6607,8 +6607,19 @@ nfsrv_getdevinfo(char *devid, int layouttype, uint32_t
 	 * away, but the order changes in the list.  As such, the lock only
 	 * needs to be held during the search through the list.
 	 */
+	done = 0;
 	NFSDDSLOCK();
 	TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) {
+		TAILQ_FOREACH(mds, &ds->nfsdev_mirrors, nfsdev_list) {
+			if (NFSBCMP(devid, mds->nfsdev_deviceid,
+			    NFSX_V4DEVICEID) == 0) {
+				ds = mds;
+				done = 1;
+				break;
+			}
+		}
+		if (done != 0)
+			break;
 		if (NFSBCMP(devid, ds->nfsdev_deviceid, NFSX_V4DEVICEID) == 0)
 			break;
 	}