summaryrefslogtreecommitdiffstats
path: root/sys/geom
diff options
context:
space:
mode:
authorae <ae@FreeBSD.org>2014-06-02 10:14:03 +0000
committerae <ae@FreeBSD.org>2014-06-02 10:14:03 +0000
commitaf0a9c5a593bd3a627fe082ca32622a43e0db106 (patch)
treed8dad7676d400be04d4cfeddd97a5e99173879dc /sys/geom
parent7bdc5350627b271d3d714a1d5292d8639377cd14 (diff)
downloadFreeBSD-src-af0a9c5a593bd3a627fe082ca32622a43e0db106.zip
FreeBSD-src-af0a9c5a593bd3a627fe082ca32622a43e0db106.tar.gz
MFC r266444:
We have two functions from where a geom orphan method could be called: g_orphan_register and g_resize_provider_event. Both are called from the event queue. Also we have GEOM_DEV class, which does deferred destroy for its consumers via g_dev_destroy (also called from the event queue). So it is possible, that for some consumers an orphan method will be called twice. This triggers panic in g_dev_orphan. Check that consumer isn't already orphaned before call orphan method.
Diffstat (limited to 'sys/geom')
-rw-r--r--sys/geom/geom_event.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/geom/geom_event.c b/sys/geom/geom_event.c
index 3a1363e..2ded638 100644
--- a/sys/geom/geom_event.c
+++ b/sys/geom/geom_event.c
@@ -206,6 +206,14 @@ g_orphan_register(struct g_provider *pp)
KASSERT(cp->geom->orphan != NULL,
("geom %s has no orphan, class %s",
cp->geom->name, cp->geom->class->name));
+ /*
+ * XXX: g_dev_orphan method does deferred destroying
+ * and it is possible, that other event could already
+ * call the orphan method. Check consumer's flags to
+ * do not schedule it twice.
+ */
+ if (cp->flags & G_CF_ORPHAN)
+ continue;
cp->flags |= G_CF_ORPHAN;
cp->geom->orphan(cp);
}
OpenPOWER on IntegriCloud