Attached is a patch to linux/drivers/scsi/sd.c which fixes the behavior of the code which tests the WP bit. This patch is generated against 2.4.0-test8-pre4. Specifically, thsi code fixes the case where the device in question does not have a page 1 (I found one, this is how I found the bug). Since we're not really interested in page 1 (we just want the header data), this patch makes the code request "all pages" (code 0x3f) with an allocation length of only 8 bytes (the length of the header data). This works on all devices I have available to test. I see no reason why it might break other devices. Linus, please apply. Matt Dharm -- Matthew Dharm Home: [EMAIL PROTECTED] Maintainer, Linux USB Mass Storage Driver Way to go, lava boy. -- Stef to Greg User Friendly, 3/26/1998
--- drivers/scsi/sd.c.old Tue Sep 5 14:23:10 2000 +++ drivers/scsi/sd.c Tue Sep 5 14:25:27 2000 @@ -957,17 +957,23 @@ /* FLOPTICAL */ /* - * for removable scsi disk ( FLOPTICAL ) we have to recognise - * the Write Protect Flag. This flag is kept in the Scsi_Disk struct - * and tested at open ! + * For removable scsi disk ( FLOPTICAL ) we have to recognise + * the Write Protect Flag. This flag is kept in the Scsi_Disk + * struct and tested at open ! * Daniel Roche ( [EMAIL PROTECTED] ) + * + * Changed to get all pages (0x3f) rather than page 1 to + * get around devices which do not have a page 1. Since + * we're only interested in the header anyway, this should + * be fine. + * -- Matthew Dharm ([EMAIL PROTECTED]) */ memset((void *) &cmd[0], 0, 8); cmd[0] = MODE_SENSE; cmd[1] = (rscsi_disks[i].device->lun << 5) & 0xe0; - cmd[2] = 1; /* page code 1 ?? */ - cmd[4] = 12; + cmd[2] = 0x3f; /* Get all pages */ + cmd[4] = 8; /* But we only want the 8 byte header */ SRpnt->sr_cmd_len = 0; SRpnt->sr_sense_buffer[0] = 0; SRpnt->sr_sense_buffer[2] = 0;