summaryrefslogtreecommitdiffstats
path: root/sys/dev/md
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2003-05-02 06:18:58 +0000
committerphk <phk@FreeBSD.org>2003-05-02 06:18:58 +0000
commit887418fd11e01f6caf9e0de8255aa16e326897e3 (patch)
tree3e58594141675b0015c193c535433c0afc860c08 /sys/dev/md
parent910b47d3e759ffb4a23fdedef7d47012b80579e1 (diff)
downloadFreeBSD-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.c16
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)
OpenPOWER on IntegriCloud