From: Quanyang Wang <quanyang.w...@windriver.com>

When kernel booting, mount_block_root will be called to judge
the filesystem type of root device. Then .mount function in file_system_type
structure will do the check operation. But yaffs filesystem has a
relaxed examination because as a filesystem for NAND Flash, it doesn't
examinate whether the root device is the MTD NAND device. This results
that yaffs filesystem will do mount operation even though the root device
is a MMC card with a btrfs filesystem, and will crash kernel after
mounting failed.

Use yaffs_get_mtd_device to add strict check.

Signed-off-by: Quanyang Wang <quanyang.w...@windriver.com>
---
 fs/yaffs2/yaffs_mtdif.c | 12 ++++++++++--
 fs/yaffs2/yaffs_vfs.c   |  7 ++-----
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/fs/yaffs2/yaffs_mtdif.c b/fs/yaffs2/yaffs_mtdif.c
index 4ff5741f3983..054e251a2c18 100644
--- a/fs/yaffs2/yaffs_mtdif.c
+++ b/fs/yaffs2/yaffs_mtdif.c
@@ -242,17 +242,25 @@ struct mtd_info * yaffs_get_mtd_device(dev_t sdev)
 {
        struct mtd_info *mtd;
 
-       mtd = yaffs_get_mtd_device(sdev);
-
        /* Check it's an mtd device..... */
        if (MAJOR(sdev) != MTD_BLOCK_MAJOR)
                return NULL;    /* This isn't an mtd device */
 
+       /* Get the device */
+       mtd = get_mtd_device(NULL, MINOR(sdev));
+       if (IS_ERR_OR_NULL(mtd)) {
+               yaffs_trace(YAFFS_TRACE_ALWAYS,
+                       "yaffs: MTD device %u either not valid or unavailable",
+                       MINOR(sdev));
+               return NULL;
+       }
+
        /* Check it's NAND */
        if (mtd->type != MTD_NANDFLASH) {
                yaffs_trace(YAFFS_TRACE_ALWAYS,
                        "yaffs: MTD device is not NAND it's type %d",
                        mtd->type);
+               put_mtd_device(mtd);
                return NULL;
        }
 
diff --git a/fs/yaffs2/yaffs_vfs.c b/fs/yaffs2/yaffs_vfs.c
index 61ac4e4c45d1..db77316a0f95 100644
--- a/fs/yaffs2/yaffs_vfs.c
+++ b/fs/yaffs2/yaffs_vfs.c
@@ -2881,12 +2881,9 @@ static struct super_block *yaffs_internal_read_super(int 
yaffs_version,
                MAJOR(sb->s_dev), MINOR(sb->s_dev),
                yaffs_devname(sb, devname_buf));
 
-       /* Get the device */
-       mtd = get_mtd_device(NULL, MINOR(sb->s_dev));
+
+       mtd = yaffs_get_mtd_device(sb->s_dev);
        if (!mtd) {
-               yaffs_trace(YAFFS_TRACE_ALWAYS,
-                       "yaffs: MTD device %u either not valid or unavailable",
-                       MINOR(sb->s_dev));
                return NULL;
        }
 
-- 
2.17.1

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#8146): 
https://lists.yoctoproject.org/g/linux-yocto/message/8146
Mute This Topic: https://lists.yoctoproject.org/mt/65654980/21656
Group Owner: linux-yocto+ow...@lists.yoctoproject.org
Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub  
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to