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>
return -EINVAL;
kernel_size = sizeof(hdr) + be32_to_cpu(hdr.v1.kernel_len);
return -EINVAL;
kernel_size = sizeof(hdr) + be32_to_cpu(hdr.v1.kernel_len);
+ rootfs_offset = be32_to_cpu(hdr.v1.rootfs_ofs);
return -EINVAL;
kernel_size = sizeof(hdr) + be32_to_cpu(hdr.v2.kernel_len);
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;
break;
default:
return -EINVAL;
if (kernel_size > master->size)
return -EINVAL;
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.
/*
* The size in the header might cover the rootfs as well.
* Start the search from an arbitrary offset.
parts[0].name = KERNEL_PART_NAME;
parts[0].offset = 0;
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;
parts[1].name = ROOTFS_PART_NAME;
parts[1].offset = rootfs_offset;