diff options
author | phk <phk@FreeBSD.org> | 2003-05-02 06:18:58 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2003-05-02 06:18:58 +0000 |
commit | 887418fd11e01f6caf9e0de8255aa16e326897e3 (patch) | |
tree | 3e58594141675b0015c193c535433c0afc860c08 /sys/dev/md | |
parent | 910b47d3e759ffb4a23fdedef7d47012b80579e1 (diff) | |
download | FreeBSD-src-887418fd11e01f6caf9e0de8255aa16e326897e3.zip FreeBSD-src-887418fd11e01f6caf9e0de8255aa16e326897e3.tar.gz |
Call g_wither_geom(), instead of just setting the flag.
Diffstat (limited to 'sys/dev/md')
-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 9e2bdf9..a3f4f92 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) |