diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2011-05-19 08:33:22 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-05-19 08:33:22 -0700 |
commit | f09b586697e40cc294ebff71f6f68b79f3059e60 (patch) | |
tree | 006bf49ea6fd785e8f030c5e234fec134b7ce172 | |
parent | e157379d8694853217e7097a0379d7e7daaf6dcd (diff) | |
download | stable-queue-f09b586697e40cc294ebff71f6f68b79f3059e60.tar.gz |
.38 patches
-rw-r--r-- | queue-2.6.38/revert-retrieve-the-caching-mode-page.patch | 114 | ||||
-rw-r--r-- | queue-2.6.38/series | 1 |
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 |