public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
@ 2004-03-08 18:07 John McKell
  2004-03-08 19:20 ` Jens Axboe
  0 siblings, 1 reply; 9+ messages in thread
From: John McKell @ 2004-03-08 18:07 UTC (permalink / raw)
  To: Jens Axboe; +Cc: Pat LaVarre, linux-scsi

Jens,

All of this discussion has left me a bit confused:

On Sunday, March 7, 2004, Jens Axboe wrote:
> On Sat, Mar 06 2004, Pat LaVarre wrote:
> > > queued it for 2.6.4-pre
> >
> > Absent from 2.6.4-rc2, I think.
>  
> Will most likely have to wait for 2.6.5-pre/rc

What is the best indicator that I can use to monitor and know when a given 
patch is to be inserted into the kernel?  I monitor kernel.org at least 
once a day, if not more, but I hope that there would be something a bit 
more informative.  If checking kernel.org frequently is the only way, then 
I can deal with that.

---John


^ permalink raw reply	[flat|nested] 9+ messages in thread
* Re: [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
@ 2004-03-15 23:16 John McKell
  2004-03-16  8:43 ` Jens Axboe
  0 siblings, 1 reply; 9+ messages in thread
From: John McKell @ 2004-03-15 23:16 UTC (permalink / raw)
  To: Jens Axboe; +Cc: Pat LaVarre, linux-scsi

On Sun, Mar 07 2004, Jens Axboe wrote:
> Will most likely have to wait for 2.6.5-pre/rc
...
> Feel free to resend.
Unfortunately, I can't quite decide if you are suggesting that the 
question be rephrased, or that the patch be resent.  Being so new to 
kernel development, I am still unsure of all the steps that I must 
follow.  Am I to continue to provide patches for subsequent versions 
of the linux kernel until it is accepted?  I kind of doubt it, but 
just in case, I am supplying a new version of this patch for lk 2.6.4. 
I'd rather look foolish than uncooperative.  This version does have the 
comment changes that Pat L. requested.

