diff options
author | Jeff Skirvin <jeffrey.d.skirvin@intel.com> | 2011-03-04 17:06:56 -0500 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2011-07-03 06:55:30 -0400 |
commit | c3f42feb0c3d20dc7007336e7de949408b93afef (patch) | |
tree | a8678f8eaf06758a52a6e75c57121be51ee846c4 | |
parent | 4dc043c41037fc6e369270daaa626465a8766565 (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.c | 24 | ||||
-rw-r--r-- | drivers/scsi/isci/task.h | 9 |
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 | ||
562 | void 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 | ||
564 | static struct isci_request *isci_task_get_request_from_task( | 576 | static 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 | |||
229 | void 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 *), |