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:
parent
0034102808
commit
c65390f4dd
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue