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: Jeff Skirvin <jeffrey.d.skirvin@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
de728b7d72
commit
f219f010a3
|
@ -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(
|
||||||
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(
|
||||||
* 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)
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue