summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorsbruno <sbruno@FreeBSD.org>2014-04-15 17:49:47 +0000
committersbruno <sbruno@FreeBSD.org>2014-04-15 17:49:47 +0000
commit9b6cbf64ed666f5a16495268e32941a66215e3d0 (patch)
tree7dcc9404e74617c6d793ea505355ad3111f17959 /sys/dev
parent62264d0d4722d204b53dfb4035e83dc87f756bb3 (diff)
downloadFreeBSD-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.c35
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;
OpenPOWER on IntegriCloud