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
This commit is contained in:
John Baldwin 2009-05-21 12:36:40 +00:00
parent 5a065915b0
commit 46990862ab

View File

@ -658,19 +658,19 @@ mpt_terminate_raid_thread(struct mpt_softc *mpt)
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);