Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Jul 2019 22:06:36 +0000 (UTC)
From:      Ryan Libby <rlibby@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r349587 - head/sys/geom/mirror
Message-ID:  <201907012206.x61M6aLG038925@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rlibby
Date: Mon Jul  1 22:06:36 2019
New Revision: 349587
URL: https://svnweb.freebsd.org/changeset/base/349587

Log:
  g_mirror_taste: avoid deadlock, always clear tasting flag
  
  If g_mirror_taste encountered an error at g_mirror_add_disk, it might
  try to g_mirror_destroy the device with the G_MIRROR_DEVICE_FLAG_TASTING
  flag still set.  This would wait on a worker to complete the destruction
  with g_mirror_try_destroy, but that function bails out if the tasting
  flag is set, resulting in a deadlock.  Clear the tasting flag before
  trying to destroy the device.
  
  Test Plan:
  sysctl debug.fail_point.mnowait="1%return"
  kyua test -k /usr/tests/sys/geom/class/mirror/Kyuafile
  
  Reviewed by:	markj
  Sponsored by:	Dell EMC Isilon
  Differential Revision:	https://reviews.freebsd.org/D20744

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

Modified: head/sys/geom/mirror/g_mirror.c
==============================================================================
--- head/sys/geom/mirror/g_mirror.c	Mon Jul  1 22:06:16 2019	(r349586)
+++ head/sys/geom/mirror/g_mirror.c	Mon Jul  1 22:06:36 2019	(r349587)
@@ -3291,6 +3291,7 @@ g_mirror_taste(struct g_class *mp, struct g_provider *
 	sx_xlock(&sc->sc_lock);
 	sc->sc_flags |= G_MIRROR_DEVICE_FLAG_TASTING;
 	error = g_mirror_add_disk(sc, pp, &md);
+	sc->sc_flags &= ~G_MIRROR_DEVICE_FLAG_TASTING;
 	if (error != 0) {
 		G_MIRROR_DEBUG(0, "Cannot add disk %s to %s (error=%d).",
 		    pp->name, gp->name, error);
@@ -3302,7 +3303,6 @@ g_mirror_taste(struct g_class *mp, struct g_provider *
 		}
 		gp = NULL;
 	}
-	sc->sc_flags &= ~G_MIRROR_DEVICE_FLAG_TASTING;
 	if ((sc->sc_flags & G_MIRROR_DEVICE_FLAG_DESTROY) != 0) {
 		g_mirror_destroy(sc, G_MIRROR_DESTROY_HARD);
 		g_topology_lock();



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