From: Gabor Juhos Subject: kernel/3.10: allow to use partition parsers for rootfs and firmware split lede-commit: 3b71cd94bc9517bc25267dccb393b07d4b54564e Signed-off-by: Gabor Juhos --- drivers/mtd/mtdpart.c | 37 +++++++++++++++++++++++++++++++++++++ include/linux/mtd/partitions.h | 2 ++ 2 files changed, 39 insertions(+) --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c @@ -744,6 +744,36 @@ int mtd_del_partition(struct mtd_info *m } EXPORT_SYMBOL_GPL(mtd_del_partition); +static int +run_parsers_by_type(struct mtd_part *slave, enum mtd_parser_type type) +{ + struct mtd_partition *parts; + int nr_parts; + int i; + + nr_parts = parse_mtd_partitions_by_type(&slave->mtd, type, (const struct mtd_partition **)&parts, + NULL); + if (nr_parts <= 0) + return nr_parts; + + if (WARN_ON(!parts)) + return 0; + + for (i = 0; i < nr_parts; i++) { + /* adjust partition offsets */ + parts[i].offset += slave->offset; + + mtd_add_partition(slave->parent, + parts[i].name, + parts[i].offset, + parts[i].size); + } + + kfree(parts); + + return nr_parts; +} + #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME #else @@ -752,6 +782,7 @@ EXPORT_SYMBOL_GPL(mtd_del_partition); static void split_firmware(struct mtd_info *master, struct mtd_part *part) { + run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE); } void __weak arch_split_mtd_part(struct mtd_info *master, const char *name, @@ -766,6 +797,12 @@ static void mtd_partition_split(struct m if (rootfs_found) return; + if (!strcmp(part->mtd.name, "rootfs")) { + run_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS); + + rootfs_found = 1; + } + if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) && IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE)) split_firmware(master, part); --- a/include/linux/mtd/partitions.h +++ b/include/linux/mtd/partitions.h @@ -74,6 +74,8 @@ struct mtd_part_parser_data { enum mtd_parser_type { MTD_PARSER_TYPE_DEVICE = 0, + MTD_PARSER_TYPE_ROOTFS, + MTD_PARSER_TYPE_FIRMWARE, }; struct mtd_part_parser {