Commit 5a2415b0 authored by Brian Norris's avatar Brian Norris

mtd: mtdpart: Do not fail mtd probe when parsing partitions fails

Due to wrong assumption in ofpart ofpart fails on Exynos on SPI chips
with no partitions because the subnode containing controller data
confuses the ofpart parser.

Thus compiling in ofpart support automatically fails probing any SPI NOR
flash without partitions on Exynos.

Compiling in a partitioning scheme should not cause probe of otherwise
valid device to fail.

Instead, let's do the following:
 * try parsers until one succeeds
 * if no parser succeeds, report the first error we saw
 * even in the failure case, allow MTD to probe, with fallback
   partitions or no partitions at all -- the master device will still be
   registered

Issue report and comments initially by Michal Suchanek.
Reported-by: default avatarMichal Suchanek <hramrach@gmail.com>
Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
parent 04850c4d
...@@ -598,8 +598,10 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types, ...@@ -598,8 +598,10 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
} }
/* Didn't come up with either parsed OR fallback partitions */ /* Didn't come up with either parsed OR fallback partitions */
if (ret < 0) { if (ret < 0) {
pr_info("mtd: failed to find partitions\n"); pr_info("mtd: failed to find partitions; one or more parsers reports errors (%d)\n",
goto out; ret);
/* Don't abort on errors; we can still use unpartitioned MTD */
ret = 0;
} }
ret = mtd_add_device_partitions(mtd, real_parts, ret); ret = mtd_add_device_partitions(mtd, real_parts, ret);
......
...@@ -755,12 +755,12 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types, ...@@ -755,12 +755,12 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
struct mtd_part_parser_data *data) struct mtd_part_parser_data *data)
{ {
struct mtd_part_parser *parser; struct mtd_part_parser *parser;
int ret = 0; int ret, err = 0;
if (!types) if (!types)
types = default_mtd_part_types; types = default_mtd_part_types;
for ( ; ret <= 0 && *types; types++) { for ( ; *types; types++) {
pr_debug("%s: parsing partitions %s\n", master->name, *types); pr_debug("%s: parsing partitions %s\n", master->name, *types);
parser = get_partition_parser(*types); parser = get_partition_parser(*types);
if (!parser && !request_module("%s", *types)) if (!parser && !request_module("%s", *types))
...@@ -776,10 +776,16 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types, ...@@ -776,10 +776,16 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
if (ret > 0) { if (ret > 0) {
printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n", printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n",
ret, parser->name, master->name); ret, parser->name, master->name);
break; return ret;
} }
/*
* Stash the first error we see; only report it if no parser
* succeeds
*/
if (ret < 0 && !err)
err = ret;
} }
return ret; return err;
} }
int mtd_is_partition(const struct mtd_info *mtd) int mtd_is_partition(const struct mtd_info *mtd)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment