svn commit: r333593 - projects/pnfs-planb-server/sys/fs/nfsserver

Rick Macklem rmacklem at FreeBSD.org
Sun May 13 23:55:12 UTC 2018


Author: rmacklem
Date: Sun May 13 23:55:11 2018
New Revision: 333593
URL: https://svnweb.freebsd.org/changeset/base/333593

Log:
  Fix nfsrv_deleteds() for the case of more than two way mirrors with
  the first mirror already disabled when the main DS is disabled.

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

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Sun May 13 23:38:01 2018	(r333592)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Sun May 13 23:55:11 2018	(r333593)
@@ -7284,18 +7284,22 @@ nfsrv_deleteds(struct nfsdevice *fndds, struct nfsdevi
 		return;
 	}
 
-	if (TAILQ_EMPTY(&fndds->nfsdev_mirrors)) {
+	NFSD_DEBUG(4, "deleteds: deleting main ds\n");
+	/* Search for a usable mirror. If none found, return. */
+	TAILQ_FOREACH(mds, &fndds->nfsdev_mirrors, nfsdev_list) {
+		if (mds->nfsdev_nmp != NULL)
+			break;
+	}
+	if (mds == NULL) {
 		printf("nfsrv_deleteds: empty mirror\n");
 		return;
 	}
 
 	/*
-	 * The fndds is the first one, so make the first entry in the
+	 * The fndds is the first one, so make the first valid entry in the
 	 * mirror list the first one.
 	 */
-	NFSD_DEBUG(4, "deleteds: deleting main ds\n");
 	TAILQ_REMOVE(&nfsrv_devidhead, fndds, nfsdev_list);
-	mds = TAILQ_FIRST(&fndds->nfsdev_mirrors);
 	TAILQ_REMOVE(&fndds->nfsdev_mirrors, mds, nfsdev_list);
 	TAILQ_INIT(&mds->nfsdev_mirrors);
 
@@ -7304,7 +7308,7 @@ nfsrv_deleteds(struct nfsdevice *fndds, struct nfsdevi
 	while (nds != NULL) {
 		NFSD_DEBUG(4, "shifting mirror up\n");
 		TAILQ_REMOVE(&fndds->nfsdev_mirrors, nds, nfsdev_list);
-		TAILQ_INSERT_HEAD(&mds->nfsdev_mirrors, nds, nfsdev_list);
+		TAILQ_INSERT_TAIL(&mds->nfsdev_mirrors, nds, nfsdev_list);
 		nds = TAILQ_FIRST(&fndds->nfsdev_mirrors);
 	}
 
@@ -7314,7 +7318,7 @@ nfsrv_deleteds(struct nfsdevice *fndds, struct nfsdevi
 	/* Put fndds in the mirror list with nfsdev_nmp == NULL. */
 	fndds->nfsdev_nmp = NULL;
 	TAILQ_INIT(&fndds->nfsdev_mirrors);
-	TAILQ_INSERT_HEAD(&mds->nfsdev_mirrors, fndds, nfsdev_list);
+	TAILQ_INSERT_TAIL(&mds->nfsdev_mirrors, fndds, nfsdev_list);
 }
 
 /*


More information about the svn-src-projects mailing list