isci: fix isci_task_execute_tmf completion
Dan Williams [Tue, 21 Jun 2011 23:23:03 +0000 (16:23 -0700)]
1/ fix the timeout for wait_for_completion_timeout
2/ In the tmf timeout case we need to wait for our termination callback
3/ Once the request is successfully started it will be freed according to the
   normal lifetime for requests.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>

drivers/scsi/isci/task.c

index c313bc1..0835a2c 100644 (file)
@@ -339,7 +339,8 @@ int isci_task_execute_tmf(struct isci_host *ihost,
                         status,
                         ireq);
                spin_unlock_irqrestore(&ihost->scic_lock, flags);
-               goto cleanup_request;
+               isci_request_free(ihost, ireq);
+               return ret;
        }
 
        if (tmf->cb_state_func != NULL)
@@ -354,7 +355,7 @@ int isci_task_execute_tmf(struct isci_host *ihost,
 
        /* Wait for the TMF to complete, or a timeout. */
        timeleft = wait_for_completion_timeout(&completion,
-                                      jiffies + msecs_to_jiffies(timeout_ms));
+                                              msecs_to_jiffies(timeout_ms));
 
        if (timeleft == 0) {
                spin_lock_irqsave(&ihost->scic_lock, flags);
@@ -362,11 +363,13 @@ int isci_task_execute_tmf(struct isci_host *ihost,
                if (tmf->cb_state_func != NULL)
                        tmf->cb_state_func(isci_tmf_timed_out, tmf, tmf->cb_data);
 
-               status = scic_controller_terminate_request(&ihost->sci,
-                                                          &isci_device->sci,
-                                                          &ireq->sci);
+               scic_controller_terminate_request(&ihost->sci,
+                                                 &isci_device->sci,
+                                                 &ireq->sci);
 
                spin_unlock_irqrestore(&ihost->scic_lock, flags);
+
+               wait_for_completion(tmf->complete);
        }
 
        isci_print_tmf(tmf);
@@ -387,13 +390,6 @@ int isci_task_execute_tmf(struct isci_host *ihost,
                __func__,
                ireq);
 
-       if (ireq->io_request_completion != NULL) {
-               /* A thread is waiting for this TMF to finish. */
-               complete(ireq->io_request_completion);
-       }
-
- cleanup_request:
-       isci_request_free(ihost, ireq);
        return ret;
 }