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 /drivers/scsi/3w-9xxx.c | |
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>
Diffstat (limited to 'drivers/scsi/3w-9xxx.c')
-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; |