isci: don't hold scic_lock over calls to sas_task_abort()
authorJeff Skirvin <jeffrey.d.skirvin@intel.com>
Wed, 16 Mar 2011 16:41:59 +0000 (09:41 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sun, 3 Jul 2011 10:55:30 +0000 (03:55 -0700)
In the case where submitted I/Os fail with the status code
SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED, the execute function now waits
until scic_lock is cleared before calling the helper function
"isci_request_signal_device_reset" which sets the flag for the pending
reset condition on the I/O.

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

index 01564310431159f79ceb0a9cc2257385d49158c3..eba8e0b3c8731f3582edecb6d86025050db5da8c 100644 (file)
@@ -449,26 +449,11 @@ int isci_request_execute(
                        list_add(&request->dev_node,
                                 &isci_device->reqs_in_process);
 
-                       if (status ==
-                               SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED) {
-                               /* Signal libsas that we need the SCSI error
-                                * handler thread to work on this I/O and that
-                                * we want a device reset.
-                                */
-                               isci_request_signal_device_reset(request);
-
-                               /* Change the status, since we are holding
-                                * the I/O until it is managed by the SCSI
-                                * error handler.
-                                */
-                               status = SCI_SUCCESS;
-                       }
-                       else
+                       if (status == SCI_SUCCESS) {
                                /* Save the tag for possible task mgmt later. */
                                request->io_tag = scic_io_request_get_io_tag(
                                                     request->sci_request_handle);
-
-
+                       }
                } else
                        dev_warn(&isci_host->pdev->dev,
                                 "%s: failed request start\n",
@@ -476,6 +461,21 @@ int isci_request_execute(
 
                spin_unlock_irqrestore(&isci_host->scic_lock, flags);
 
+               if (status ==
+                   SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED) {
+                       /* Signal libsas that we need the SCSI error
+                       * handler thread to work on this I/O and that
+                       * we want a device reset.
+                       */
+                       isci_request_signal_device_reset(request);
+
+                       /* Change the status, since we are holding
+                       * the I/O until it is managed by the SCSI
+                       * error handler.
+                       */
+                       status = SCI_SUCCESS;
+               }
+
        } else
                dev_warn(&isci_host->pdev->dev,
                         "%s: request_construct failed - status = 0x%x\n",