583e44ca124e6251e3ca76d04bcd70b0fbfdf4f6
[openwrt/openwrt.git] / target / linux / generic / patches-3.14 / 402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch
1 --- a/drivers/mtd/mtdpart.c
2 +++ b/drivers/mtd/mtdpart.c
3 @@ -628,6 +628,37 @@ int mtd_del_partition(struct mtd_info *m
4 }
5 EXPORT_SYMBOL_GPL(mtd_del_partition);
6
7 +static int
8 +run_parsers_by_type(struct mtd_part *slave, enum mtd_parser_type type)
9 +{
10 + struct mtd_partition *parts;
11 + int nr_parts;
12 + int i;
13 +
14 + nr_parts = parse_mtd_partitions_by_type(&slave->mtd, type, &parts,
15 + NULL);
16 + if (nr_parts <= 0)
17 + return nr_parts;
18 +
19 + if (WARN_ON(!parts))
20 + return 0;
21 +
22 + for (i = 0; i < nr_parts; i++) {
23 + /* adjust partition offsets */
24 + parts[i].offset += slave->offset;
25 +
26 + __mtd_add_partition(slave->master,
27 + parts[i].name,
28 + parts[i].offset,
29 + parts[i].size,
30 + false);
31 + }
32 +
33 + kfree(parts);
34 +
35 + return nr_parts;
36 +}
37 +
38 static inline unsigned long
39 mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
40 {
41 @@ -714,6 +745,12 @@ static void split_uimage(struct mtd_info
42
43 static void split_firmware(struct mtd_info *master, struct mtd_part *part)
44 {
45 + int ret;
46 +
47 + ret = run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
48 + if (ret > 0)
49 + return;
50 +
51 if (config_enabled(CONFIG_MTD_UIMAGE_SPLIT))
52 split_uimage(master, part);
53 }
54 @@ -731,9 +768,12 @@ static void mtd_partition_split(struct m
55 return;
56
57 if (!strcmp(part->mtd.name, "rootfs")) {
58 + int ret;
59 +
60 rootfs_found = 1;
61
62 - if (config_enabled(CONFIG_MTD_ROOTFS_SPLIT))
63 + ret = run_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS);
64 + if (ret <= 0 && config_enabled(CONFIG_MTD_ROOTFS_SPLIT))
65 split_rootfs_data(master, part);
66 }
67
68 --- a/include/linux/mtd/partitions.h
69 +++ b/include/linux/mtd/partitions.h
70 @@ -70,6 +70,8 @@ struct mtd_part_parser_data {
71
72 enum mtd_parser_type {
73 MTD_PARSER_TYPE_DEVICE = 0,
74 + MTD_PARSER_TYPE_ROOTFS,
75 + MTD_PARSER_TYPE_FIRMWARE,
76 };
77
78 struct mtd_part_parser {