Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Jul 2016 00:52:12 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r303057 - stable/10/sys/geom/mirror
Message-ID:  <201607200052.u6K0qCNC051053@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Wed Jul 20 00:52:11 2016
New Revision: 303057
URL: https://svnweb.freebsd.org/changeset/base/303057

Log:
  MFC r302091:
  Do not complete pending gmirror BIOs when tearing down the provider.

Modified:
  stable/10/sys/geom/mirror/g_mirror.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/geom/mirror/g_mirror.c
==============================================================================
--- stable/10/sys/geom/mirror/g_mirror.c	Wed Jul 20 00:51:09 2016	(r303056)
+++ stable/10/sys/geom/mirror/g_mirror.c	Wed Jul 20 00:52:11 2016	(r303057)
@@ -2127,8 +2127,21 @@ g_mirror_destroy_provider(struct g_mirro
 	g_topology_lock();
 	g_error_provider(sc->sc_provider, ENXIO);
 	mtx_lock(&sc->sc_queue_mtx);
-	while ((bp = bioq_takefirst(&sc->sc_queue)) != NULL)
-		g_io_deliver(bp, ENXIO);
+	while ((bp = bioq_takefirst(&sc->sc_queue)) != NULL) {
+		/*
+		 * Abort any pending I/O that wasn't generated by us.
+		 * Synchronization requests and requests destined for individual
+		 * mirror components can be destroyed immediately.
+		 */
+		if (bp->bio_to == sc->sc_provider &&
+		    bp->bio_from->geom != sc->sc_sync.ds_geom) {
+			g_io_deliver(bp, ENXIO);
+		} else {
+			if ((bp->bio_cflags & G_MIRROR_BIO_FLAG_SYNC) != 0)
+				free(bp->bio_data, M_MIRROR);
+			g_destroy_bio(bp);
+		}
+	}
 	mtx_unlock(&sc->sc_queue_mtx);
 	G_MIRROR_DEBUG(0, "Device %s: provider %s destroyed.", sc->sc_name,
 	    sc->sc_provider->name);



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