summaryrefslogtreecommitdiffstats
path: root/releases/2.6.32.58/scsi-3w-9xxx-fix-bug-in-sgl-loading.patch
diff options
context:
space:
mode:
Diffstat (limited to 'releases/2.6.32.58/scsi-3w-9xxx-fix-bug-in-sgl-loading.patch')
-rw-r--r--releases/2.6.32.58/scsi-3w-9xxx-fix-bug-in-sgl-loading.patch56
1 files changed, 56 insertions, 0 deletions
diff --git a/releases/2.6.32.58/scsi-3w-9xxx-fix-bug-in-sgl-loading.patch b/releases/2.6.32.58/scsi-3w-9xxx-fix-bug-in-sgl-loading.patch
new file mode 100644
index 0000000..cef1052
--- /dev/null
+++ b/releases/2.6.32.58/scsi-3w-9xxx-fix-bug-in-sgl-loading.patch
@@ -0,0 +1,56 @@
+From 53ca353594a254e6bd45ccf2d405aa31bcbb7091 Mon Sep 17 00:00:00 2001
+From: adam radford <aradford@gmail.com>
+Date: Thu, 10 Dec 2009 11:53:31 -0800
+Subject: SCSI: 3w-9xxx fix bug in sgl loading
+
+From: adam radford <aradford@gmail.com>
+
+commit 53ca353594a254e6bd45ccf2d405aa31bcbb7091 upstream.
+
+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>
+Cc: Ben Hutchings <ben@decadent.org.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/3w-9xxx.c | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+--- a/drivers/scsi/3w-9xxx.c
++++ b/drivers/scsi/3w-9xxx.c
+@@ -76,6 +76,7 @@
+ Fix bug in twa_get_param() on 4GB+.
+ Use pci_resource_len() for ioremap().
+ 2.26.02.012 - Add power management support.
++ 2.26.02.013 - Fix bug in twa_load_sgl().
+ */
+
+ #include <linux/module.h>
+@@ -100,7 +101,7 @@
+ #include "3w-9xxx.h"
+
+ /* Globals */
+-#define TW_DRIVER_VERSION "2.26.02.012"
++#define TW_DRIVER_VERSION "2.26.02.013"
+ static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT];
+ static unsigned int twa_device_extension_count;
+ static int twa_major = -1;
+@@ -1378,10 +1379,12 @@ static void twa_load_sgl(TW_Device_Exten
+ newcommand = &full_command_packet->command.newcommand;
+ newcommand->request_id__lunl =
+ cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id));
+- newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
+- newcommand->sg_list[0].length = cpu_to_le32(length);
++ if (length) {
++ newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
++ newcommand->sg_list[0].length = cpu_to_le32(length);
++ }
+ newcommand->sgl_entries__lunh =
+- cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), 1));
++ cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), length ? 1 : 0));
+ } else {
+ oldcommand = &full_command_packet->command.oldcommand;
+ oldcommand->request_id = request_id;