Skip to content

Commit

Permalink
Revert "kernel: use add_mtd_partitions() helper when using OpenWrt pa…
Browse files Browse the repository at this point in the history
…rsers"

This reverts commit 7e88753.

Using subpartitions (hierarchical layout) resulted in calling MTD ops of
parent partition instead of master device ops. That was expected and
should work but testing revealed some bugs.

Apparently the way MTD_ERASE_PARTIAL is implemented in the OpenWrt
breaks something and using parent partition ops triggers using that
code.

On SmartRG SR400ac it was resulting in:
[  225.487519] jffs2: Erase at 0x01ac0000 failed immediately: errno -22
on the second boot (for some reason erasing was starting over) and it
was breaking flash access in a long term.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
  • Loading branch information
Rafał Miłecki committed Dec 3, 2018
1 parent e9a9b7d commit f98fde2
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 12 deletions.
Expand Up @@ -20,36 +20,44 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>


/* /*
* Given a pointer to the MTD object in the mtd_part structure, we can retrieve * Given a pointer to the MTD object in the mtd_part structure, we can retrieve
@@ -751,6 +755,28 @@ int mtd_del_partition(struct mtd_info *m @@ -751,6 +755,36 @@ int mtd_del_partition(struct mtd_info *m
} }
EXPORT_SYMBOL_GPL(mtd_del_partition); EXPORT_SYMBOL_GPL(mtd_del_partition);


+static int run_parsers_by_type(struct mtd_part *slave, +static int
+ enum mtd_parser_type type) +run_parsers_by_type(struct mtd_part *slave, enum mtd_parser_type type)
+{ +{
+ const struct mtd_partition *parts; + struct mtd_partition *parts;
+ int nr_parts; + int nr_parts;
+ int err; + int i;
+ +
+ nr_parts = parse_mtd_partitions_by_type(&slave->mtd, type, &parts, + nr_parts = parse_mtd_partitions_by_type(&slave->mtd, type, (const struct mtd_partition **)&parts,
+ NULL); + NULL);
+ if (nr_parts <= 0) + if (nr_parts <= 0)
+ return nr_parts; + return nr_parts;
+ +
+ if (WARN_ON(!parts)) + if (WARN_ON(!parts))
+ return 0; + return 0;
+ +
+ err = add_mtd_partitions(&slave->mtd, parts, nr_parts); + 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); + kfree(parts);
+ +
+ return err ? err : nr_parts; + return nr_parts;
+} +}
+ +
#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
#else #else
@@ -1122,6 +1148,61 @@ void mtd_part_parser_cleanup(struct mtd_ @@ -1122,6 +1156,61 @@ void mtd_part_parser_cleanup(struct mtd_
} }
} }


Expand Down
Expand Up @@ -10,15 +10,15 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>


--- a/drivers/mtd/mtdpart.c --- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c
@@ -785,6 +785,7 @@ static int run_parsers_by_type(struct mt @@ -793,6 +793,7 @@ run_parsers_by_type(struct mtd_part *sla


static void split_firmware(struct mtd_info *master, struct mtd_part *part) static void split_firmware(struct mtd_info *master, struct mtd_part *part)
{ {
+ run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE); + run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
} }


static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part) static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part)
@@ -794,6 +795,12 @@ static void mtd_partition_split(struct m @@ -802,6 +803,12 @@ static void mtd_partition_split(struct m
if (rootfs_found) if (rootfs_found)
return; return;


Expand Down
Expand Up @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>


--- a/drivers/mtd/mtdpart.c --- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c
@@ -1227,6 +1227,24 @@ int mtd_is_partition(const struct mtd_in @@ -1235,6 +1235,24 @@ int mtd_is_partition(const struct mtd_in
} }
EXPORT_SYMBOL_GPL(mtd_is_partition); EXPORT_SYMBOL_GPL(mtd_is_partition);


Expand Down

0 comments on commit f98fde2

Please sign in to comment.