diff options
| author | adam radford <aradford@gmail.com> | 2009-12-10 14:53:31 -0500 |
|---|---|---|
| committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-12 17:45:23 -0500 |
| commit | 53ca353594a254e6bd45ccf2d405aa31bcbb7091 (patch) | |
| tree | 1dfce24a2b996281aa1d30912de0c9345a3a9519 | |
| parent | 55a66d3c1e57f7e3e554d6ec8011e840f3802f20 (diff) | |
[SCSI] 3w-9xxx fix bug in sgl loading
This small patch fixes a bug in the 3w-9xxx driver where it would load
an invalid sgl address in the ioctl path even if request length was zero.
Signed-off-by: Adam Radford <aradford@gmail.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
| -rw-r--r-- | drivers/scsi/3w-9xxx.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c index 3bf75924741f..84d3bbaa95e7 100644 --- a/drivers/scsi/3w-9xxx.c +++ b/drivers/scsi/3w-9xxx.c | |||
| @@ -76,6 +76,7 @@ | |||
| 76 | Fix bug in twa_get_param() on 4GB+. | 76 | Fix bug in twa_get_param() on 4GB+. |
| 77 | Use pci_resource_len() for ioremap(). | 77 | Use pci_resource_len() for ioremap(). |
| 78 | 2.26.02.012 - Add power management support. | 78 | 2.26.02.012 - Add power management support. |
| 79 | 2.26.02.013 - Fix bug in twa_load_sgl(). | ||
| 79 | */ | 80 | */ |
| 80 | 81 | ||
| 81 | #include <linux/module.h> | 82 | #include <linux/module.h> |
| @@ -100,7 +101,7 @@ | |||
| 100 | #include "3w-9xxx.h" | 101 | #include "3w-9xxx.h" |
| 101 | 102 | ||
| 102 | /* Globals */ | 103 | /* Globals */ |
| 103 | #define TW_DRIVER_VERSION "2.26.02.012" | 104 | #define TW_DRIVER_VERSION "2.26.02.013" |
| 104 | static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; | 105 | static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; |
| 105 | static unsigned int twa_device_extension_count; | 106 | static unsigned int twa_device_extension_count; |
| 106 | static int twa_major = -1; | 107 | static int twa_major = -1; |
| @@ -1382,10 +1383,12 @@ static void twa_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full *full_comm | |||
| 1382 | newcommand = &full_command_packet->command.newcommand; | 1383 | newcommand = &full_command_packet->command.newcommand; |
| 1383 | newcommand->request_id__lunl = | 1384 | newcommand->request_id__lunl = |
| 1384 | cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id)); | 1385 | cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id)); |
| 1385 | newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1); | 1386 | if (length) { |
| 1386 | newcommand->sg_list[0].length = cpu_to_le32(length); | 1387 | newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1); |
| 1388 | newcommand->sg_list[0].length = cpu_to_le32(length); | ||
| 1389 | } | ||
| 1387 | newcommand->sgl_entries__lunh = | 1390 | newcommand->sgl_entries__lunh = |
| 1388 | cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), 1)); | 1391 | cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), length ? 1 : 0)); |
| 1389 | } else { | 1392 | } else { |
| 1390 | oldcommand = &full_command_packet->command.oldcommand; | 1393 | oldcommand = &full_command_packet->command.oldcommand; |
| 1391 | oldcommand->request_id = request_id; | 1394 | oldcommand->request_id = request_id; |
