diff options
author | Jeff Skirvin <jeffrey.d.skirvin@intel.com> | 2011-10-27 15:04:56 -0700 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2011-10-31 13:15:17 +0400 |
commit | c2cb8a5fd7d5d8729a4fc25937c4d6564f9a7aa3 (patch) | |
tree | b562e8cea25801037a4b22a79630bfbc5bd667a3 /drivers/scsi/isci/task.c | |
parent | 0e2e27990e2dcd415f7974e8460a2f05accdddfb (diff) | |
download | blackbird-op-linux-c2cb8a5fd7d5d8729a4fc25937c4d6564f9a7aa3.tar.gz blackbird-op-linux-c2cb8a5fd7d5d8729a4fc25937c4d6564f9a7aa3.zip |
[SCSI] isci: Immediately fail I/O to removed devices.
In the case where an I/O fails to start in isci_request_execute,
only allow retries if the device is not already gone.
Signed-off-by: Jeff Skirvin <jeffrey.d.skirvin@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/isci/task.c')
-rw-r--r-- | drivers/scsi/isci/task.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c index e2d9418683ce..e8cf17b024a4 100644 --- a/drivers/scsi/isci/task.c +++ b/drivers/scsi/isci/task.c @@ -212,16 +212,27 @@ int isci_task_execute_task(struct sas_task *task, int num, gfp_t gfp_flags) task->task_state_flags &= ~SAS_TASK_AT_INITIATOR; spin_unlock_irqrestore(&task->task_state_lock, flags); - /* Indicate QUEUE_FULL so that the scsi - * midlayer retries. if the request - * failed for remote device reasons, - * it gets returned as - * SAS_TASK_UNDELIVERED next time - * through. - */ - isci_task_refuse(ihost, task, - SAS_TASK_COMPLETE, - SAS_QUEUE_FULL); + if (test_bit(IDEV_GONE, &idev->flags)) { + + /* Indicate that the device + * is gone. + */ + isci_task_refuse(ihost, task, + SAS_TASK_UNDELIVERED, + SAS_DEVICE_UNKNOWN); + } else { + /* Indicate QUEUE_FULL so that + * the scsi midlayer retries. + * If the request failed for + * remote device reasons, it + * gets returned as + * SAS_TASK_UNDELIVERED next + * time through. + */ + isci_task_refuse(ihost, task, + SAS_TASK_COMPLETE, + SAS_QUEUE_FULL); + } } } } |