isci: isci_request_cleanup_completed_loiterer checks task before task_done
authorJeff Skirvin <jeffrey.d.skirvin@intel.com>
Fri, 4 Mar 2011 22:06:38 +0000 (14:06 -0800)
committerDan Williams <dan.j.williams@intel.com>
Sun, 3 Jul 2011 10:55:29 +0000 (03:55 -0700)
In the condition where outstanding I/Os are being cleaned from the device
requests in process list, the cleanup function needs to check that the
request is actually a sas-task and not a task management function.

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 98204b0..779f6cf 100644 (file)
@@ -631,13 +631,16 @@ static void isci_request_cleanup_completed_loiterer(
        struct isci_remote_device *isci_device,
        struct isci_request *isci_request)
 {
-       struct sas_task *task = isci_request_access_task(isci_request);
-       unsigned long flags;
+       struct sas_task     *task;
+       unsigned long       flags;
+
+       task = (isci_request->ttype == io_task)
+               ? isci_request_access_task(isci_request)
+               : NULL;
 
        dev_dbg(&isci_host->pdev->dev,
                "%s: isci_device=%p, request=%p, task=%p\n",
-               __func__, isci_device, isci_request,
-               isci_request->ttype_ptr.io_task_ptr);
+               __func__, isci_device, isci_request, task);
 
        spin_lock_irqsave(&isci_host->scic_lock, flags);
        list_del_init(&isci_request->dev_node);