diff options
author | phk <phk@FreeBSD.org> | 2003-04-23 20:16:13 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2003-04-23 20:16:13 +0000 |
commit | 7c462ceb2b050c850263218e20100ad6fb4ffa41 (patch) | |
tree | ed75036c2eafccd85b7a612e6442c7e8811814e4 /sys/geom/geom_subr.c | |
parent | 67a31a61073262541d6ef8254295a8532553cca6 (diff) | |
download | FreeBSD-src-7c462ceb2b050c850263218e20100ad6fb4ffa41.zip FreeBSD-src-7c462ceb2b050c850263218e20100ad6fb4ffa41.tar.gz |
Turn EV_NEW_PROVIDER into a g_call_me() event.
Diffstat (limited to 'sys/geom/geom_subr.c')
-rw-r--r-- | sys/geom/geom_subr.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c index 66eff7c..28a671d 100644 --- a/sys/geom/geom_subr.c +++ b/sys/geom/geom_subr.c @@ -189,6 +189,35 @@ g_destroy_consumer(struct g_consumer *cp) g_free(cp); } +static void +g_new_provider_event(void *arg, int flag) +{ + struct g_class *mp; + struct g_provider *pp; + struct g_consumer *cp; + int i; + + g_topology_assert(); + if (flag == EV_CANCEL) + return; + if (g_shutdown) + return; + pp = arg; + LIST_FOREACH(mp, &g_classes, class) { + if (mp->taste == NULL) + continue; + i = 1; + LIST_FOREACH(cp, &pp->consumers, consumers) + if (cp->geom->class == mp) + i = 0; + if (!i) + continue; + mp->taste(mp, pp, 0); + g_topology_assert(); + } +} + + struct g_provider * g_new_providerf(struct g_geom *gp, const char *fmt, ...) { @@ -213,7 +242,7 @@ g_new_providerf(struct g_geom *gp, const char *fmt, ...) DEVSTAT_TYPE_DIRECT, DEVSTAT_PRIORITY_MAX); LIST_INSERT_HEAD(&gp->provider, pp, provider); g_nproviders++; - g_post_event(EV_NEW_PROVIDER, pp, NULL); + g_call_me(g_new_provider_event, pp, pp, NULL); return (pp); } @@ -462,7 +491,7 @@ g_access_rel(struct g_consumer *cp, int dcr, int dcw, int dce) g_spoil(pp, cp); else if (pp->acw != 0 && pp->acw == -dcw && !(pp->geom->flags & G_GEOM_WITHER)) - g_post_event(EV_NEW_PROVIDER, pp, NULL); + g_call_me(g_new_provider_event, pp, pp, NULL); pp->acr += dcr; pp->acw += dcw; |