Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Feb 2018 16:02:33 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r328938 - head/sys/geom/mirror
Message-ID:  <201802061602.w16G2XlZ051480@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Tue Feb  6 16:02:33 2018
New Revision: 328938
URL: https://svnweb.freebsd.org/changeset/base/328938

Log:
  Simplify synchronization read error handling.
  
  Since synchronization reads are performed by submitting a request to
  the external mirror provider, we know that the request returns with an
  error only when gmirror was unable to read a copy of the block from any
  mirror. Thus, there is no need to retry the request from the
  synchronization error handler.
  
  Tested by:	pho
  MFC after:	2 weeks
  Sponsored by:	Dell EMC Isilon

Modified:
  head/sys/geom/mirror/g_mirror.c

Modified: head/sys/geom/mirror/g_mirror.c
==============================================================================
--- head/sys/geom/mirror/g_mirror.c	Tue Feb  6 16:02:25 2018	(r328937)
+++ head/sys/geom/mirror/g_mirror.c	Tue Feb  6 16:02:33 2018	(r328938)
@@ -1336,9 +1336,7 @@ g_mirror_sync_request(struct g_mirror_softc *sc, struc
 	 */
 	switch (bp->bio_cmd) {
 	case BIO_READ: {
-		struct g_mirror_disk *d;
 		struct g_consumer *cp;
-		int readable;
 
 		KFAIL_POINT_ERROR(DEBUG_FP, g_mirror_sync_request_read,
 		    bp->bio_error);
@@ -1349,31 +1347,17 @@ g_mirror_sync_request(struct g_mirror_softc *sc, struc
 			    bp->bio_error);
 
 			/*
-			 * If there's at least one other disk from which we can
-			 * read the block, retry the request.
-			 */
-			readable = 0;
-			LIST_FOREACH(d, &sc->sc_disks, d_next)
-				if (d->d_state == G_MIRROR_DISK_STATE_ACTIVE &&
-				    !(d->d_flags & G_MIRROR_DISK_FLAG_BROKEN))
-					readable++;
-
-			/*
 			 * The read error will trigger a syncid bump, so there's
 			 * no need to do that here.
 			 *
-			 * If we can retry the read from another disk, do so.
-			 * Otherwise, all we can do is kick out the new disk.
+			 * The read error handling for regular requests will
+			 * retry the read from all active mirrors before passing
+			 * the error back up, so there's no need to retry here.
 			 */
-			if (readable == 0) {
-				g_mirror_sync_request_free(disk, bp);
-				g_mirror_event_send(disk,
-				    G_MIRROR_DISK_STATE_DISCONNECTED,
-				    G_MIRROR_EVENT_DONTWAIT);
-			} else {
-				g_mirror_sync_reinit(disk, bp, bp->bio_offset);
-				goto retry_read;
-			}
+			g_mirror_sync_request_free(disk, bp);
+			g_mirror_event_send(disk,
+			    G_MIRROR_DISK_STATE_DISCONNECTED,
+			    G_MIRROR_EVENT_DONTWAIT);
 			return;
 		}
 		G_MIRROR_LOGREQ(3, bp,
@@ -1429,7 +1413,6 @@ g_mirror_sync_request(struct g_mirror_softc *sc, struc
 		g_mirror_sync_reinit(disk, bp, sync->ds_offset);
 		sync->ds_offset += bp->bio_length;
 
-retry_read:
 		G_MIRROR_LOGREQ(3, bp, "Sending synchronization request.");
 		sync->ds_consumer->index++;
 



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