commit 1ff2951300260c66cadf1b8d58222f1c60c522a2 Author: cem Date: Sun Sep 24 19:59:26 2017 +0000 g_resize_provider_event: Do not invoke orphan method twice Like r266444, g_resize_provider_event can attempt to orphan an already orphaned geom_dev consumer. This will cause a panic in g_dev_orphan. Apply the same fix as was applied to g_orphan_register. Reviewed by: ae Sponsored by: Dell EMC Isilon Differential Revision: https://reviews.freebsd.org/D12469 Notes: svn path=/head/; revision=323977 diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c index e1fd0296c31f..10d82d0b8c6b 100644 --- a/sys/geom/geom_subr.c +++ b/sys/geom/geom_subr.c @@ -631,6 +631,14 @@ g_resize_provider_event(void *arg, int flag) LIST_FOREACH_SAFE(cp, &pp->consumers, consumers, cp2) { gp = cp->geom; if (gp->resize == NULL && size < pp->mediasize) { + /* + * 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); }