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-10-04 11:45:55.000000000 -0700 +++ 25-akpm/drivers/block/paride/pcd.c 2003-10-04 11:45:55.000000000 -0700 @@ -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-10-04 11:45:55.000000000 -0700 +++ 25-akpm/drivers/cdrom/cdrom.c 2003-10-04 11:45:55.000000000 -0700 @@ -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-10-04 11:45:55.000000000 -0700 +++ 25-akpm/drivers/cdrom/cdu31a.c 2003-10-04 11:45:55.000000000 -0700 @@ -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-10-04 11:45:55.000000000 -0700 +++ 25-akpm/drivers/cdrom/cm206.c 2003-10-04 11:45:55.000000000 -0700 @@ -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-10-04 11:45:55.000000000 -0700 +++ 25-akpm/drivers/cdrom/mcd.c 2003-10-04 11:45:55.000000000 -0700 @@ -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-10-04 11:45:55.000000000 -0700 +++ 25-akpm/drivers/cdrom/mcdx.c 2003-10-04 11:45:55.000000000 -0700 @@ -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-10-04 11:45:55.000000000 -0700 +++ 25-akpm/drivers/cdrom/sbpcd.c 2003-10-04 11:45:55.000000000 -0700 @@ -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-10-04 11:45:55.000000000 -0700 +++ 25-akpm/drivers/ide/ide-cd.c 2003-10-04 11:45:55.000000000 -0700 @@ -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-10-04 11:45:55.000000000 -0700 +++ 25-akpm/drivers/scsi/sr.c 2003-10-04 11:45:55.000000000 -0700 @@ -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-10-04 11:45:55.000000000 -0700 +++ 25-akpm/include/linux/cdrom.h 2003-10-04 11:45:55.000000000 -0700 @@ -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 *); _