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>
This commit is contained in:
committed by
Dan Williams
parent
50e7f9b5a9
commit
aa14510295
@@ -809,11 +809,11 @@ static void isci_task_save_for_upper_layer_completion(
|
|||||||
|
|
||||||
/* Normal notification (task_done) */
|
/* Normal notification (task_done) */
|
||||||
dev_dbg(&host->pdev->dev,
|
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__,
|
__func__,
|
||||||
task,
|
task,
|
||||||
response,
|
task->task_status.resp, response,
|
||||||
status);
|
task->task_status.stat, status);
|
||||||
/* Add to the completed list. */
|
/* Add to the completed list. */
|
||||||
list_add(&request->completed_node,
|
list_add(&request->completed_node,
|
||||||
&host->requests_to_complete);
|
&host->requests_to_complete);
|
||||||
@@ -827,11 +827,11 @@ static void isci_task_save_for_upper_layer_completion(
|
|||||||
* already in the abort path.
|
* already in the abort path.
|
||||||
*/
|
*/
|
||||||
dev_warn(&host->pdev->dev,
|
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__,
|
__func__,
|
||||||
task,
|
task,
|
||||||
response,
|
task->task_status.resp, response,
|
||||||
status);
|
task->task_status.stat, status);
|
||||||
|
|
||||||
/* Wake up whatever process was waiting for this
|
/* Wake up whatever process was waiting for this
|
||||||
* request to complete.
|
* request to complete.
|
||||||
@@ -850,11 +850,11 @@ static void isci_task_save_for_upper_layer_completion(
|
|||||||
case isci_perform_error_io_completion:
|
case isci_perform_error_io_completion:
|
||||||
/* Use sas_task_abort */
|
/* Use sas_task_abort */
|
||||||
dev_warn(&host->pdev->dev,
|
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__,
|
__func__,
|
||||||
task,
|
task,
|
||||||
response,
|
task->task_status.resp, response,
|
||||||
status);
|
task->task_status.stat, status);
|
||||||
/* Add to the aborted list. */
|
/* Add to the aborted list. */
|
||||||
list_add(&request->completed_node,
|
list_add(&request->completed_node,
|
||||||
&host->requests_to_errorback);
|
&host->requests_to_errorback);
|
||||||
@@ -862,11 +862,11 @@ static void isci_task_save_for_upper_layer_completion(
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
dev_warn(&host->pdev->dev,
|
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__,
|
__func__,
|
||||||
task,
|
task,
|
||||||
response,
|
task->task_status.resp, response,
|
||||||
status);
|
task->task_status.stat, status);
|
||||||
|
|
||||||
/* Add to the error to libsas list. */
|
/* Add to the error to libsas list. */
|
||||||
list_add(&request->completed_node,
|
list_add(&request->completed_node,
|
||||||
@@ -1165,6 +1165,10 @@ void isci_request_io_request_complete(
|
|||||||
task->task_state_flags |= SAS_TASK_NEED_DEV_RESET;
|
task->task_state_flags |= SAS_TASK_NEED_DEV_RESET;
|
||||||
spin_unlock_irqrestore(&task->task_state_lock, task_flags);
|
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;
|
complete_to_host = isci_perform_error_io_completion;
|
||||||
request->complete_in_target = false;
|
request->complete_in_target = false;
|
||||||
break;
|
break;
|
||||||
|
@@ -302,14 +302,19 @@ isci_task_set_completion_status(
|
|||||||
|
|
||||||
spin_lock_irqsave(&task->task_state_lock, flags);
|
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
|
/* If a device reset is being indicated, make sure the I/O
|
||||||
* is in the error path.
|
* 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_notification_selection = isci_perform_error_io_completion;
|
||||||
|
}
|
||||||
|
task->task_status.resp = response;
|
||||||
|
task->task_status.stat = status;
|
||||||
|
|
||||||
switch (task_notification_selection) {
|
switch (task_notification_selection) {
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user