]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
.38 patches
authorGreg Kroah-Hartman <gregkh@suse.de>
Thu, 19 May 2011 15:33:22 +0000 (08:33 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 19 May 2011 15:33:22 +0000 (08:33 -0700)
queue-2.6.38/revert-retrieve-the-caching-mode-page.patch [new file with mode: 0644]
queue-2.6.38/series

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 (file)
index 0000000..31593e2
--- /dev/null
@@ -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);
index 63a266cfb555b89ddc15616c4f03a068e47aff71..c9dc05d4d2d3d2ff60413dc51418232009727015 100644 (file)
@@ -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