diff -Nurp linux-2.6.4/include/linux/cdrom.h linux/include/linux/cdrom.h
-- linux-2.6.4/include/linux/cdrom.h	2004-03-15 11:50:41.000000000 -0700
+++ linux/include/linux/cdrom.h	2004-03-15 12:58:19.378649012 -0700
@@ -722,7 +722,9 @@ struct request_sense {
 /*
  * feature profile
  */
-#define CDF_MRW		0x28
+#define CDF_RWRT	0x0020	/* "Random Writable" */
+#define CDF_HWDM	0x0024	/* "Hardware Defect Management" */
+#define CDF_MRW 	0x0028
 
 /*
  * media status bits
@@ -771,6 +773,34 @@ struct mrw_feature_desc {
 	__u8 reserved5;
 };
 
+/* cf. mmc4r02g.pdf 5.3.10 Random Writable Feature (0020h) pg 197 of 635 */
+struct rwrt_feature_desc {
+	__u16 feature_code;
+#if defined(__BIG_ENDIAN_BITFIELD)
+	__u8 reserved1		: 2;
+	__u8 feature_version	: 4;
+	__u8 persistent		: 1;
+	__u8 curr		: 1;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+	__u8 curr		: 1;
+	__u8 persistent		: 1;
+	__u8 feature_version	: 4;
+	__u8 reserved1		: 2;
+#endif
+	__u8 add_len;
+	__u32 last_lba;
+	__u32 block_size;
+	__u16 blocking;
+#if defined(__BIG_ENDIAN_BITFIELD)
+	__u8 reserved2		: 7;
+	__u8 page_present	: 1;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+	__u8 page_present	: 1;
+	__u8 reserved2		: 7;
+#endif
+	__u8 reserved3;
+};
+
 typedef struct {
 	__u16 disc_information_length;
 #if defined(__BIG_ENDIAN_BITFIELD)
@@ -1130,6 +1160,7 @@ struct media_event_desc {
 
 extern int cdrom_get_media_event(struct cdrom_device_info *cdi, struct media_event_desc *med);
 extern int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write);
+extern int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write);
 
 #endif  /* End of kernel only stuff */ 
 
diff -Nurp linux-2.6.4/drivers/ide/ide-cd.c linux/drivers/ide/ide-cd.c
-- linux-2.6.4/drivers/ide/ide-cd.c	2004-03-15 12:06:52.000000000 -0700
+++ linux/drivers/ide/ide-cd.c	2004-03-15 12:40:01.325968601 -0700
@@ -2930,6 +2930,8 @@ static int ide_cdrom_register (ide_drive
 		devinfo->mask |= CDC_MRW;
 	if (!CDROM_CONFIG_FLAGS(drive)->mrw_w)
 		devinfo->mask |= CDC_MRW_W;
+	if (!CDROM_CONFIG_FLAGS(drive)->ram)
+		devinfo->mask |= CDC_RAM;
 
 	return register_cdrom(devinfo);
 }
@@ -2965,7 +2967,7 @@ int ide_cdrom_probe_capabilities (ide_dr
 	struct cdrom_info *info = drive->driver_data;
 	struct cdrom_device_info *cdi = &info->devinfo;
 	struct atapi_capabilities_page cap;
-	int nslots = 1, mrw_write = 0;
+	int nslots = 1, mrw_write = 0, ram_write = 0;
 
 	if (drive->media == ide_optical) {
 		CDROM_CONFIG_FLAGS(drive)->mo_drive = 1;
@@ -3001,6 +3003,9 @@ int ide_cdrom_probe_capabilities (ide_dr
 			CDROM_CONFIG_FLAGS(drive)->ram = 1;
 		}
 	}
+	if (!cdrom_is_random_writable(cdi, &ram_write))
+		if (ram_write)
+			CDROM_CONFIG_FLAGS(drive)->ram = 1;
 
 	if (cap.lock == 0)
 		CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
diff -Nurp linux-2.6.4/drivers/scsi/sr.c linux/drivers/scsi/sr.c
-- linux-2.6.4/drivers/scsi/sr.c	2004-03-15 12:07:49.000000000 -0700
+++ linux/drivers/scsi/sr.c	2004-03-15 12:43:21.394889022 -0700
@@ -695,7 +695,7 @@ Enomem:
 static void get_capabilities(struct scsi_cd *cd)
 {
 	unsigned char *buffer;
-	int rc, n, mrw_write = 0, mrw = 1;
+	int rc, n, mrw_write = 0, mrw = 1,ram_write=0;
 	struct scsi_mode_data data;
 	struct scsi_request *SRpnt;
 	unsigned char cmd[MAX_COMMAND_SIZE];
@@ -780,6 +780,11 @@ static void get_capabilities(struct scsi
 	if (!mrw_write)
 		cd->cdi.mask |= CDC_MRW_W;
 
+	if (cdrom_is_random_writable(&cd->cdi, &ram_write))
+		cd->cdi.mask |= CDC_RAM;
+	if (!ram_write)
+		cd->cdi.mask |= CDC_RAM;
+
 	n = data.header_length + data.block_descriptor_length;
 	cd->cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
 	cd->readcd_known = 1;
@@ -829,8 +834,8 @@ static void get_capabilities(struct scsi
 	/*
 	 * if DVD-RAM of MRW-W, we are randomly writeable
 	 */
-	if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W)) !=
-			(CDC_DVD_RAM | CDC_MRW_W)) {
+	if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM)) !=
+			(CDC_DVD_RAM | CDC_MRW_W | CDC_RAM)) {
 		cd->device->writeable = 1;
 		set_disk_ro(cd->disk, 0);
 	}
diff -Nurp linux-2.6.4/drivers/cdrom/cdrom.c linux/drivers/cdrom/cdrom.c
-- linux-2.6.4/drivers/cdrom/cdrom.c	2004-03-15 11:50:36.000000000 -0700
+++ linux/drivers/cdrom/cdrom.c	2004-03-15 12:45:20.512684582 -0700
@@ -641,6 +641,80 @@ static int cdrom_mrw_set_lba_space(struc
 	return 0;
 }
 
