diff options
author | pjd <pjd@FreeBSD.org> | 2006-07-03 10:32:38 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2006-07-03 10:32:38 +0000 |
commit | 444d196b29d0924581598414ae1f1d1811506324 (patch) | |
tree | 4f634d3e2a484a657730db409940effeec7970f4 /sys/geom/mirror | |
parent | fa2514423bf205fcd4d5d552ebe38852f9457594 (diff) | |
download | FreeBSD-src-444d196b29d0924581598414ae1f1d1811506324.zip FreeBSD-src-444d196b29d0924581598414ae1f1d1811506324.tar.gz |
Allow to close access even if device is already destroyed.
Reported by: Ulrich Spoerlein <uspoerlein@gmail.com>
PR: kern/98093
MFC after: 1 week
Diffstat (limited to 'sys/geom/mirror')
-rw-r--r-- | sys/geom/mirror/g_mirror.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/geom/mirror/g_mirror.c b/sys/geom/mirror/g_mirror.c index 27c6b88..aa80d2c 100644 --- a/sys/geom/mirror/g_mirror.c +++ b/sys/geom/mirror/g_mirror.c @@ -2736,13 +2736,15 @@ g_mirror_access(struct g_provider *pp, int acr, int acw, int ace) G_MIRROR_DEBUG(2, "Access request for %s: r%dw%de%d.", pp->name, acr, acw, ace); + sc = pp->geom->softc; + if (sc == NULL && acr <= 0 && acw <= 0 && ace <= 0) + return (0); + KASSERT(sc != NULL, ("NULL softc (provider=%s).", pp->name)); + dcr = pp->acr + acr; dcw = pp->acw + acw; dce = pp->ace + ace; - sc = pp->geom->softc; - KASSERT(sc != NULL, ("NULL softc (provider=%s).", pp->name)); - g_topology_unlock(); sx_xlock(&sc->sc_lock); if ((sc->sc_flags & G_MIRROR_DEVICE_FLAG_DESTROY) != 0 || |