On Sun, 20 Mar 2011, Richard Senior wrote: > On 19/03/11 16:57, Alan Stern wrote: > > > The transcripts are not complete. Please run the tests again and post > > the entire output from the dmesg command instead of just the tail of > > the kernel log. > > > > Also, for the "bad" kernel you should enable CONFIG_USB_STORAGE_DEBUG. > > Please find transcripts/dmesg of fresh tests. > > The short transcripts show the commands I ran. I've included the tail of > dmesg at appropriate points so that you can relate plugging/enabling to > the complete dmesg output, which was captured at the end of the session. Well done; this pinpoints the source of the problem. The patch below should fix things up. Let me know how it works; if it is okay then I'll submit it for inclusion in a 2.6.38.stable release. Alan Stern drivers/scsi/sd.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) Index: usb-2.6/drivers/scsi/sd.c =================================================================== --- usb-2.6.orig/drivers/scsi/sd.c +++ usb-2.6/drivers/scsi/sd.c @@ -1904,17 +1904,23 @@ sd_read_cache_type(struct scsi_disk *sdk int dbd; int modepage; + int first_len; struct scsi_mode_data data; struct scsi_sense_hdr sshdr; int old_wce = sdkp->WCE; int old_rcd = sdkp->RCD; int old_dpofua = sdkp->DPOFUA; + first_len = 4; if (sdp->skip_ms_page_8) { if (sdp->type == TYPE_RBC) goto defaults; else { + if (sdp->skip_ms_page_3f) + goto defaults; modepage = 0x3F; + if (sdp->use_192_bytes_for_3f) + first_len = 192; dbd = 0; } } else if (sdp->type == TYPE_RBC) { @@ -1926,13 +1932,15 @@ sd_read_cache_type(struct scsi_disk *sdk } /* cautiously ask */ - res = sd_do_mode_sense(sdp, dbd, modepage, buffer, 4, &data, &sshdr); + res = sd_do_mode_sense(sdp, dbd, modepage, buffer, first_len, + &data, &sshdr); if (!scsi_status_is_good(res)) goto bad_sense; if (!data.header_length) { modepage = 6; + first_len = 0; sd_printk(KERN_ERR, sdkp, "Missing header in MODE_SENSE response\n"); } @@ -1952,7 +1960,9 @@ sd_read_cache_type(struct scsi_disk *sdk } /* Get the data */ - res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr); + if (len > first_len) + res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, + &data, &sshdr); if (scsi_status_is_good(res)) { int offset = data.header_length + data.block_descriptor_length; -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html