+int cdrom_get_random_writable(struct cdrom_device_info *cdi,
+			      struct rwrt_feature_desc *rfd)
+{
+	struct cdrom_generic_command cgc;
+	char buffer[24];
+	struct feature_header *fh;
+	int ret;
+
+	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+
+	cgc.cmd[0] = GPCMD_GET_CONFIGURATION;	/* often 0x46 */
+	cgc.cmd[3] = CDF_RWRT;			/* often 0x0020 */
+	cgc.cmd[8] = sizeof(buffer);		/* often 0x18 */
+	cgc.quiet = 1;
+
+	if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
+		return ret;
+
+	fh = (struct feature_header *)&buffer[0];
+	if (be32_to_cpu(fh->data_len) >= (sizeof(struct feature_header)+
+					  sizeof(struct rwrt_feature_desc)))
+		memcpy(rfd, &buffer[sizeof(struct feature_header)],
+		       sizeof (*rfd));
+	else
+		memset(rfd, 0, sizeof(*rfd));
+
+	return 0;
+}
+
+int cdrom_has_defect_mgt(struct cdrom_device_info *cdi)
+{
+	struct cdrom_generic_command cgc;
+	char buffer[16];
+	struct feature_header *fh;
+	__u16 *feature_code;
+	int ret;
+
+	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+
+	cgc.cmd[0] = GPCMD_GET_CONFIGURATION;	/* often 0x46 */
+	cgc.cmd[3] = CDF_HWDM;			/* often 0x0024 */
+	cgc.cmd[8] = sizeof(buffer);		/* often 0x10 */
+	cgc.quiet = 1;
+
+	if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
+		return ret;
+
+	fh = (struct feature_header *)&buffer[0];
+	ret = 1;
+	if (be32_to_cpu(fh->data_len) >= (sizeof(struct feature_header)+8)) {
+		feature_code = (__u16 *)&buffer[sizeof(struct feature_header)];
+		if (CDF_HWDM == be16_to_cpu(*feature_code))
+			ret = 0;
+	}
+	return ret;
+}
+
+
+int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write)
+{
+	struct rwrt_feature_desc rfd;
+	int ret;
+
+	*write = 0;
+
+	if ((ret = cdrom_get_random_writable(cdi, &rfd)))
+		return ret;
+
+	if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
+		*write = 1;
+
+	return 0;
+}
+
 static int cdrom_media_erasable(struct cdrom_device_info *cdi)
 {
 	disc_information di;
@@ -724,6 +798,23 @@ static int mo_open_write(struct cdrom_de
 	return buffer[3] & 0x80;
 }
 
+static int cdrom_ram_open_write(struct cdrom_device_info *cdi)
+{
+	struct rwrt_feature_desc rfd;
+	int ret;
+
+	if ((ret = cdrom_has_defect_mgt(cdi)))
+		return ret;
+	else
+		if ((ret = cdrom_get_random_writable(cdi, &rfd)))
+			return ret;
+		else if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
+			ret = !rfd.curr;
+
+	cdinfo(CD_OPEN, "can open for random write\n");
+	return ret;
+}
+
 /*
  * returns 0 for ok to open write, non-0 to disallow
  */
@@ -735,6 +826,9 @@ static int cdrom_open_write(struct cdrom
 		ret = cdrom_mrw_open_write(cdi);
 	else if (CDROM_CAN(CDC_DVD_RAM))
 		ret = cdrom_dvdram_open_write(cdi);
+ 	else if (CDROM_CAN(CDC_RAM) &&
+ 		 !CDROM_CAN(CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_MRW))
+ 		ret = cdrom_ram_open_write(cdi);
 	else if (CDROM_CAN(CDC_MO_DRIVE))
 		ret = mo_open_write(cdi);
 
@@ -2670,6 +2764,7 @@ EXPORT_SYMBOL(cdrom_mode_sense);
 EXPORT_SYMBOL(init_cdrom_command);
 EXPORT_SYMBOL(cdrom_get_media_event);
 EXPORT_SYMBOL(cdrom_is_mrw);
+EXPORT_SYMBOL(cdrom_is_random_writable);
 
 #ifdef CONFIG_SYSCTL
 
@@ -2774,6 +2869,10 @@ int cdrom_sysctl_info(ctl_table *ctl, in
 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MRW_W) != 0);
 
+	pos += sprintf(info+pos, "\nCan write RAM:\t");
+	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
+	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_RAM) != 0);
+
 	strcpy(info+pos,"\n\n");
 		
         return proc_dostring(ctl, write, filp, buffer, lenp);

 



