From mboxrd@z Thu Jan 1 00:00:00 1970
From: Pat LaVarre
Subject: [PATCH 2.4] rewritable USB DVD-RAM vs. mode sense op choice
Date: 16 Aug 2004 10:29:49 -0600
Sender: linux-scsi-owner@vger.kernel.org
Message-ID: <1092673789.4297.7.camel@patlinux.iomegacorp.com>
Mime-Version: 1.0
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
Return-path:
Received: from email-out2.iomega.com ([147.178.1.83]:55507 "EHLO
email.iomega.com") by vger.kernel.org with ESMTP id S267763AbUHPQa7
(ORCPT );
Mon, 16 Aug 2004 12:30:59 -0400
List-Id: linux-scsi@vger.kernel.org
To: Jens Axboe
Cc: linux-scsi@vger.kernel.org
Jens A:
2.4.26 and 2.4.27 strace of dd of=, mount -w, etc. chokes via EROFS for
USB DVD-RAM. 2.4.25 I have not tried.
This small patch substitutes the MMC op x5A "MODE SENSE (10)" for the op
x1A that in t10.org PDT x05 is vendor-specific. Such consideration
persuades a standard DVD-RAM drive to admit it rewrites DVD-RAM discs.
Revising the CDB alone of course does not suffice: we also have to step
past a different size of data in header.
Pat LaVarre
diff -urp linux-2.4.27/drivers/scsi/sr.c linux-2.4.27-pel/drivers/scsi/sr.c
--- linux-2.4.27/drivers/scsi/sr.c 2003-06-13 08:51:36.000000000 -0600
+++ linux-2.4.27-pel/drivers/scsi/sr.c 2004-08-16 10:08:37.000000000 -0600
@@ -691,7 +691,7 @@ void get_sectorsize(int i)
void get_capabilities(int i)
{
- unsigned char cmd[6];
+ unsigned char cmd[16];
unsigned char *buffer;
int rc, n;
@@ -713,12 +713,12 @@ void get_capabilities(int i)
printk(KERN_ERR "sr: out of memory.\n");
return;
}
- cmd[0] = MODE_SENSE;
+ memset(cmd, '\0', sizeof cmd);
+ cmd[0] = MODE_SENSE_10;
cmd[1] = (scsi_CDs[i].device->scsi_level <= SCSI_2) ?
((scsi_CDs[i].device->lun << 5) & 0xe0) : 0;
cmd[2] = 0x2a;
- cmd[4] = 128;
- cmd[3] = cmd[5] = 0;
+ cmd[8] = 128;
rc = sr_do_ioctl(i, cmd, buffer, 128, 1, SCSI_DATA_READ, NULL);
if (rc) {
@@ -731,7 +731,7 @@ void get_capabilities(int i)
printk("sr%i: scsi-1 drive\n", i);
return;
}
- n = buffer[3] + 4;
+ n = 8 + ((buffer[6] << 8) | buffer[7]); /* 8 = sizeof MODE_SENSE_10 header */
scsi_CDs[i].cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
scsi_CDs[i].readcd_known = 1;
scsi_CDs[i].readcd_cdda = buffer[n + 5] & 0x01;