generic: make mtdsplit-tplink.c honor rootfs offset
[openwrt/staging/lynxis.git] / target / linux / generic / files / drivers / mtd / mtdsplit / mtdsplit_tplink.c
index 3a50250715bdec72918680cb87ea23592e1c8cdc..c346aa8130ba6284655b043bbfbca1a83d828745 100644 (file)
@@ -106,6 +106,7 @@ static int mtdsplit_parse_tplink(struct mtd_info *master,
                        return -EINVAL;
 
                kernel_size = sizeof(hdr) + be32_to_cpu(hdr.v1.kernel_len);
+               rootfs_offset = be32_to_cpu(hdr.v1.rootfs_ofs);
                break;
        case 2:
        case 3:
@@ -113,6 +114,7 @@ static int mtdsplit_parse_tplink(struct mtd_info *master,
                        return -EINVAL;
 
                kernel_size = sizeof(hdr) + be32_to_cpu(hdr.v2.kernel_len);
+               rootfs_offset = be32_to_cpu(hdr.v2.rootfs_ofs);
                break;
        default:
                return -EINVAL;
@@ -121,11 +123,9 @@ static int mtdsplit_parse_tplink(struct mtd_info *master,
        if (kernel_size > master->size)
                return -EINVAL;
 
-       /* Find the rootfs after the kernel. */
-       err = mtd_check_rootfs_magic(master, kernel_size, NULL);
-       if (!err) {
-               rootfs_offset = kernel_size;
-       } else {
+       /* Find the rootfs */
+       err = mtd_check_rootfs_magic(master, rootfs_offset, NULL);
+       if (err) {
                /*
                 * The size in the header might cover the rootfs as well.
                 * Start the search from an arbitrary offset.
@@ -142,7 +142,7 @@ static int mtdsplit_parse_tplink(struct mtd_info *master,
 
        parts[0].name = KERNEL_PART_NAME;
        parts[0].offset = 0;
-       parts[0].size = rootfs_offset;
+       parts[0].size = kernel_size;
 
        parts[1].name = ROOTFS_PART_NAME;
        parts[1].offset = rootfs_offset;