summaryrefslogtreecommitdiff
path: root/drivers/scsi/isci
diff options
context:
space:
mode:
authorJeff Skirvin <jeffrey.d.skirvin@intel.com>2012-03-09 06:42:00 (GMT)
committerDan Williams <dan.j.williams@intel.com>2012-05-17 21:33:40 (GMT)
commit08c031e4e3294a66a64074e12482abda846dd39c (patch)
treec7fb3392487ed731a39a75239850be657009aa56 /drivers/scsi/isci
parent9608b6408e637abeec101abb6aebd3343f0ebac4 (diff)
downloadlinux-08c031e4e3294a66a64074e12482abda846dd39c.tar.xz
isci: Make sure all TCs are terminated and cleaned in LUN reset.
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>
Diffstat (limited to 'drivers/scsi/isci')
-rw-r--r--drivers/scsi/isci/task.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c
index 222fb0d..5d738fd 100644
--- a/drivers/scsi/isci/task.c
+++ b/drivers/scsi/isci/task.c
@@ -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);
}