fs/jffs2/super.c | 30 +++++++++++++++++------------- 1 files changed, 17 insertions(+), 13 deletions(-) diff -puN fs/jffs2/super.c~KD34-jffs2-B5 fs/jffs2/super.c --- 25/fs/jffs2/super.c~KD34-jffs2-B5 2003-09-21 22:35:13.000000000 -0700 +++ 25-akpm/fs/jffs2/super.c 2003-09-21 22:35:13.000000000 -0700 @@ -173,7 +173,6 @@ static struct super_block *jffs2_get_sb( int err; struct nameidata nd; int mtdnr; - dev_t dev; if (!dev_name) return ERR_PTR(-EINVAL); @@ -227,26 +226,31 @@ static struct super_block *jffs2_get_sb( if (err) return ERR_PTR(err); - if (!S_ISBLK(nd.dentry->d_inode->i_mode)) { - path_release(&nd); - return ERR_PTR(-EINVAL); - } + err = -EINVAL; + + if (!S_ISBLK(nd.dentry->d_inode->i_mode)) + goto out; + if (nd.mnt->mnt_flags & MNT_NODEV) { - path_release(&nd); - return ERR_PTR(-EACCES); + err = -EACCES; + goto out; } - dev = nd.dentry->d_inode->i_rdev; - path_release(&nd); - - if (MAJOR(dev) != MTD_BLOCK_MAJOR) { + if (imajor(nd.dentry->d_inode) != MTD_BLOCK_MAJOR) { if (!(flags & MS_VERBOSE)) /* Yes I mean this. Strangely */ printk(KERN_NOTICE "Attempt to mount non-MTD device \"%s\" as JFFS2\n", dev_name); - return ERR_PTR(-EINVAL); + goto out; } - return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, MINOR(dev)); + mtdnr = iminor(nd.dentry->d_inode); + path_release(&nd); + + return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, mtdnr); + +out: + path_release(&nd); + return ERR_PTR(err); } _