Author: markj
Date: Fri Sep 20 21:51:38 2013
New Revision: 255740
URL: http://svnweb.freebsd.org/changeset/base/255740

Log:
  MFC r254742:
  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.

Modified:
  stable/9/sys/dev/mfi/mfi_cam.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/dev/   (props changed)

Modified: stable/9/sys/dev/mfi/mfi_cam.c
==============================================================================
--- stable/9/sys/dev/mfi/mfi_cam.c      Fri Sep 20 21:26:51 2013        
(r255739)
+++ stable/9/sys/dev/mfi/mfi_cam.c      Fri Sep 20 21:51:38 2013        
(r255740)
@@ -307,17 +307,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);
@@ -326,11 +325,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