From: Jens Axboe Update the ATAPI MO support code to reflect the reorganisations and cleanups which the Mt Ranier support patch added. DESC cdrom_open fix EDESC From: Jens Axboe --- drivers/cdrom/cdrom.c | 36 +++++++++++++++++++++++------------- drivers/ide/ide-cd.c | 7 +++---- drivers/ide/ide-cd.h | 2 +- 3 files changed, 27 insertions(+), 18 deletions(-) diff -puN drivers/cdrom/cdrom.c~atapi-mo-support-update drivers/cdrom/cdrom.c --- 25/drivers/cdrom/cdrom.c~atapi-mo-support-update 2004-01-07 20:39:44.000000000 -0800 +++ 25-akpm/drivers/cdrom/cdrom.c 2004-01-07 20:46:44.000000000 -0800 @@ -707,6 +707,11 @@ 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); + /* + * needs to really check whether media is writeable + */ + else if (CDROM_CAN(CDC_MO_DRIVE)) + ret = 0; return ret; } @@ -733,29 +738,34 @@ int cdrom_open(struct cdrom_device_info int ret; cdinfo(CD_OPEN, "entering cdrom_open\n"); - ret = -EROFS; - if (fp->f_mode & FMODE_WRITE) { - if (!(CDROM_CAN(CDC_RAM) || CDROM_CAN(CDC_MO_DRIVE))) - goto out; - if (cdrom_open_write(cdi)) - goto out; - } /* if this was a O_NONBLOCK open and we should honor the flags, * do a quick open without drive/disc integrity checks. */ - if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS)) + cdi->use_count++; + if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS)) { ret = cdi->ops->open(cdi, 1); - else + } else { + if (fp->f_mode & FMODE_WRITE) { + ret = -EROFS; + if (!CDROM_CAN(CDC_RAM)) + goto err; + if (cdrom_open_write(cdi)) + goto err; + } ret = open_for_data(cdi); + } - if (!ret) - cdi->use_count++; + if (ret) + goto err; - cdinfo(CD_OPEN, "Use count for \"/dev/%s\" now %d\n", cdi->name, cdi->use_count); + cdinfo(CD_OPEN, "Use count for \"/dev/%s\" now %d\n", + cdi->name, cdi->use_count); /* Do this on open. Don't wait for mount, because they might not be mounting, but opening with O_NONBLOCK */ check_disk_change(ip->i_bdev); -out: + return 0; +err: + cdi->use_count--; return ret; } diff -puN drivers/ide/ide-cd.c~atapi-mo-support-update drivers/ide/ide-cd.c --- 25/drivers/ide/ide-cd.c~atapi-mo-support-update 2004-01-07 20:39:44.000000000 -0800 +++ 25-akpm/drivers/ide/ide-cd.c 2004-01-07 20:39:44.000000000 -0800 @@ -790,7 +790,7 @@ static int cdrom_decode_status(ide_drive * devices will return this error while flushing * data from cache */ if (!rq->errors) - info->write_timeout = jiffies + ATAPI_WAIT_BUSY; + info->write_timeout = jiffies + ATAPI_WAIT_WRITE_BUSY; rq->errors = 1; if (time_after(jiffies, info->write_timeout)) do_end_request = 1; @@ -2950,6 +2950,7 @@ int ide_cdrom_probe_capabilities (ide_dr if (drive->media == ide_optical) { CDROM_CONFIG_FLAGS(drive)->mo_drive = 1; + CDROM_CONFIG_FLAGS(drive)->ram = 1; printk("%s: ATAPI magneto-optical drive\n", drive->name); return nslots; } @@ -3281,9 +3282,7 @@ int ide_cdrom_setup (ide_drive_t *drive) /* * set correct block size and read-only for non-ram media */ - set_disk_ro(drive->disk, - !(CDROM_CONFIG_FLAGS(drive)->ram || - CDROM_CONFIG_FLAGS(drive)->mo_drive)); + set_disk_ro(drive->disk, !CDROM_CONFIG_FLAGS(drive)->ram); blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE); #if 0 diff -puN drivers/ide/ide-cd.h~atapi-mo-support-update drivers/ide/ide-cd.h --- 25/drivers/ide/ide-cd.h~atapi-mo-support-update 2004-01-07 20:39:44.000000000 -0800 +++ 25-akpm/drivers/ide/ide-cd.h 2004-01-07 20:39:44.000000000 -0800 @@ -39,7 +39,7 @@ * typical timeout for packet command */ #define ATAPI_WAIT_PC (60 * HZ) -#define ATAPI_WAIT_BUSY (5 * HZ) +#define ATAPI_WAIT_WRITE_BUSY (10 * HZ) /************************************************************************/ _