kernel: mtdsplit: modify rootfs helpers to provide partition type
[openwrt/openwrt.git] / target / linux / generic / files / drivers / mtd / mtdsplit / mtdsplit.c
index 162739f472e929378f7a5e72cc441787e8668211..4f6b46e28b93e04e9fbd3f0940008eb28cbcc206 100644 (file)
@@ -70,7 +70,8 @@ static ssize_t mtd_next_eb(struct mtd_info *mtd, size_t offset)
        return mtd_rounddown_to_eb(offset, mtd) + mtd->erasesize;
 }
 
-int mtd_check_rootfs_magic(struct mtd_info *mtd, size_t offset)
+int mtd_check_rootfs_magic(struct mtd_info *mtd, size_t offset,
+                          enum mtdsplit_part_type *type)
 {
        u32 magic;
        size_t retlen;
@@ -84,25 +85,32 @@ int mtd_check_rootfs_magic(struct mtd_info *mtd, size_t offset)
        if (retlen != sizeof(magic))
                return -EIO;
 
-       if (le32_to_cpu(magic) != SQUASHFS_MAGIC &&
-           magic != 0x19852003)
-               return -EINVAL;
+       if (le32_to_cpu(magic) == SQUASHFS_MAGIC) {
+               if (type)
+                       *type = MTDSPLIT_PART_TYPE_SQUASHFS;
+               return 0;
+       } else if (magic == 0x19852003) {
+               if (type)
+                       *type = MTDSPLIT_PART_TYPE_JFFS2;
+               return 0;
+       }
 
-       return 0;
+       return -EINVAL;
 }
 EXPORT_SYMBOL_GPL(mtd_check_rootfs_magic);
 
 int mtd_find_rootfs_from(struct mtd_info *mtd,
                         size_t from,
                         size_t limit,
-                        size_t *ret_offset)
+                        size_t *ret_offset,
+                        enum mtdsplit_part_type *type)
 {
        size_t offset;
        int err;
 
        for (offset = from; offset < limit;
             offset = mtd_next_eb(mtd, offset)) {
-               err = mtd_check_rootfs_magic(mtd, offset);
+               err = mtd_check_rootfs_magic(mtd, offset, type);
                if (err)
                        continue;