^ permalink raw reply	[flat|nested] 9+ messages in thread
* Re: [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
@ 2004-03-06 17:16 Pat LaVarre
  2004-03-07 11:45 ` Jens Axboe
  0 siblings, 1 reply; 9+ messages in thread
From: Pat LaVarre @ 2004-03-06 17:16 UTC (permalink / raw)
  To: mckellj; +Cc: linux-scsi

> queued it for 2.6.4-pre

Absent from 2.6.4-rc2, I think.

Perhaps if I knew what -pre meant that would be no surprise to me.

http://marc.theaimsgroup.com/?l=linux-scsi&s=random+write+pdt+5
does not yet enlighten me further, but I observe lk refusing to let Me
write:

$ uname -msrv
Linux 2.6.4-rc2 #1 SMP Sat Mar 6 09:58:43 MST 2004 i686
$
$ grep CDF_ include/linux/cdrom.h
#define CDF_MRW         0x28
$ grep -i HWDM include/linux/cdrom.h
$
$ sudo rrd scan
/dev/scd0 is Iomega RRD 06.3 rw
/dev/hdc is Iomega RRD 06.3 rw
$
$ sudo dd of=/dev/null if=/dev/scd0 bs=64K seek=0 skip=0 count=1
1+0 records in
1+0 records out
$ sudo dd of=/dev/null if=/dev/hdc bs=64K seek=0 skip=0 count=1
1+0 records in
1+0 records out
$
$ sudo dd of=/dev/scd0 if=/dev/zero bs=64K seek=0 skip=0 count=1
dd: opening `/dev/scd0': Read-only file system
$ sudo dd of=/dev/hdc if=/dev/zero bs=64K seek=0 skip=0 count=1
dd: opening `/dev/hdc': Read-only file system
$

Pat LaVarre



^ permalink raw reply	[flat|nested] 9+ messages in thread
* [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
@ 2004-02-12 19:00 John McKell
  2004-02-13 16:07 ` Jens Axboe
  0 siblings, 1 reply; 9+ messages in thread
From: John McKell @ 2004-02-12 19:00 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-scsi

Jens,

The patch submitted recently: 
Subject:[PATCH]Allow random write for PDT 5 profile 2 Removable Disk
http://marc.theaimsgroup.com/?l=linux-scsi&m=107653753500466&w=2
was a composite patch.  This corrects that (as well as a few other 
small issues).  Thanks for the help.

---John McKell

diff -Nurp linux-2.6.2-fix/include/linux/cdrom.h linux/include/linux/cdrom.h
--- linux-2.6.2-fix/include/linux/cdrom.h	2004-02-03 20:43:06.000000000 -0700
+++ linux/include/linux/cdrom.h	2004-02-12 09:18:19.000000000 -0700
@@ -721,7 +721,9 @@ struct request_sense {
 /*
  * feature profile
  */
-#define CDF_MRW		0x28
+#define CDF_RWRT	0x0020
+#define CDF_HWDM	0x0024
+#define CDF_MRW 	0x0028
 
 /*
  * media status bits
@@ -770,6 +772,34 @@ struct mrw_feature_desc {
 	__u8 reserved5;
 };
 
+/* cf. mmc4r02g.pdf 5.3.10 Random Writable Feature (0020h) pg 197 of 635 */
+struct rwrt_feature_desc {
+	__u16 feature_code;
+#if defined(__BIG_ENDIAN_BITFIELD)
+	__u8 reserved1		: 2;
+	__u8 feature_version	: 4;
+	__u8 persistent		: 1;
+	__u8 curr		: 1;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+	__u8 curr		: 1;
+	__u8 persistent		: 1;
+	__u8 feature_version	: 4;
+	__u8 reserved1		: 2;
+#endif
+	__u8 add_len;
+	__u32 last_lba;
+	__u32 block_size;
+	__u16 blocking;
+#if defined(__BIG_ENDIAN_BITFIELD)
+	__u8 reserved2		: 7;
+	__u8 page_present	: 1;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+	__u8 page_present	: 1;
+	__u8 reserved2		: 7;
+#endif
+	__u8 reserved3;
+};
+
 typedef struct {
 	__u16 disc_information_length;
 #if defined(__BIG_ENDIAN_BITFIELD)
@@ -1129,6 +1159,7 @@ struct media_event_desc {
 
 extern int cdrom_get_media_event(struct cdrom_device_info *cdi, struct media_event_desc *med);
 extern int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write);
+extern int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write);
 
 #endif  /* End of kernel only stuff */ 
 
diff -Nurp linux-2.6.2-fix/drivers/ide/ide-cd.c linux/drivers/ide/ide-cd.c
--- linux-2.6.2-fix/drivers/ide/ide-cd.c	2004-02-03 20:43:44.000000000 -0700
+++ linux/drivers/ide/ide-cd.c	2004-02-12 09:29:04.000000000 -0700
@@ -2911,6 +2911,8 @@ static int ide_cdrom_register (ide_drive
 		devinfo->mask |= CDC_MRW;
 	if (!CDROM_CONFIG_FLAGS(drive)->mrw_w)
 		devinfo->mask |= CDC_MRW_W;
+	if (!CDROM_CONFIG_FLAGS(drive)->ram)
+		devinfo->mask |= CDC_RAM;
 
 	return register_cdrom(devinfo);
 }
@@ -2946,7 +2948,7 @@ int ide_cdrom_probe_capabilities (ide_dr
 	struct cdrom_info *info = drive->driver_data;
 	struct cdrom_device_info *cdi = &info->devinfo;
 	struct atapi_capabilities_page cap;
-	int nslots = 1, mrw_write = 0;
+	int nslots = 1, mrw_write = 0, ram_write = 0;
 
 	if (drive->media == ide_optical) {
 		CDROM_CONFIG_FLAGS(drive)->mo_drive = 1;
@@ -2982,6 +2984,9 @@ int ide_cdrom_probe_capabilities (ide_dr
 			CDROM_CONFIG_FLAGS(drive)->ram = 1;
 		}
 	}
+	if (!cdrom_is_random_writable(cdi, &ram_write))
+		if (ram_write)
+			CDROM_CONFIG_FLAGS(drive)->ram = 1;
 
 	if (cap.lock == 0)
 		CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
diff -Nurp linux-2.6.2-fix/drivers/scsi/sr.c linux/drivers/scsi/sr.c
--- linux-2.6.2-fix/drivers/scsi/sr.c	2004-02-09 13:59:10.000000000 -0700
+++ linux/drivers/scsi/sr.c	2004-02-12 09:25:57.000000000 -0700
@@ -693,7 +693,7 @@ Enomem:
 static void get_capabilities(struct scsi_cd *cd)
 {
 	unsigned char *buffer;
-	int rc, n, mrw_write = 0, mrw = 1;
+	int rc, n, mrw_write = 0, mrw = 1,ram_write=0;
 	struct scsi_mode_data data;
 	struct scsi_request *SRpnt;
 	unsigned char cmd[MAX_COMMAND_SIZE];
@@ -775,6 +775,11 @@ static void get_capabilities(struct scsi
 	if (!mrw_write)
 		cd->cdi.mask |= CDC_MRW_W;
 
+	if (cdrom_is_random_writable(&cd->cdi, &ram_write))
+		cd->cdi.mask |= CDC_RAM;
+	if (!ram_write)
+		cd->cdi.mask |= CDC_RAM;
+
 	n = data.header_length + data.block_descriptor_length;
 	cd->cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
 	cd->readcd_known = 1;
@@ -824,7 +829,8 @@ static void get_capabilities(struct scsi
 	/*
 	 * if DVD-RAM of MRW-W, we are randomly writeable
 	 */
-	if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W)) != (CDC_DVD_RAM | CDC_MRW_W))
+	if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM)) !=
+	    (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM))
 		cd->device->writeable = 1;
 
 	scsi_release_request(SRpnt);
