drivers/block/paride/pcd.c |    2 +-
 drivers/cdrom/cdrom.c      |   27 ++++++++++++++-------------
 drivers/cdrom/cdu31a.c     |    2 +-
 drivers/cdrom/cm206.c      |    2 +-
 drivers/cdrom/mcd.c        |    2 +-
 drivers/cdrom/mcdx.c       |    2 +-
 drivers/cdrom/sbpcd.c      |    2 +-
 drivers/ide/ide-cd.c       |    2 +-
 drivers/scsi/sr.c          |    2 +-
 include/linux/cdrom.h      |    3 ++-
 10 files changed, 24 insertions(+), 22 deletions(-)

diff -puN drivers/block/paride/pcd.c~RD5-cdrom_release-B6 drivers/block/paride/pcd.c
--- 25/drivers/block/paride/pcd.c~RD5-cdrom_release-B6	2003-11-18 22:15:13.000000000 -0800
+++ 25-akpm/drivers/block/paride/pcd.c	2003-11-18 22:15:13.000000000 -0800
@@ -252,7 +252,7 @@ static int pcd_block_open(struct block_d
 static int pcd_block_release(struct inode *inode, struct file *file)
 {
 	struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data;
-	return cdrom_release(&cd->info, file);
+	return cdrom_release(&cd->info);
 }
 
 static int pcd_block_ioctl(struct block_device *bdev, struct file *file,
diff -puN drivers/cdrom/cdrom.c~RD5-cdrom_release-B6 drivers/cdrom/cdrom.c
--- 25/drivers/cdrom/cdrom.c~RD5-cdrom_release-B6	2003-11-18 22:15:13.000000000 -0800
+++ 25-akpm/drivers/cdrom/cdrom.c	2003-11-18 22:15:13.000000000 -0800
@@ -367,6 +367,7 @@ int register_cdrom(struct cdrom_device_i
 	ENSURE(generic_packet, CDC_GENERIC_PACKET);
 	cdi->mc_flags = 0;
 	cdo->n_minors = 0;
+	cdi->for_data = 0;
         cdi->options = CDO_USE_FFLAGS;
 	
 	if (autoclose==1 && CDROM_CAN(CDC_CLOSE_TRAY))
@@ -530,6 +531,7 @@ int open_for_data(struct cdrom_device_in
 			cdinfo(CD_OPEN, "door locked.\n");
 	}
 	cdinfo(CD_OPEN, "device opened successfully.\n"); 
+	cdi->for_data = 1;
 	return ret;
 
 	/* Something failed.  Try to unlock the drive, because some drivers
@@ -605,30 +607,29 @@ int check_for_audio_disc(struct cdrom_de
 
 
 /* Admittedly, the logic below could be performed in a nicer way. */
-int cdrom_release(struct cdrom_device_info *cdi, struct file *fp)
+int cdrom_release(struct cdrom_device_info *cdi)
 {
 	struct cdrom_device_ops *cdo = cdi->ops;
-	int opened_for_data;
 
 	cdinfo(CD_CLOSE, "entering cdrom_release\n"); 
 
 	if (cdi->use_count > 0)
 		cdi->use_count--;
-	if (cdi->use_count == 0)
-		cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name);
-	if (cdi->use_count == 0 &&
-	    cdo->capability & CDC_LOCK && !keeplocked) {
+	if (cdi->use_count) {
+		cdo->release(cdi);
+		return 0;
+	}
+
+	cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name);
+	if (cdo->capability & CDC_LOCK && !keeplocked) {
 		cdinfo(CD_CLOSE, "Unlocking door!\n");
 		cdo->lock_door(cdi, 0);
 	}
-	opened_for_data = !(cdi->options & CDO_USE_FFLAGS) ||
-		!(fp && fp->f_flags & O_NONBLOCK);
 	cdo->release(cdi);
-	if (cdi->use_count == 0) {      /* last process that closes dev*/
-		if (opened_for_data &&
-		    cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
-			cdo->tray_move(cdi, 1);
-	}
+	if (cdi->for_data &&
+	    cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
+		cdo->tray_move(cdi, 1);
+	cdi->for_data = 0;
 	return 0;
 }
 
diff -puN drivers/cdrom/cdu31a.c~RD5-cdrom_release-B6 drivers/cdrom/cdu31a.c
--- 25/drivers/cdrom/cdu31a.c~RD5-cdrom_release-B6	2003-11-18 22:15:13.000000000 -0800
+++ 25-akpm/drivers/cdrom/cdu31a.c	2003-11-18 22:15:13.000000000 -0800
@@ -3174,7 +3174,7 @@ static int scd_block_open(struct block_d
 
 static int scd_block_release(struct inode *inode, struct file *file)
 {
-	return cdrom_release(&scd_info, file);
+	return cdrom_release(&scd_info);
 }
 
 static int scd_block_ioctl(struct block_device *bdev, struct file *file,
diff -puN drivers/cdrom/cm206.c~RD5-cdrom_release-B6 drivers/cdrom/cm206.c
--- 25/drivers/cdrom/cm206.c~RD5-cdrom_release-B6	2003-11-18 22:15:13.000000000 -0800
+++ 25-akpm/drivers/cdrom/cm206.c	2003-11-18 22:15:13.000000000 -0800
@@ -1357,7 +1357,7 @@ static int cm206_block_open(struct block
 
 static int cm206_block_release(struct inode *inode, struct file *file)
 {
-	return cdrom_release(&cm206_info, file);
+	return cdrom_release(&cm206_info);
 }
 
 static int cm206_block_ioctl(struct block_device *bdev, struct file *file,
diff -puN drivers/cdrom/mcd.c~RD5-cdrom_release-B6 drivers/cdrom/mcd.c
--- 25/drivers/cdrom/mcd.c~RD5-cdrom_release-B6	2003-11-18 22:15:13.000000000 -0800
+++ 25-akpm/drivers/cdrom/mcd.c	2003-11-18 22:15:13.000000000 -0800
@@ -221,7 +221,7 @@ static int mcd_block_open(struct block_d
 
 static int mcd_block_release(struct inode *inode, struct file *file)
 {
-	return cdrom_release(&mcd_info, file);
+	return cdrom_release(&mcd_info);
 }
 
 static int mcd_block_ioctl(struct block_device *bdev, struct file *file,
diff -puN drivers/cdrom/mcdx.c~RD5-cdrom_release-B6 drivers/cdrom/mcdx.c
--- 25/drivers/cdrom/mcdx.c~RD5-cdrom_release-B6	2003-11-18 22:15:13.000000000 -0800
+++ 25-akpm/drivers/cdrom/mcdx.c	2003-11-18 22:15:13.000000000 -0800
@@ -230,7 +230,7 @@ static int mcdx_block_open(struct block_
 static int mcdx_block_release(struct inode *inode, struct file *file)
 {
 	struct s_drive_stuff *p = inode->i_bdev->bd_disk->private_data;
-	return cdrom_release(&p->info, file);
+	return cdrom_release(&p->info);
 }
 
 static int mcdx_block_ioctl(struct block_device *bdev, struct file *file,
diff -puN drivers/cdrom/sbpcd.c~RD5-cdrom_release-B6 drivers/cdrom/sbpcd.c
--- 25/drivers/cdrom/sbpcd.c~RD5-cdrom_release-B6	2003-11-18 22:15:13.000000000 -0800
+++ 25-akpm/drivers/cdrom/sbpcd.c	2003-11-18 22:15:13.000000000 -0800
@@ -5365,7 +5365,7 @@ static int sbpcd_block_open(struct block
 static int sbpcd_block_release(struct inode *inode, struct file *file)
 {
 	struct sbpcd_drive *p = inode->i_bdev->bd_disk->private_data;
-	return cdrom_release(p->sbpcd_infop, file);
+	return cdrom_release(p->sbpcd_infop);
 }
 
 static int sbpcd_block_ioctl(struct block_device *bdev, struct file *file,
diff -puN drivers/ide/ide-cd.c~RD5-cdrom_release-B6 drivers/ide/ide-cd.c
--- 25/drivers/ide/ide-cd.c~RD5-cdrom_release-B6	2003-11-18 22:15:13.000000000 -0800
+++ 25-akpm/drivers/ide/ide-cd.c	2003-11-18 22:15:13.000000000 -0800
@@ -3350,7 +3350,7 @@ static int idecd_release(struct inode * 
 	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
 	struct cdrom_info *info = drive->driver_data;
 
-	cdrom_release (&info->devinfo, file);
+	cdrom_release(&info->devinfo);
 	drive->usage--;
 	return 0;
 }
diff -puN drivers/scsi/sr.c~RD5-cdrom_release-B6 drivers/scsi/sr.c
--- 25/drivers/scsi/sr.c~RD5-cdrom_release-B6	2003-11-18 22:15:13.000000000 -0800
+++ 25-akpm/drivers/scsi/sr.c	2003-11-18 22:15:13.000000000 -0800
@@ -422,7 +422,7 @@ static int sr_block_open(struct block_de
 static int sr_block_release(struct inode *inode, struct file *file)
 {
 	struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
-	return cdrom_release(&cd->cdi, file);
+	return cdrom_release(&cd->cdi);
 }
 
 static int sr_block_ioctl(struct block_device *bdev, struct file *file,
diff -puN include/linux/cdrom.h~RD5-cdrom_release-B6 include/linux/cdrom.h
--- 25/include/linux/cdrom.h~RD5-cdrom_release-B6	2003-11-18 22:15:13.000000000 -0800
+++ 25-akpm/include/linux/cdrom.h	2003-11-18 22:15:13.000000000 -0800
@@ -743,6 +743,7 @@ struct cdrom_device_info {
 /* per-device flags */
         __u8 sanyo_slot		: 2;	/* Sanyo 3 CD changer support */
         __u8 reserved		: 6;	/* not used yet */
+	int for_data;
 	struct cdrom_write_settings write;
 };
 
@@ -777,7 +778,7 @@ struct cdrom_device_ops {
 
 /* the general block_device operations structure: */
 extern int cdrom_open(struct cdrom_device_info *, struct block_device *, struct file *);
-extern int cdrom_release(struct cdrom_device_info *, struct file *);
+extern int cdrom_release(struct cdrom_device_info *);
 extern int cdrom_ioctl(struct cdrom_device_info *, struct block_device *, unsigned, unsigned long);
 extern int cdrom_media_changed(struct cdrom_device_info *);
 

_