isci: Always set response/status for requests going into the error path.
authorJeff Skirvin <jeffrey.d.skirvin@intel.com>
Mon, 7 Mar 2011 23:40:47 +0000 (16:40 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sun, 3 Jul 2011 10:55:30 +0000 (03:55 -0700)
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>
drivers/scsi/isci/request.c
drivers/scsi/isci/task.h

index f19a952..0156431 100644 (file)
@@ -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;
index e1c9c8f..b84bedd 100644 (file)
@@ -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) {