Skip to content

Commit 3dea642

Browse files
James BottomleyJames Bottomley
authored andcommitted
[SCSI] Revert "[SCSI] Retrieve the Caching mode page"
This reverts commit 24d720b. 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>
1 parent fee7871 commit 3dea642

File tree

1 file changed

+16
-47
lines changed

1 file changed

+16
-47
lines changed

drivers/scsi/sd.c

Lines changed: 16 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2027,14 +2027,10 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
20272027
int old_rcd = sdkp->RCD;
20282028
int old_dpofua = sdkp->DPOFUA;
20292029

2030-
if (sdp->skip_ms_page_8) {
2031-
if (sdp->type == TYPE_RBC)
2032-
goto defaults;
2033-
else {
2034-
modepage = 0x3F;
2035-
dbd = 0;
2036-
}
2037-
} else if (sdp->type == TYPE_RBC) {
2030+
if (sdp->skip_ms_page_8)
2031+
goto defaults;
2032+
2033+
if (sdp->type == TYPE_RBC) {
20382034
modepage = 6;
20392035
dbd = 8;
20402036
} else {
@@ -2062,57 +2058,30 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
20622058
*/
20632059
if (len < 3)
20642060
goto bad_sense;
2065-
else if (len > SD_BUF_SIZE) {
2066-
sd_printk(KERN_NOTICE, sdkp, "Truncating mode parameter "
2067-
"data from %d to %d bytes\n", len, SD_BUF_SIZE);
2068-
len = SD_BUF_SIZE;
2069-
}
2061+
if (len > 20)
2062+
len = 20;
2063+
2064+
/* Take headers and block descriptors into account */
2065+
len += data.header_length + data.block_descriptor_length;
2066+
if (len > SD_BUF_SIZE)
2067+
goto bad_sense;
20702068

20712069
/* Get the data */
20722070
res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr);
20732071

20742072
if (scsi_status_is_good(res)) {
20752073
int offset = data.header_length + data.block_descriptor_length;
20762074

2077-
while (offset < len) {
2078-
u8 page_code = buffer[offset] & 0x3F;
2079-
u8 spf = buffer[offset] & 0x40;
2080-
2081-
if (page_code == 8 || page_code == 6) {
2082-
/* We're interested only in the first 3 bytes.
2083-
*/
2084-
if (len - offset <= 2) {
2085-
sd_printk(KERN_ERR, sdkp, "Incomplete "
2086-
"mode parameter data\n");
2087-
goto defaults;
2088-
} else {
2089-
modepage = page_code;
2090-
goto Page_found;
2091-
}
2092-
} else {
2093-
/* Go to the next page */
2094-
if (spf && len - offset > 3)
2095-
offset += 4 + (buffer[offset+2] << 8) +
2096-
buffer[offset+3];
2097-
else if (!spf && len - offset > 1)
2098-
offset += 2 + buffer[offset+1];
2099-
else {
2100-
sd_printk(KERN_ERR, sdkp, "Incomplete "
2101-
"mode parameter data\n");
2102-
goto defaults;
2103-
}
2104-
}
2075+
if (offset >= SD_BUF_SIZE - 2) {
2076+
sd_printk(KERN_ERR, sdkp, "Malformed MODE SENSE response\n");
2077+
goto defaults;
21052078
}
21062079

2107-
if (modepage == 0x3F) {
2108-
sd_printk(KERN_ERR, sdkp, "No Caching mode page "
2109-
"present\n");
2110-
goto defaults;
2111-
} else if ((buffer[offset] & 0x3f) != modepage) {
2080+
if ((buffer[offset] & 0x3f) != modepage) {
21122081
sd_printk(KERN_ERR, sdkp, "Got wrong page\n");
21132082
goto defaults;
21142083
}
2115-
Page_found:
2084+
21162085
if (modepage == 8) {
21172086
sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0);
21182087
sdkp->RCD = ((buffer[offset + 2] & 0x01) != 0);

0 commit comments

Comments
 (0)