summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJeff Skirvin <jeffrey.d.skirvin@intel.com>2011-03-07 16:40:47 -0700
committerDan Williams <dan.j.williams@intel.com>2011-07-03 03:55:30 -0700
commitaa14510295d3d87431c915c0b2bc5dd3af7f2c35 (patch)
tree7dddb3f3ab2fa9c90d0155f18230bb9e630f6018 /drivers
parent50e7f9b5a9ae4a763b2c27500807cf237faca9b0 (diff)
downloadop-kernel-dev-aa14510295d3d87431c915c0b2bc5dd3af7f2c35.zip
op-kernel-dev-aa14510295d3d87431c915c0b2bc5dd3af7f2c35.tar.gz
isci: Always set response/status for requests going into the error path.
In the case of I/O requests being failed because of a required device reset condition, set the response and status to indicate an I/O failure. Signed-off-by: Jeff Skirvin <jeffrey.d.skirvin@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/isci/request.c28
-rw-r--r--drivers/scsi/isci/task.h13
2 files changed, 25 insertions, 16 deletions
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c
index f19a952..0156431 100644
--- a/drivers/scsi/isci/request.c
+++ b/drivers/scsi/isci/request.c
@@ -809,11 +809,11 @@ static void isci_task_save_for_upper_layer_completion(
/* Normal notification (task_done) */
dev_dbg(&host->pdev->dev,
- "%s: Normal - task = %p, response=%d, status=%d\n",
+ "%s: Normal - task = %p, response=%d (%d), status=%d (%d)\n",
__func__,
task,
- response,
- status);
+ task->task_status.resp, response,
+ task->task_status.stat, status);
/* Add to the completed list. */
list_add(&request->completed_node,
&host->requests_to_complete);
@@ -827,11 +827,11 @@ static void isci_task_save_for_upper_layer_completion(
* already in the abort path.
*/
dev_warn(&host->pdev->dev,
- "%s: Aborted - task = %p, response=%d, status=%d\n",
+ "%s: Aborted - task = %p, response=%d (%d), status=%d (%d)\n",
__func__,
task,
- response,
- status);
+ task->task_status.resp, response,
+ task->task_status.stat, status);
/* Wake up whatever process was waiting for this
* request to complete.
@@ -850,11 +850,11 @@ static void isci_task_save_for_upper_layer_completion(
case isci_perform_error_io_completion:
/* Use sas_task_abort */
dev_warn(&host->pdev->dev,
- "%s: Error - task = %p, response=%d, status=%d\n",
+ "%s: Error - task = %p, response=%d (%d), status=%d (%d)\n",
__func__,
task,
- response,
- status);
+ task->task_status.resp, response,
+ task->task_status.stat, status);
/* Add to the aborted list. */
list_add(&request->completed_node,
&host->requests_to_errorback);
@@ -862,11 +862,11 @@ static void isci_task_save_for_upper_layer_completion(
default:
dev_warn(&host->pdev->dev,
- "%s: Unknown - task = %p, response=%d, status=%d\n",
+ "%s: Unknown - task = %p, response=%d (%d), status=%d (%d)\n",
__func__,
task,
- response,
- status);
+ task->task_status.resp, response,
+ task->task_status.stat, status);
/* Add to the error to libsas list. */
list_add(&request->completed_node,
@@ -1165,6 +1165,10 @@ void isci_request_io_request_complete(
task->task_state_flags |= SAS_TASK_NEED_DEV_RESET;
spin_unlock_irqrestore(&task->task_state_lock, task_flags);
+ /* Fail the I/O. */
+ response = SAS_TASK_UNDELIVERED;
+ status = SAM_STAT_TASK_ABORTED;
+
complete_to_host = isci_perform_error_io_completion;
request->complete_in_target = false;
break;
diff --git a/drivers/scsi/isci/task.h b/drivers/scsi/isci/task.h
index e1c9c8f..b84bedd 100644
--- a/drivers/scsi/isci/task.h
+++ b/drivers/scsi/isci/task.h
@@ -302,14 +302,19 @@ isci_task_set_completion_status(
spin_lock_irqsave(&task->task_state_lock, flags);
- task->task_status.resp = response;
- task->task_status.stat = status;
-
/* If a device reset is being indicated, make sure the I/O
* is in the error path.
*/
- if (task->task_state_flags & SAS_TASK_NEED_DEV_RESET)
+ if (task->task_state_flags & SAS_TASK_NEED_DEV_RESET) {
+
+ /* Fail the I/O to make sure it goes into the error path. */
+ response = SAS_TASK_UNDELIVERED;
+ status = SAM_STAT_TASK_ABORTED;
+
task_notification_selection = isci_perform_error_io_completion;
+ }
+ task->task_status.resp = response;
+ task->task_status.stat = status;
switch (task_notification_selection) {
OpenPOWER on IntegriCloud