From: Jens Axboe <axboe@suse.de>

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 <axboe@suse.de>




---

 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)
 
 /************************************************************************/
 

_