diff -Nurp linux-2.6.2-fix/drivers/cdrom/cdrom.c linux/drivers/cdrom/cdrom.c
--- linux-2.6.2-fix/drivers/cdrom/cdrom.c	2004-02-09 13:58:21.000000000 -0700
+++ linux/drivers/cdrom/cdrom.c	2004-02-12 10:20:38.000000000 -0700
@@ -641,6 +641,80 @@ static int cdrom_mrw_set_lba_space(struc
 	return 0;
 }
 
+int cdrom_get_random_writable(struct cdrom_device_info *cdi,
+			      struct rwrt_feature_desc *rfd)
+{
+	struct cdrom_generic_command cgc;
+	char buffer[24];
+	struct feature_header *fh;
+	int ret;
+
+	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+
+	cgc.cmd[0] = GPCMD_GET_CONFIGURATION;	/* often 0x46 */
+	cgc.cmd[3] = CDF_RWRT;			/* often 0x0020 */
+	cgc.cmd[8] = sizeof(buffer);		/* often 0x18 */
+	cgc.quiet = 1;
+
+	if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
+		return ret;
+
+	fh = (struct feature_header *)&buffer[0];
+	if (be32_to_cpu(fh->data_len) >= (sizeof(struct feature_header)+
+					  sizeof(struct rwrt_feature_desc)))
+		memcpy(rfd, &buffer[sizeof(struct feature_header)],
+		       sizeof (*rfd));
+	else
+		memset(rfd, 0, sizeof(*rfd));
+
+	return 0;
+}
+
+int cdrom_has_defect_mgt(struct cdrom_device_info *cdi)
+{
+	struct cdrom_generic_command cgc;
+	char buffer[16];
+	struct feature_header *fh;
+	__u16 *feature_code;
+	int ret;
+
+	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+
+	cgc.cmd[0] = GPCMD_GET_CONFIGURATION;	/* often 0x46 */
+	cgc.cmd[3] = CDF_HWDM;			/* often 0x0024 */
+	cgc.cmd[8] = sizeof(buffer);		/* often 0x10 */
+	cgc.quiet = 1;
+
+	if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
+		return ret;
+
+	fh = (struct feature_header *)&buffer[0];
+	ret = 1;
+	if (be32_to_cpu(fh->data_len) >= (sizeof(struct feature_header)+8)) {
+		feature_code = (__u16 *)&buffer[sizeof(struct feature_header)];
+		if (CDF_HWDM == be16_to_cpu(*feature_code))
+			ret = 0;
+	}
+	return ret;
+}
+
+
+int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write)
+{
+	struct rwrt_feature_desc rfd;
+	int ret;
+
+	*write = 0;
+
+	if ((ret = cdrom_get_random_writable(cdi, &rfd)))
+		return ret;
+
+	if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
+		*write = 1;
+
+	return 0;
+}
+
 static int cdrom_media_erasable(struct cdrom_device_info *cdi)
 {
 	disc_information di;
@@ -695,6 +769,23 @@ static int cdrom_mrw_open_write(struct c
 	return ret;
 }
 
+static int cdrom_ram_open_write(struct cdrom_device_info *cdi)
+{
+	struct rwrt_feature_desc rfd;
+	int ret;
+
+	if ((ret = cdrom_has_defect_mgt(cdi)))
+		return ret;
+	else
+		if ((ret = cdrom_get_random_writable(cdi, &rfd)))
+			return ret;
+		else if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
+			ret = !rfd.curr;
+
+	cdinfo(CD_OPEN, "can open for random write\n");
+	return ret;
+}
+
 /*
  * returns 0 for ok to open write, non-0 to disallow
  */
@@ -706,6 +797,9 @@ static int cdrom_open_write(struct cdrom
 		ret = cdrom_mrw_open_write(cdi);
 	else if (CDROM_CAN(CDC_DVD_RAM))
 		ret = cdrom_dvdram_open_write(cdi);
+	else if (CDROM_CAN(CDC_RAM) &&
+		 !CDROM_CAN(CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_MRW))
+		ret = cdrom_ram_open_write(cdi);
 	/*
 	 * needs to really check whether media is writeable
 	 */
@@ -2644,6 +2738,7 @@ EXPORT_SYMBOL(cdrom_mode_sense);
 EXPORT_SYMBOL(init_cdrom_command);
 EXPORT_SYMBOL(cdrom_get_media_event);
 EXPORT_SYMBOL(cdrom_is_mrw);
+EXPORT_SYMBOL(cdrom_is_random_writable);
 
 #ifdef CONFIG_SYSCTL
 
@@ -2748,6 +2843,10 @@ int cdrom_sysctl_info(ctl_table *ctl, in
 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MRW_W) != 0);
 
+	pos += sprintf(info+pos, "\nCan write RAM:\t");
+	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
+	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_RAM) != 0);
+
 	strcpy(info+pos,"\n\n");
 		
         return proc_dostring(ctl, write, filp, buffer, lenp);




^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2004-03-16  9:35 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-03-08 18:07 [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk John McKell
2004-03-08 19:20 ` Jens Axboe
2004-03-08 20:01   ` [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removabl e Disk Pat LaVarre
  -- strict thread matches above, loose matches on Subject: below --
2004-03-15 23:16 [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk John McKell
2004-03-16  8:43 ` Jens Axboe
2004-03-06 17:16 Pat LaVarre
2004-03-07 11:45 ` Jens Axboe
2004-02-12 19:00 John McKell
2004-02-13 16:07 ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox