aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cdrom
diff options
context:
space:
mode:
authorJens Axboe <axboe@suse.de>2006-06-16 07:46:37 +0200
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-17 10:44:26 -0700
commit16070428d389ff47aa3476b0911179ad90c640a2 (patch)
treefb9b9a15a720bf5fb070f2a0fd611aaabd9d1b52 /drivers/cdrom
parent553698f944ed715dfe023b4cef07601f0ce735f0 (diff)
downloadkernel_samsung_aries-16070428d389ff47aa3476b0911179ad90c640a2.zip
kernel_samsung_aries-16070428d389ff47aa3476b0911179ad90c640a2.tar.gz
kernel_samsung_aries-16070428d389ff47aa3476b0911179ad90c640a2.tar.bz2
[PATCH] fix cdrom open
Some time ago the cdrom open routine was changed so that we call the driver's open routine before checking to see if it is read only. However, if we discovered that a read write open was not possible and the open flags required a writable open, we just returned -EROFS without calling the driver's release routine. This seems to work for most cdrom drivers, but breaks the Powerpc iSeries virtual cdrom rather badly. This just inserts the release call in the error path to balance the call to "->open()" done by "open_for_data()". Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Jens Axboe <axboe@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/cdrom')
-rw-r--r--drivers/cdrom/cdrom.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c
index a59876a..3170eaa 100644
--- a/drivers/cdrom/cdrom.c
+++ b/drivers/cdrom/cdrom.c
@@ -1009,9 +1009,9 @@ int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp)
if (fp->f_mode & FMODE_WRITE) {
ret = -EROFS;
if (cdrom_open_write(cdi))
- goto err;
+ goto err_release;
if (!CDROM_CAN(CDC_RAM))
- goto err;
+ goto err_release;
ret = 0;
cdi->media_written = 0;
}
@@ -1026,6 +1026,8 @@ int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp)
not be mounting, but opening with O_NONBLOCK */
check_disk_change(ip->i_bdev);
return 0;
+err_release:
+ cdi->ops->release(cdi);
err:
cdi->use_count--;
return ret;