From 0fb3bd60b327b9fcc42f733529ae14d675207734 Mon Sep 17 00:00:00 2001 From: scottl Date: Mon, 16 Apr 2007 19:42:23 +0000 Subject: Drop the topology lock before calling the periph oninvalidate and dtor vectors. --- sys/cam/cam_periph.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c index c0feec6..e2e5303 100644 --- a/sys/cam/cam_periph.c +++ b/sys/cam/cam_periph.c @@ -501,7 +501,6 @@ cam_periph_invalidate(struct cam_periph *periph) static void camperiphfree(struct cam_periph *periph) { - int s; struct periph_driver **p_drv; for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) { @@ -512,15 +511,13 @@ camperiphfree(struct cam_periph *periph) printf("camperiphfree: attempt to free non-existant periph\n"); return; } - - if (periph->periph_dtor != NULL) - periph->periph_dtor(periph); - - s = splsoftcam(); + TAILQ_REMOVE(&(*p_drv)->units, periph, unit_links); (*p_drv)->generation++; - splx(s); + xpt_unlock_buses(); + if (periph->periph_dtor != NULL) + periph->periph_dtor(periph); xpt_remove_periph(periph); if (periph->flags & CAM_PERIPH_NEW_DEV_FOUND) { @@ -549,6 +546,7 @@ camperiphfree(struct cam_periph *periph) } xpt_free_path(periph->path); free(periph, M_CAMPERIPH); + xpt_lock_buses(); } /* -- cgit v1.1