diff options
| author | Poul-Henning Kamp <phk@FreeBSD.org> | 2003-05-02 06:18:58 +0000 |
|---|---|---|
| committer | Poul-Henning Kamp <phk@FreeBSD.org> | 2003-05-02 06:18:58 +0000 |
| commit | 6b60a2cd572d65c54d879a46da6a93738f414cc1 (patch) | |
| tree | 3e58594141675b0015c193c535433c0afc860c08 /sys/dev/md/md.c | |
| parent | 43fdafb1e1db4379d9e3cf435324a37c6f29e54a (diff) | |
Notes
Diffstat (limited to 'sys/dev/md/md.c')
| -rw-r--r-- | sys/dev/md/md.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index 9e2bdf9c583f..a3f4f92811c4 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -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) |
