Call g_wither_geom(), instead of just setting the flag.

This commit is contained in:
Poul-Henning Kamp 2003-05-02 06:18:58 +00:00
parent 43fdafb1e1
commit 6b60a2cd57

View File

@ -350,6 +350,8 @@ g_md_access(struct g_provider *pp, int r, int w, int e)
struct md_s *sc;
sc = pp->geom->softc;
if (sc == NULL)
return (ENXIO);
r += pp->acr;
w += pp->acw;
e += pp->ace;
@ -899,6 +901,14 @@ mdcreate_vnode(struct md_ioctl *mdio, struct thread *td)
return (0);
}
static void
md_zapit(void *p, int cancel)
{
if (cancel)
return;
g_wither_geom(p, ENXIO);
}
static int
mddestroy(struct md_s *sc, struct thread *td)
{
@ -907,11 +917,11 @@ mddestroy(struct md_s *sc, struct thread *td)
mtx_destroy(&sc->queue_mtx);
if (sc->gp) {
sc->gp->flags |= G_GEOM_WITHER;
sc->gp->softc = NULL;
g_waitfor_event(md_zapit, sc->gp, M_WAITOK, sc->gp, NULL);
sc->gp = NULL;
sc->pp = NULL;
}
if (sc->pp)
g_orphan_provider(sc->pp, ENXIO);
sc->flags |= MD_SHUTDOWN;
wakeup(sc);
while (sc->procp != NULL)