aboutsummaryrefslogtreecommitdiff
path: root/sys/geom/geom_event.c
diff options
context:
space:
mode:
authorPoul-Henning Kamp <phk@FreeBSD.org>2003-12-23 11:37:05 +0000
committerPoul-Henning Kamp <phk@FreeBSD.org>2003-12-23 11:37:05 +0000
commit8592d7a76038535399db27d4360ab0a223f497ea (patch)
tree0393a5abf49b502a83fb38a892cef04d29ed817a /sys/geom/geom_event.c
parenta46f7e7c92562db4b3f6b02bc31942dd9999c724 (diff)
downloadsrc-8592d7a76038535399db27d4360ab0a223f497ea.tar.gz
src-8592d7a76038535399db27d4360ab0a223f497ea.zip
Prevent withering of the provider we're orphaning from happening until
we do it ourselves. Nailed by: Simon Heath <heath@cng.fr>
Notes
Notes: svn path=/head/; revision=123761
Diffstat (limited to 'sys/geom/geom_event.c')
-rw-r--r--sys/geom/geom_event.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/geom/geom_event.c b/sys/geom/geom_event.c
index 3c0f19f70fbb..2afaad6277f7 100644
--- a/sys/geom/geom_event.c
+++ b/sys/geom/geom_event.c
@@ -126,10 +126,14 @@ static void
g_orphan_register(struct g_provider *pp)
{
struct g_consumer *cp, *cp2;
+ int wf;
g_trace(G_T_TOPOLOGY, "g_orphan_register(%s)", pp->name);
g_topology_assert();
+ wf = pp->flags & G_PF_WITHER;
+ pp->flags &= ~G_PF_WITHER;
+
/*
* Tell all consumers the bad news.
* Don't be surprised if they self-destruct.
@@ -143,8 +147,10 @@ g_orphan_register(struct g_provider *pp)
cp->geom->orphan(cp);
cp = cp2;
}
- if (LIST_EMPTY(&pp->consumers) && (pp->flags & G_PF_WITHER))
+ if (LIST_EMPTY(&pp->consumers) && wf)
g_destroy_provider(pp);
+ else
+ pp->flags |= wf;
#ifdef notyet
cp = LIST_FIRST(&pp->consumers);
if (cp != NULL)