svn commit: r349587 - head/sys/geom/mirror
Ryan Libby
rlibby at FreeBSD.org
Tue Jul 2 02:15:22 UTC 2019
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();
More information about the svn-src-head
mailing list