Author: markj
Date: Wed Jun 22 21:00:28 2016
New Revision: 302091
URL: https://svnweb.freebsd.org/changeset/base/302091

Log:
  Do not complete pending gmirror BIOs when tearing down the provider.
  
  This will result in lock recursion and is more generally incorrect since
  the completion handlers will just reinsert the BIOs into the queue we're
  trying to drain.
  
  Reviewed by:  imp, ngie
  Approved by:  re (gjb)
  MFC after:    3 weeks
  Sponsored by: EMC / Isilon Storage Division
  Differential Revision:        https://reviews.freebsd.org/D6908

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

Modified: head/sys/geom/mirror/g_mirror.c
==============================================================================
--- head/sys/geom/mirror/g_mirror.c     Wed Jun 22 20:31:49 2016        
(r302090)
+++ head/sys/geom/mirror/g_mirror.c     Wed Jun 22 21:00:28 2016        
(r302091)
@@ -2121,8 +2121,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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to