From mboxrd@z Thu Jan 1 00:00:00 1970 From: Pat LaVarre Subject: Re: writable mmc profiles actually are writable Date: 10 Oct 2003 16:43:19 -0600 Sender: linux-scsi-owner@vger.kernel.org Message-ID: <1065825799.2867.38.camel@patehci2> References: <20031006182510.GG972@suse.de> <1065469831.5185.44.camel@patehci2> <20031006203816.GJ972@suse.de> <1065473899.6835.41.camel@patehci2> <1065478448.2361.1.camel@patehci2> <1065484607.2899.7.camel@patehci2> <20031007053858.GL972@suse.de> <20031006234543.A11937@one-eyed-alien.net> <20031007064829.GQ972@suse.de> <20031007000018.B11937@one-eyed-alien.net> <20031007070404.GU972@suse.de> <1065818209.7434.11.camel@patehci2> <1065819846.7434.35.camel@patehci2> <1065821134.7434.46.camel@patehci2> Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit Return-path: Received: from email-out2.iomega.com ([147.178.1.83]:13759 "EHLO email.iomega.com") by vger.kernel.org with ESMTP id S262732AbTJJWny (ORCPT ); Fri, 10 Oct 2003 18:43:54 -0400 In-Reply-To: <1065821134.7434.46.camel@patehci2> List-Id: linux-scsi@vger.kernel.org To: axboe@suse.de Cc: mdharm-scsi@one-eyed-alien.net, linux-scsi@vger.kernel.org May our review recommence! The patch here changes four source files. Please tell me if I have or I have not correctly patched as many as three of the four source files: include/linux/cdrom.h drivers/ide/ide-cd.c drivers/scsi/sr.c I'm confident I have not correctly patched the source file: drivers/cdrom/cdrom.c I plead for review by eye of this patch, but I do Not recommend applying this patch. As yet this patch erroneously makes all /dev/scd* writeable, just like the four-line patch that began this thread. Pat LaVarre diff -Nur linux-2.6.0-test7/include/linux/cdrom.h linux/include/linux/cdrom.h --- linux-2.6.0-test7/include/linux/cdrom.h 2003-10-08 13:24:00.000000000 -0600 +++ linux/include/linux/cdrom.h 2003-10-10 15:37:16.000000000 -0600 @@ -388,6 +388,7 @@ #define CDC_DVD_R 0x10000 /* drive can write DVD-R */ #define CDC_DVD_RAM 0x20000 /* drive can write DVD-RAM */ #define CDC_MO_DRIVE 0x40000 /* drive is an MO device */ +#define CDC_MMC_WR 0x80000 /* profile includes random write */ /* drive status possibilities returned by CDROM_DRIVE_STATUS ioctl */ #define CDS_NO_INFO 0 /* if not implemented */ diff -Nur linux-2.6.0-test7/drivers/ide/ide-cd.c linux/drivers/ide/ide-cd.c --- linux-2.6.0-test7/drivers/ide/ide-cd.c 2003-10-08 13:24:04.000000000 -0600 +++ linux/drivers/ide/ide-cd.c 2003-10-10 15:36:33.000000000 -0600 @@ -2822,7 +2822,7 @@ CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET | CDC_IOCTLS | CDC_DRIVE_STATUS | CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R| CDC_DVD_RAM | - CDC_GENERIC_PACKET | CDC_MO_DRIVE, + CDC_GENERIC_PACKET | CDC_MO_DRIVE | CDC_MMC_WR, .generic_packet = ide_cdrom_packet, }; @@ -2832,7 +2832,7 @@ struct cdrom_device_info *devinfo = &info->devinfo; devinfo->ops = &ide_cdrom_dops; - devinfo->mask = 0; + devinfo->mask = CDC_MMC_WR; devinfo->speed = CDROM_STATE_FLAGS(drive)->current_speed; devinfo->capacity = nslots; devinfo->handle = (void *) drive; diff -Nur linux-2.6.0-test7/drivers/scsi/sr.c linux/drivers/scsi/sr.c --- linux-2.6.0-test7/drivers/scsi/sr.c 2003-10-08 13:24:03.000000000 -0600 +++ linux/drivers/scsi/sr.c 2003-10-10 15:48:12.322686720 -0600 @@ -67,7 +67,8 @@ (CDC_CLOSE_TRAY|CDC_OPEN_TRAY|CDC_LOCK|CDC_SELECT_SPEED| \ CDC_SELECT_DISC|CDC_MULTI_SESSION|CDC_MCN|CDC_MEDIA_CHANGED| \ CDC_PLAY_AUDIO|CDC_RESET|CDC_IOCTLS|CDC_DRIVE_STATUS| \ - CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET) + CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \ + CDC_MMC_WR) static int sr_probe(struct device *); static int sr_remove(struct device *); @@ -327,8 +328,12 @@ } if (rq_data_dir(SCpnt->request) == WRITE) { - if (!cd->device->writeable) - return 0; + if (!cd->device->writeable) { + if ((cd->cdi.mask & CDC_MMC_WR) != 0) { + return 0; + } + cd->device->writeable = 1; + } SCpnt->cmnd[0] = WRITE_10; SCpnt->sc_data_direction = SCSI_DATA_WRITE; } else if (rq_data_dir(SCpnt->request) == READ) { @@ -550,7 +555,7 @@ cd->cdi.ops = &sr_dops; cd->cdi.handle = cd; - cd->cdi.mask = 0; + cd->cdi.mask = CDC_MMC_WR; cd->cdi.capacity = 1; sprintf(cd->cdi.name, "sr%d", minor); diff -Nur linux-2.6.0-test7/drivers/cdrom/cdrom.c linux/drivers/cdrom/cdrom.c --- linux-2.6.0-test7/drivers/cdrom/cdrom.c 2003-10-08 13:24:02.000000000 -0600 +++ linux/drivers/cdrom/cdrom.c 2003-10-10 15:45:59.648856208 -0600 @@ -408,6 +408,24 @@ return 0; } +/* Say if profile includes random write or not. + */ +static int cdrom_cdc_mmc_wr(struct cdrom_device_info *cdi) +{ + printk(KERN_INFO "cdrom_cdc_mmc_wr\n"); + if (CDROM_CAN(CDC_DVD_RAM)) { + return 1; + } +#if 0 /* FIXME */ +#error "try op x5A GPCMD_MODE_SENSE_10 of page x2A GPMODE_CAPABILITIES_PAGE" +#error "return 0 if failed" +#error "try op x46 GPGPCMD_GET_CONFIGURATION" +#error "return 0 if failed" +#error "return 0 if not random writable profile" +#endif + return 1; +} + /* We use the open-option O_NONBLOCK to indicate that the * purpose of opening is only for subsequent ioctl() calls; no device * integrity checks are performed. @@ -426,8 +444,12 @@ if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS)) ret = cdi->ops->open(cdi, 1); else { - if ((fp->f_mode & FMODE_WRITE) && !CDROM_CAN(CDC_DVD_RAM)) - return -EROFS; + if ((fp->f_mode & FMODE_WRITE) && !CDROM_CAN(CDC_MMC_WR)) { + if (!cdrom_cdc_mmc_wr(cdi)) { + return -EROFS; + } + cdi->mask &= ~CDC_MMC_WR; + } ret = open_for_data(cdi); } @@ -2406,6 +2428,10 @@ for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_RAM) != 0); + pos += sprintf(info+pos, "\nTolerates random write:"); + for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MMC_WR) != 0); + strcpy(info+pos,"\n\n"); return proc_dostring(ctl, write, filp, buffer, lenp);