summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2011-05-19 08:33:22 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2011-05-19 08:33:22 -0700
commitf09b586697e40cc294ebff71f6f68b79f3059e60 (patch)
tree006bf49ea6fd785e8f030c5e234fec134b7ce172
parente157379d8694853217e7097a0379d7e7daaf6dcd (diff)
downloadstable-queue-f09b586697e40cc294ebff71f6f68b79f3059e60.tar.gz
.38 patches
-rw-r--r--queue-2.6.38/revert-retrieve-the-caching-mode-page.patch114
-rw-r--r--queue-2.6.38/series1
2 files changed, 115 insertions, 0 deletions
diff --git a/queue-2.6.38/revert-retrieve-the-caching-mode-page.patch b/queue-2.6.38/revert-retrieve-the-caching-mode-page.patch
new file mode 100644
index 0000000000..31593e2839
--- /dev/null
+++ b/queue-2.6.38/revert-retrieve-the-caching-mode-page.patch
@@ -0,0 +1,114 @@
+From 3dea642afd9187728d119fce5c82a7ed9faa9b6a Mon Sep 17 00:00:00 2001
+From: James Bottomley <James.Bottomley@suse.de>
+Date: Wed, 23 Mar 2011 09:58:28 -0500
+Subject: [SCSI] Revert "[SCSI] Retrieve the Caching mode page"
+
+From: James Bottomley <James.Bottomley@suse.de>
+
+commit 3dea642afd9187728d119fce5c82a7ed9faa9b6a upstream.
+
+This reverts commit 24d720b726c1a85f1962831ac30ad4d2ef8276b1.
+
+Previously we thought there was little possibility that devices would
+crash with this, but some have been found.
+
+Reported-by: Alan Stern <stern@rowland.harvard.edu>
+Cc: Luben Tuikov <ltuikov@yahoo.com>
+Signed-off-by: James Bottomley <James.Bottomley@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/scsi/sd.c | 63 +++++++++++++-----------------------------------------
+ 1 file changed, 16 insertions(+), 47 deletions(-)
+
+--- a/drivers/scsi/sd.c
++++ b/drivers/scsi/sd.c
+@@ -1910,14 +1910,10 @@ sd_read_cache_type(struct scsi_disk *sdk
+ int old_rcd = sdkp->RCD;
+ int old_dpofua = sdkp->DPOFUA;
+
+- if (sdp->skip_ms_page_8) {
+- if (sdp->type == TYPE_RBC)
+- goto defaults;
+- else {
+- modepage = 0x3F;
+- dbd = 0;
+- }
+- } else if (sdp->type == TYPE_RBC) {
++ if (sdp->skip_ms_page_8)
++ goto defaults;
++
++ if (sdp->type == TYPE_RBC) {
+ modepage = 6;
+ dbd = 8;
+ } else {
+@@ -1945,11 +1941,13 @@ sd_read_cache_type(struct scsi_disk *sdk
+ */
+ if (len < 3)
+ goto bad_sense;
+- else if (len > SD_BUF_SIZE) {
+- sd_printk(KERN_NOTICE, sdkp, "Truncating mode parameter "
+- "data from %d to %d bytes\n", len, SD_BUF_SIZE);
+- len = SD_BUF_SIZE;
+- }
++ if (len > 20)
++ len = 20;
++
++ /* Take headers and block descriptors into account */
++ len += data.header_length + data.block_descriptor_length;
++ if (len > SD_BUF_SIZE)
++ goto bad_sense;
+
+ /* Get the data */
+ res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr);
+@@ -1957,45 +1955,16 @@ sd_read_cache_type(struct scsi_disk *sdk
+ if (scsi_status_is_good(res)) {
+ int offset = data.header_length + data.block_descriptor_length;
+
+- while (offset < len) {
+- u8 page_code = buffer[offset] & 0x3F;
+- u8 spf = buffer[offset] & 0x40;
+-
+- if (page_code == 8 || page_code == 6) {
+- /* We're interested only in the first 3 bytes.
+- */
+- if (len - offset <= 2) {
+- sd_printk(KERN_ERR, sdkp, "Incomplete "
+- "mode parameter data\n");
+- goto defaults;
+- } else {
+- modepage = page_code;
+- goto Page_found;
+- }
+- } else {
+- /* Go to the next page */
+- if (spf && len - offset > 3)
+- offset += 4 + (buffer[offset+2] << 8) +
+- buffer[offset+3];
+- else if (!spf && len - offset > 1)
+- offset += 2 + buffer[offset+1];
+- else {
+- sd_printk(KERN_ERR, sdkp, "Incomplete "
+- "mode parameter data\n");
+- goto defaults;
+- }
+- }
++ if (offset >= SD_BUF_SIZE - 2) {
++ sd_printk(KERN_ERR, sdkp, "Malformed MODE SENSE response\n");
++ goto defaults;
+ }
+
+- if (modepage == 0x3F) {
+- sd_printk(KERN_ERR, sdkp, "No Caching mode page "
+- "present\n");
+- goto defaults;
+- } else if ((buffer[offset] & 0x3f) != modepage) {
++ if ((buffer[offset] & 0x3f) != modepage) {
+ sd_printk(KERN_ERR, sdkp, "Got wrong page\n");
+ goto defaults;
+ }
+- Page_found:
++
+ if (modepage == 8) {
+ sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0);
+ sdkp->RCD = ((buffer[offset + 2] & 0x01) != 0);
diff --git a/queue-2.6.38/series b/queue-2.6.38/series
index 63a266cfb5..c9dc05d4d2 100644
--- a/queue-2.6.38/series
+++ b/queue-2.6.38/series
@@ -65,3 +65,4 @@ x86-mce-amd-fix-leaving-freed-data-in-a-list.patch
megaraid_sas-sanity-check-user-supplied-length-before-passing-it-to-dma_alloc_coherent.patch
cdrom-always-check_disk_change-on-open.patch
vmxnet3-fix-inconsistent-lro-state-after-initialization.patch
+revert-retrieve-the-caching-mode-page.patch