generic: make mtdsplit-tplink.c honor rootfs offset
authorThibaut VARÈNE <hacks@slashdirt.org>
Sat, 28 Oct 2017 12:48:08 +0000 (14:48 +0200)
committerMathias Kresin <dev@kresin.me>
Wed, 8 Nov 2017 22:18:22 +0000 (23:18 +0100)
The splitter ignored the rootfs offset from the header, probably
because until c1e6e61 it was invalid.

This patch fixes the splitter to use the now correct header data.

Regarding target/linux/ar71xx/files/drivers/mtd/tplinkpart.c,
this particular splitter "falls back" to the correct rootfs offset
reading and as such it doesn't need to be updated, although it will
report a kernel partition length that can be larger than the actual
length as it assumes that partition fills the entire segment up to
the rootfs partition.

Tested-by: Mathias Kresin <dev@kresin.me>
Tested-by: Stefan Lippers-Hollmann <s.l-h@gmx.de>
Tested-by: Daniel Engberg <daniel.engberg.lists@pyret.net>
Tested-by: Henryk Heisig <hyniu@o2.pl>
Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_tplink.c

index 3a50250..c346aa8 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;