Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 Sep 2017 20:23:39 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r323158 - projects/pnfs-planb-server-stable11/sys/fs/nfsserver
Message-ID:  <201709042023.v84KNdc2055436@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Mon Sep  4 20:23:39 2017
New Revision: 323158
URL: https://svnweb.freebsd.org/changeset/base/323158

Log:
  Fix handling of the case where one of the mirrors is no longer online.
  One small step towards handling failure/recovery of a mirror.

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

Modified: projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Mon Sep  4 20:19:36 2017	(r323157)
+++ projects/pnfs-planb-server-stable11/sys/fs/nfsserver/nfs_nfsdport.c	Mon Sep  4 20:23:39 2017	(r323158)
@@ -4174,7 +4174,7 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 	struct nfsdevice *ds, *mds;
 	struct pnfsdsfile *pf;
 	uint32_t dsdir;
-	int done, error, fhiszero, gotone, i, j, mirrorcnt;
+	int done, error, fhiszero, gotone, i, mirrorcnt;
 
 	*mirrorcntp = 1;
 	fhiszero = 0;
@@ -4226,7 +4226,6 @@ 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);
@@ -4250,6 +4249,7 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 					devid += NFSX_V4DEVICEID;
 				}
 				if (error == 0) {
+					gotone++;
 					if (dvpp != NULL) {
 						*tdvpp++ = dvp;
 						*nmpp++ = nmp;
@@ -4271,14 +4271,14 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char 
 		error = ENOENT;
 
 	if (error == 0)
-		*mirrorcntp = mirrorcnt;
-	else if (i > 1 && dvpp != NULL && gotone != 0) {
+		*mirrorcntp = gotone;
+	else if (gotone > 0 && dvpp != NULL) {
 		/*
 		 * 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
 		 * need to be unlocked.
 		 */
-		for (j = 1; j < i; j++) {
+		for (i = 0; i < gotone; i++) {
 			NFSVOPUNLOCK(*dvpp, 0);
 			*dvpp++ = NULL;
 		}



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