isci: save the i/o tag outside the scic request structure.
authorJeff Skirvin <jeffrey.d.skirvin@intel.com>
Fri, 4 Mar 2011 22:06:46 +0000 (14:06 -0800)
committerDan Williams <dan.j.williams@intel.com>
Sun, 3 Jul 2011 10:55:30 +0000 (03:55 -0700)
The pointer to the core representation of a request is marked NULL at
completion, but we need to save the i/o tag for task management.

Signed-off-by: Jeff Skirvin <jeffrey.d.skirvin@intel.com>
Signed-off-by: Jacek Danecki <Jacek.Danecki@intel.com>
[revise changelog]
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/scsi/isci/request.c
drivers/scsi/isci/task.c
drivers/scsi/isci/task.h

index 6cd80bbdae15be934ff40995aa9041bb951cfed9..f19a952754b9f2bf55346d8a38a1670129f66f06 100644 (file)
@@ -463,6 +463,12 @@ int isci_request_execute(
                                 */
                                status = SCI_SUCCESS;
                        }
+                       else
+                               /* 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",
index 02c40c00cb8ba7bc952d70f137860ebfea0d7d92..e9bfc22d91d01a5835fdfd4e6baefbbdc8ffe7fb 100644 (file)
@@ -544,7 +544,7 @@ void isci_task_build_tmf(
        void (*tmf_sent_cb)(enum isci_tmf_cb_state,
                            struct isci_tmf *,
                            void *),
-       void *cb_data)
+       struct isci_request *old_request)
 {
        dev_dbg(&isci_device->isci_port->isci_host->pdev->dev,
                "%s: isci_device = %p\n", __func__, isci_device);
@@ -555,7 +555,9 @@ void isci_task_build_tmf(
        tmf->tmf_code      = code;
        tmf->timeout_timer = NULL;
        tmf->cb_state_func = tmf_sent_cb;
-       tmf->cb_data       = cb_data;
+       tmf->cb_data       = old_request;
+       tmf->io_tag        = old_request->io_tag;
+
 }
 
 static struct isci_request *isci_task_get_request_from_task(
@@ -1248,10 +1250,6 @@ int isci_task_abort_task(struct sas_task *task)
                isci_task_build_tmf(&tmf, isci_device, isci_tmf_ssp_task_abort,
                                    isci_abort_task_process_cb, old_request);
 
-               tmf.io_tag = scic_io_request_get_io_tag(
-                       old_request->sci_request_handle
-                       );
-
                spin_unlock_irqrestore(&isci_host->scic_lock, flags);
 
                #define ISCI_ABORT_TASK_TIMEOUT_MS 500 /* half second timeout. */
index 68d8e5e65a73f2ee7ce377eb9bbdd894308220bf..5a5a4ec2dc9051066e5539be4135c78e17955d31 100644 (file)
@@ -224,7 +224,7 @@ void isci_task_build_tmf(
        void (*tmf_sent_cb)(
                enum isci_tmf_cb_state,
                struct isci_tmf *, void *),
-       void *cb_data);
+       struct isci_request *old_request);
 
 int isci_task_execute_tmf(
        struct isci_host *isci_host,