Commit f219f010 authored by Jeff Skirvin's avatar Jeff Skirvin Committed by Dan Williams

isci: Properly handle requests in the "aborting" state.

When a TMF times-out, the request is set back to "aborting".
Requests in the "aborting" state must be terminated when
LUN and device resets occur.
Signed-off-by: default avatarJeff Skirvin <jeffrey.d.skirvin@intel.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent de728b7d
...@@ -199,7 +199,7 @@ static inline enum isci_request_status isci_request_change_started_to_newstate( ...@@ -199,7 +199,7 @@ static inline enum isci_request_status isci_request_change_started_to_newstate(
old_state = isci_request->status; old_state = isci_request->status;
if (old_state == started) { if (old_state == started || old_state == aborting) {
BUG_ON(isci_request->io_request_completion != NULL); BUG_ON(isci_request->io_request_completion != NULL);
isci_request->io_request_completion = completion_ptr; isci_request->io_request_completion = completion_ptr;
......
...@@ -903,7 +903,9 @@ static void isci_terminate_request( ...@@ -903,7 +903,9 @@ static void isci_terminate_request(
new_request_state new_request_state
); );
if ((old_state == started) || (old_state == completed)) { if ((old_state == started) ||
(old_state == completed) ||
(old_state == aborting)) {
/* If the old_state is started: /* If the old_state is started:
* This request was not already being aborted. If it had been, * This request was not already being aborted. If it had been,
...@@ -920,6 +922,10 @@ static void isci_terminate_request( ...@@ -920,6 +922,10 @@ static void isci_terminate_request(
* This request completed from the SCU hardware perspective * This request completed from the SCU hardware perspective
* and now just needs cleaning up in terms of freeing the * and now just needs cleaning up in terms of freeing the
* request and potentially calling up to libsas. * request and potentially calling up to libsas.
*
* If old_state == aborting:
* This request has already gone through a TMF timeout, but may
* not have been terminated; needs cleaning up at least.
*/ */
isci_terminate_request_core(isci_host, isci_device, isci_terminate_request_core(isci_host, isci_device,
isci_request); isci_request);
...@@ -1297,14 +1303,16 @@ int isci_task_abort_task(struct sas_task *task) ...@@ -1297,14 +1303,16 @@ int isci_task_abort_task(struct sas_task *task)
spin_lock_irqsave(&isci_host->scic_lock, flags); spin_lock_irqsave(&isci_host->scic_lock, flags);
/* Check the request status and change to "aborting" if currently /* Check the request status and change to "aborted" if currently
* "starting"; if true then set the I/O kernel completion * "starting"; if true then set the I/O kernel completion
* struct that will be triggered when the request completes. * struct that will be triggered when the request completes.
*/ */
old_state = isci_task_validate_request_to_abort( old_state = isci_task_validate_request_to_abort(
old_request, isci_host, isci_device, old_request, isci_host, isci_device,
&aborted_io_completion); &aborted_io_completion);
if ((old_state != started) && (old_state != completed)) { if ((old_state != started) &&
(old_state != completed) &&
(old_state != aborting)) {
spin_unlock_irqrestore(&isci_host->scic_lock, flags); spin_unlock_irqrestore(&isci_host->scic_lock, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment