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
This commit is contained in:
cem 2017-09-24 19:59:26 +00:00
parent 7b6c655221
commit 1ff2951300

View File

@ -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);
}