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.
This commit is contained in:
parent
7bdc535062
commit
af0a9c5a59
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user