diff options
author | sbruno <sbruno@FreeBSD.org> | 2014-04-15 17:49:47 +0000 |
---|---|---|
committer | sbruno <sbruno@FreeBSD.org> | 2014-04-15 17:49:47 +0000 |
commit | 9b6cbf64ed666f5a16495268e32941a66215e3d0 (patch) | |
tree | 7dcc9404e74617c6d793ea505355ad3111f17959 /sys/dev | |
parent | 62264d0d4722d204b53dfb4035e83dc87f756bb3 (diff) | |
download | FreeBSD-src-9b6cbf64ed666f5a16495268e32941a66215e3d0.zip FreeBSD-src-9b6cbf64ed666f5a16495268e32941a66215e3d0.tar.gz |
MFC r264354
Fix insta-panic on assert of unlocked periph mtx in ciss(4) when
logical volume state changes.
Sponsored by: Yahoo! Inc.
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/ciss/ciss.c | 35 |
1 files changed, 11 insertions, 24 deletions
diff --git a/sys/dev/ciss/ciss.c b/sys/dev/ciss/ciss.c index 6d89a77..02bbd2d 100644 --- a/sys/dev/ciss/ciss.c +++ b/sys/dev/ciss/ciss.c @@ -180,8 +180,6 @@ static int ciss_cam_emulate(struct ciss_softc *sc, struct ccb_scsiio *csio); static void ciss_cam_poll(struct cam_sim *sim); static void ciss_cam_complete(struct ciss_request *cr); static void ciss_cam_complete_fixup(struct ciss_softc *sc, struct ccb_scsiio *csio); -static struct cam_periph *ciss_find_periph(struct ciss_softc *sc, - int bus, int target); static int ciss_name_device(struct ciss_softc *sc, int bus, int target); /* periodic status monitoring */ @@ -3398,27 +3396,6 @@ ciss_cam_complete_fixup(struct ciss_softc *sc, struct ccb_scsiio *csio) /******************************************************************************** - * Find a peripheral attached at (target) - */ -static struct cam_periph * -ciss_find_periph(struct ciss_softc *sc, int bus, int target) -{ - struct cam_periph *periph; - struct cam_path *path; - int status; - - status = xpt_create_path(&path, NULL, cam_sim_path(sc->ciss_cam_sim[bus]), - target, 0); - if (status == CAM_REQ_CMP) { - periph = cam_periph_find(path, NULL); - xpt_free_path(path); - } else { - periph = NULL; - } - return(periph); -} - -/******************************************************************************** * Name the device at (target) * * XXX is this strictly correct? @@ -3427,12 +3404,22 @@ static int ciss_name_device(struct ciss_softc *sc, int bus, int target) { struct cam_periph *periph; + struct cam_path *path; + int status; if (CISS_IS_PHYSICAL(bus)) return (0); - if ((periph = ciss_find_periph(sc, bus, target)) != NULL) { + + status = xpt_create_path(&path, NULL, cam_sim_path(sc->ciss_cam_sim[bus]), + target, 0); + + if (status == CAM_REQ_CMP) { + xpt_path_lock(path); + periph = cam_periph_find(path, NULL); sprintf(sc->ciss_logical[bus][target].cl_name, "%s%d", periph->periph_name, periph->unit_number); + xpt_path_unlock(path); + xpt_free_path(path); return(0); } sc->ciss_logical[bus][target].cl_name[0] = 0; |