Author: jhb
Date: Thu May 21 12:36:40 2009
New Revision: 192534
URL: http://svn.freebsd.org/changeset/base/192534

Log:
  Largely revert the earlier change to use a single CCB for the RAID recovery
  thread.  Multiple RAID events in quick succession can cause an additional
  bus rescan to be scheduled before an earlier scan has completed.  In this
  case the driver was attempting to use the same CCB storage for two requests.
  
  PR:           kern/130330
  Reviewed by:  Riccardo Torrini  riccardo.torrini | esaote com
  MFC after:    1 week

Modified:
  head/sys/dev/mpt/mpt_raid.c

Modified: head/sys/dev/mpt/mpt_raid.c
==============================================================================
--- head/sys/dev/mpt/mpt_raid.c Thu May 21 12:05:15 2009        (r192533)
+++ head/sys/dev/mpt/mpt_raid.c Thu May 21 12:36:40 2009        (r192534)
@@ -658,19 +658,19 @@ mpt_terminate_raid_thread(struct mpt_sof
 static void
 mpt_cam_rescan_callback(struct cam_periph *periph, union ccb *ccb)
 {
+
        xpt_free_path(ccb->ccb_h.path);
+       xpt_free_ccb(ccb);
 }
 
 static void
 mpt_raid_thread(void *arg)
 {
        struct mpt_softc *mpt;
-       union ccb *ccb;
        int firstrun;
 
        mpt = (struct mpt_softc *)arg;
        firstrun = 1;
-       ccb = xpt_alloc_ccb();
        MPT_LOCK(mpt);
        while (mpt->shutdwn_raid == 0) {
 
@@ -698,15 +698,21 @@ mpt_raid_thread(void *arg)
                }
 
                if (mpt->raid_rescan != 0) {
+                       union ccb *ccb;
                        struct cam_path *path;
                        int error;
 
                        mpt->raid_rescan = 0;
+                       MPT_UNLOCK(mpt);
 
+                       ccb = xpt_alloc_ccb();
+
+                       MPT_LOCK(mpt);
                        error = xpt_create_path(&path, xpt_periph,
                            cam_sim_path(mpt->phydisk_sim),
                            CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD);
                        if (error != CAM_REQ_CMP) {
+                               xpt_free_ccb(ccb);
                                mpt_prt(mpt, "Unable to rescan RAID Bus!\n");
                        } else {
                                xpt_setup_ccb(&ccb->ccb_h, path, 5);
@@ -719,7 +725,6 @@ mpt_raid_thread(void *arg)
                        }
                }
        }
-       xpt_free_ccb(ccb);
        mpt->raid_thread = NULL;
        wakeup(&mpt->raid_thread);
        MPT_UNLOCK(mpt);
_______________________________________________
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