summaryrefslogtreecommitdiffstats
path: root/sys/dev/nve
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2005-09-19 03:10:21 +0000
committerimp <imp@FreeBSD.org>2005-09-19 03:10:21 +0000
commit4e70215e6bf590140205774753c8b0a1f1fe9a36 (patch)
treec3358cebc77043ea8b2a3a5036b02dad6a674b7e /sys/dev/nve
parent37a0bbb7e543c6b2a2f055d676d5a94f781d7738 (diff)
downloadFreeBSD-src-4e70215e6bf590140205774753c8b0a1f1fe9a36.zip
FreeBSD-src-4e70215e6bf590140205774753c8b0a1f1fe9a36.tar.gz
Make sure that we call if_free(ifp) after bus_teardown_intr. Since we
could get an interrupt after we free the ifp, and the interrupt handler depended on the ifp being still alive, this could, in theory, cause a crash. Eliminate this possibility by moving the if_free to after the bus_teardown_intr() call.
Diffstat (limited to 'sys/dev/nve')
-rw-r--r--sys/dev/nve/if_nve.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/dev/nve/if_nve.c b/sys/dev/nve/if_nve.c
index 0d8267a..6ffecbd 100644
--- a/sys/dev/nve/if_nve.c
+++ b/sys/dev/nve/if_nve.c
@@ -559,12 +559,10 @@ nve_detach(device_t dev)
if (device_is_attached(dev)) {
nve_stop(sc);
+ /* XXX shouldn't hold lock over call to ether_ifdetch */
ether_ifdetach(ifp);
}
- if (ifp)
- if_free(ifp);
-
if (sc->miibus)
device_delete_child(dev, sc->miibus);
bus_generic_detach(dev);
@@ -601,6 +599,8 @@ nve_detach(device_t dev)
bus_dma_tag_destroy(sc->rtag);
NVE_UNLOCK(sc);
+ if (ifp)
+ if_free(ifp);
mtx_destroy(&sc->mtx);
mtx_destroy(&sc->osmtx);
OpenPOWER on IntegriCloud