Author: markj
Date: Fri Aug 23 22:55:52 2013
New Revision: 254742
URL: http://svnweb.freebsd.org/changeset/base/254742

Log:
  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

Modified:
  head/sys/dev/mfi/mfi_cam.c

Modified: head/sys/dev/mfi/mfi_cam.c
==============================================================================
--- head/sys/dev/mfi/mfi_cam.c  Fri Aug 23 22:52:20 2013        (r254741)
+++ head/sys/dev/mfi/mfi_cam.c  Fri Aug 23 22:55:52 2013        (r254742)
@@ -308,17 +308,16 @@ mfip_cam_rescan(struct mfi_softc *sc, ui
                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, ui
                    "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);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to