Hold mfi_io_lock across calls to xpt_rescan() and xpt_alloc_ccb_nowait().

xpt_rescan() expects the SIM lock to be held, and we trip a mtx_assert if
the driver initiates multiple rescans in quick succession.

Reported by:	sbruno
Tested by:	sbruno
MFC after:	1 week
This commit is contained in:
Mark Johnston 2013-08-23 22:55:52 +00:00
parent 2454886e05
commit 30e71983d0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=254742

View File

@ -308,17 +308,16 @@ mfip_cam_rescan(struct mfi_softc *sc, uint32_t tid)
return;
}
camsc->state = MFIP_STATE_RESCAN;
mtx_unlock(&sc->mfi_io_lock);
ccb = xpt_alloc_ccb_nowait();
if (ccb == NULL) {
mtx_unlock(&sc->mfi_io_lock);
device_printf(sc->mfi_dev,
"Cannot allocate ccb for bus rescan.\n");
return;
}
sim = camsc->sim;
mtx_lock(&sc->mfi_io_lock);
if (xpt_create_path(&ccb->ccb_h.path, NULL, cam_sim_path(sim),
tid, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
xpt_free_ccb(ccb);
@ -327,11 +326,8 @@ mfip_cam_rescan(struct mfi_softc *sc, uint32_t tid)
"Cannot create path for bus rescan.\n");
return;
}
mtx_unlock(&sc->mfi_io_lock);
xpt_rescan(ccb);
mtx_lock(&sc->mfi_io_lock);
camsc->state = MFIP_STATE_NONE;
mtx_unlock(&sc->mfi_io_lock);
}