isci: Make sure all TCs are terminated and cleaned in LUN reset.
authorJeff Skirvin <jeffrey.d.skirvin@intel.com>
Fri, 9 Mar 2012 06:42:00 +0000 (22:42 -0800)
committerDan Williams <dan.j.williams@intel.com>
Thu, 17 May 2012 21:33:40 +0000 (14:33 -0700)
In the libsas error path, SATA disks require extra handling in
libata to recover operation.  However, libsas expects to be able
to immediately recover all outstanding I/O once the error handler
escalation stops.  This patch fixes the condition where the libata
error handler is scheduled for operation but libsas has already
deleted the outstanding sas_tasks.

Signed-off-by: Jeff Skirvin <jeffrey.d.skirvin@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/scsi/isci/task.c

index 222fb0de4d59d52470898bbd98a920032c5e00c8..5d738fd5f882c0bbfd7c432f4c2b4bb6461efbbf 100644 (file)
@@ -439,16 +439,18 @@ int isci_task_lu_reset(struct domain_device *dev, u8 *lun)
                goto out;
        }
 
+       /* Suspend the RNC, kill all TCs */
+       if (isci_remote_device_suspend_terminate(ihost, idev, NULL)
+           != SCI_SUCCESS) {
+               /* The suspend/terminate only fails if isci_get_device fails */
+               ret = TMF_RESP_FUNC_FAILED;
+               goto out;
+       }
+       /* All pending I/Os have been terminated and cleaned up. */
        if (dev_is_sata(dev)) {
                sas_ata_schedule_reset(dev);
                ret = TMF_RESP_FUNC_COMPLETE;
        } else {
-               /* Suspend the RNC, kill all TCs */
-               if (isci_remote_device_suspend_terminate(ihost, idev, NULL)
-                   != SCI_SUCCESS) {
-                       ret = TMF_RESP_FUNC_FAILED;
-                       goto out;
-               }
                /* Send the task management part of the reset. */
                ret = isci_task_send_lu_reset_sas(ihost, idev, lun);
        }