Do not retry long ready waits if previous gave nothing.
I have some disks reporting "Logical unit is in process of becoming ready" for about half an hour before finally reporting failure. During that time CAM waits for the readiness during ~2 minutes for each request, that makes system boot take very long time. This change reduces wait times for the following requests to ~1 second if previously long wait for that device has timed out. MFC after: 2 weeks Sponsored by: iXsystems, Inc.
This commit is contained in:
parent
2f58b9904d
commit
880ccf502c
@ -1428,6 +1428,14 @@ camperiphdone(struct cam_periph *periph, union ccb *done_ccb)
|
||||
xpt_async(AC_INQ_CHANGED, done_ccb->ccb_h.path, NULL);
|
||||
}
|
||||
|
||||
/* If we tried long wait and still failed, remember that. */
|
||||
if ((periph->flags & CAM_PERIPH_RECOVERY_WAIT) &&
|
||||
(done_ccb->csio.cdb_io.cdb_bytes[0] == TEST_UNIT_READY)) {
|
||||
periph->flags &= ~CAM_PERIPH_RECOVERY_WAIT;
|
||||
if (error != 0 && done_ccb->ccb_h.retry_count == 0)
|
||||
periph->flags |= CAM_PERIPH_RECOVERY_WAIT_FAILED;
|
||||
}
|
||||
|
||||
/*
|
||||
* After recovery action(s) completed, return to the original CCB.
|
||||
* If the recovery CCB has failed, considering its own possible
|
||||
@ -1783,7 +1791,9 @@ camperiphscsisenseerror(union ccb *ccb, union ccb **orig,
|
||||
*/
|
||||
int retries;
|
||||
|
||||
if ((err_action & SSQ_MANY) != 0) {
|
||||
if ((err_action & SSQ_MANY) != 0 && (periph->flags &
|
||||
CAM_PERIPH_RECOVERY_WAIT_FAILED) == 0) {
|
||||
periph->flags |= CAM_PERIPH_RECOVERY_WAIT;
|
||||
*action_string = "Polling device for readiness";
|
||||
retries = 120;
|
||||
} else {
|
||||
|
@ -134,6 +134,8 @@ struct cam_periph {
|
||||
#define CAM_PERIPH_RUN_TASK 0x40
|
||||
#define CAM_PERIPH_FREE 0x80
|
||||
#define CAM_PERIPH_ANNOUNCED 0x100
|
||||
#define CAM_PERIPH_RECOVERY_WAIT 0x200
|
||||
#define CAM_PERIPH_RECOVERY_WAIT_FAILED 0x400
|
||||
uint32_t scheduled_priority;
|
||||
uint32_t immediate_priority;
|
||||
int periph_allocating;
|
||||
|
Loading…
x
Reference in New Issue
Block a user