|
@@ -1218,6 +1218,40 @@ static void scsi_eh_offline_sdevs(struct list_head *work_q,
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * scsi_noretry_cmd - determinte if command should be failed fast
|
|
|
|
+ * @scmd: SCSI cmd to examine.
|
|
|
|
+ */
|
|
|
|
+int scsi_noretry_cmd(struct scsi_cmnd *scmd)
|
|
|
|
+{
|
|
|
|
+ switch (host_byte(scmd->result)) {
|
|
|
|
+ case DID_OK:
|
|
|
|
+ break;
|
|
|
|
+ case DID_BUS_BUSY:
|
|
|
|
+ return blk_failfast_transport(scmd->request);
|
|
|
|
+ case DID_PARITY:
|
|
|
|
+ return blk_failfast_dev(scmd->request);
|
|
|
|
+ case DID_ERROR:
|
|
|
|
+ if (msg_byte(scmd->result) == COMMAND_COMPLETE &&
|
|
|
|
+ status_byte(scmd->result) == RESERVATION_CONFLICT)
|
|
|
|
+ return 0;
|
|
|
|
+ /* fall through */
|
|
|
|
+ case DID_SOFT_ERROR:
|
|
|
|
+ return blk_failfast_driver(scmd->request);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ switch (status_byte(scmd->result)) {
|
|
|
|
+ case CHECK_CONDITION:
|
|
|
|
+ /*
|
|
|
|
+ * assume caller has checked sense and determinted
|
|
|
|
+ * the check condition was retryable.
|
|
|
|
+ */
|
|
|
|
+ return blk_failfast_dev(scmd->request);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* scsi_decide_disposition - Disposition a cmd on return from LLD.
|
|
* scsi_decide_disposition - Disposition a cmd on return from LLD.
|
|
* @scmd: SCSI cmd to examine.
|
|
* @scmd: SCSI cmd to examine.
|
|
@@ -1396,7 +1430,7 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
|
|
* even if the request is marked fast fail, we still requeue
|
|
* even if the request is marked fast fail, we still requeue
|
|
* for queue congestion conditions (QUEUE_FULL or BUSY) */
|
|
* for queue congestion conditions (QUEUE_FULL or BUSY) */
|
|
if ((++scmd->retries) <= scmd->allowed
|
|
if ((++scmd->retries) <= scmd->allowed
|
|
- && !blk_noretry_request(scmd->request)) {
|
|
|
|
|
|
+ && !scsi_noretry_cmd(scmd)) {
|
|
return NEEDS_RETRY;
|
|
return NEEDS_RETRY;
|
|
} else {
|
|
} else {
|
|
/*
|
|
/*
|
|
@@ -1521,7 +1555,7 @@ void scsi_eh_flush_done_q(struct list_head *done_q)
|
|
list_for_each_entry_safe(scmd, next, done_q, eh_entry) {
|
|
list_for_each_entry_safe(scmd, next, done_q, eh_entry) {
|
|
list_del_init(&scmd->eh_entry);
|
|
list_del_init(&scmd->eh_entry);
|
|
if (scsi_device_online(scmd->device) &&
|
|
if (scsi_device_online(scmd->device) &&
|
|
- !blk_noretry_request(scmd->request) &&
|
|
|
|
|
|
+ !scsi_noretry_cmd(scmd) &&
|
|
(++scmd->retries <= scmd->allowed)) {
|
|
(++scmd->retries <= scmd->allowed)) {
|
|
SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush"
|
|
SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush"
|
|
" retry cmd: %p\n",
|
|
" retry cmd: %p\n",
|