fix breakage in mtdchar_open(), sanitize failure exits

simple_release_fs() should be only done on failure there.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2012-04-09 01:36:28 -04:00
parent 0034102808
commit c65390f4dd

View file

@ -106,16 +106,14 @@ static int mtdchar_open(struct inode *inode, struct file *file)
} }
if (mtd->type == MTD_ABSENT) { if (mtd->type == MTD_ABSENT) {
put_mtd_device(mtd);
ret = -ENODEV; ret = -ENODEV;
goto out; goto out1;
} }
mtd_ino = iget_locked(mnt->mnt_sb, devnum); mtd_ino = iget_locked(mnt->mnt_sb, devnum);
if (!mtd_ino) { if (!mtd_ino) {
put_mtd_device(mtd);
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out1;
} }
if (mtd_ino->i_state & I_NEW) { if (mtd_ino->i_state & I_NEW) {
mtd_ino->i_private = mtd; mtd_ino->i_private = mtd;
@ -127,23 +125,25 @@ static int mtdchar_open(struct inode *inode, struct file *file)
/* You can't open it RW if it's not a writeable device */ /* You can't open it RW if it's not a writeable device */
if ((file->f_mode & FMODE_WRITE) && !(mtd->flags & MTD_WRITEABLE)) { if ((file->f_mode & FMODE_WRITE) && !(mtd->flags & MTD_WRITEABLE)) {
iput(mtd_ino);
put_mtd_device(mtd);
ret = -EACCES; ret = -EACCES;
goto out; goto out2;
} }
mfi = kzalloc(sizeof(*mfi), GFP_KERNEL); mfi = kzalloc(sizeof(*mfi), GFP_KERNEL);
if (!mfi) { if (!mfi) {
iput(mtd_ino);
put_mtd_device(mtd);
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out2;
} }
mfi->ino = mtd_ino; mfi->ino = mtd_ino;
mfi->mtd = mtd; mfi->mtd = mtd;
file->private_data = mfi; file->private_data = mfi;
mutex_unlock(&mtd_mutex);
return 0;
out2:
iput(mtd_ino);
out1:
put_mtd_device(mtd);
out: out:
mutex_unlock(&mtd_mutex); mutex_unlock(&mtd_mutex);
simple_release_fs(&mnt, &count); simple_release_fs(&mnt, &count);