aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Skirvin <jeffrey.d.skirvin@intel.com>2011-03-04 17:06:56 -0500
committerDan Williams <dan.j.williams@intel.com>2011-07-03 06:55:30 -0400
commitc3f42feb0c3d20dc7007336e7de949408b93afef (patch)
treea8678f8eaf06758a52a6e75c57121be51ee846c4
parent4dc043c41037fc6e369270daaa626465a8766565 (diff)
isci: Fix TMF build for SAS/SATA LUN reset cases.
In the case where a SAS or SATA LUN reset TMF is built a NULL pointer dereference occurred because of the (unused) callback data pointer. Signed-off-by: Jeff Skirvin <jeffrey.d.skirvin@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Jacek Danecki <Jacek.Danecki@intel.com>
-rw-r--r--drivers/scsi/isci/task.c24
-rw-r--r--drivers/scsi/isci/task.h9
2 files changed, 28 insertions, 5 deletions
diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c
index c781a4ab4a50..c2d74c3929fb 100644
--- a/drivers/scsi/isci/task.c
+++ b/drivers/scsi/isci/task.c
@@ -545,7 +545,7 @@ void isci_task_build_tmf(
545 void (*tmf_sent_cb)(enum isci_tmf_cb_state, 545 void (*tmf_sent_cb)(enum isci_tmf_cb_state,
546 struct isci_tmf *, 546 struct isci_tmf *,
547 void *), 547 void *),
548 struct isci_request *old_request) 548 void *cb_data)
549{ 549{
550 dev_dbg(&isci_device->isci_port->isci_host->pdev->dev, 550 dev_dbg(&isci_device->isci_port->isci_host->pdev->dev,
551 "%s: isci_device = %p\n", __func__, isci_device); 551 "%s: isci_device = %p\n", __func__, isci_device);
@@ -556,9 +556,21 @@ void isci_task_build_tmf(
556 tmf->tmf_code = code; 556 tmf->tmf_code = code;
557 tmf->timeout_timer = NULL; 557 tmf->timeout_timer = NULL;
558 tmf->cb_state_func = tmf_sent_cb; 558 tmf->cb_state_func = tmf_sent_cb;
559 tmf->cb_data = old_request; 559 tmf->cb_data = cb_data;
560 tmf->io_tag = old_request->io_tag; 560}
561 561
562void isci_task_build_abort_task_tmf(
563 struct isci_tmf *tmf,
564 struct isci_remote_device *isci_device,
565 enum isci_tmf_function_codes code,
566 void (*tmf_sent_cb)(enum isci_tmf_cb_state,
567 struct isci_tmf *,
568 void *),
569 struct isci_request *old_request)
570{
571 isci_task_build_tmf(tmf, isci_device, code, tmf_sent_cb,
572 (void *)old_request);
573 tmf->io_tag = old_request->io_tag;
562} 574}
563 575
564static struct isci_request *isci_task_get_request_from_task( 576static struct isci_request *isci_task_get_request_from_task(
@@ -1300,8 +1312,10 @@ int isci_task_abort_task(struct sas_task *task)
1300 */ 1312 */
1301 } else { 1313 } else {
1302 /* Fill in the tmf stucture */ 1314 /* Fill in the tmf stucture */
1303 isci_task_build_tmf(&tmf, isci_device, isci_tmf_ssp_task_abort, 1315 isci_task_build_abort_task_tmf(&tmf, isci_device,
1304 isci_abort_task_process_cb, old_request); 1316 isci_tmf_ssp_task_abort,
1317 isci_abort_task_process_cb,
1318 old_request);
1305 1319
1306 spin_unlock_irqrestore(&isci_host->scic_lock, flags); 1320 spin_unlock_irqrestore(&isci_host->scic_lock, flags);
1307 1321
diff --git a/drivers/scsi/isci/task.h b/drivers/scsi/isci/task.h
index 5a5a4ec2dc90..4c2a27eede49 100644
--- a/drivers/scsi/isci/task.h
+++ b/drivers/scsi/isci/task.h
@@ -221,6 +221,15 @@ void isci_task_build_tmf(
221 struct isci_tmf *tmf, 221 struct isci_tmf *tmf,
222 struct isci_remote_device *isci_device, 222 struct isci_remote_device *isci_device,
223 enum isci_tmf_function_codes code, 223 enum isci_tmf_function_codes code,
224 void (*tmf_sent_cb)(enum isci_tmf_cb_state,
225 struct isci_tmf *,
226 void *),
227 void *cb_data);
228
229void isci_task_build_abort_task_tmf(
230 struct isci_tmf *tmf,
231 struct isci_remote_device *isci_device,
232 enum isci_tmf_function_codes code,
224 void (*tmf_sent_cb)( 233 void (*tmf_sent_cb)(
225 enum isci_tmf_cb_state, 234 enum isci_tmf_cb_state,
226 struct isci_tmf *, void *), 235 struct isci_tmf *, void *),