summaryrefslogtreecommitdiff
path: root/sys/dev/md/md.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/md/md.c')
-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 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)