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:
parent
5a065915b0
commit
46990862ab
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user