These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / mtd / mtdpart.c
index cafdb88..f8ba153 100644 (file)
@@ -664,8 +664,10 @@ int add_mtd_partitions(struct mtd_info *master,
 
        for (i = 0; i < nbparts; i++) {
                slave = allocate_partition(master, parts + i, i, cur_offset);
-               if (IS_ERR(slave))
+               if (IS_ERR(slave)) {
+                       del_mtd_partitions(master);
                        return PTR_ERR(slave);
+               }
 
                mutex_lock(&mtd_partitions_mutex);
                list_add(&slave->list, &mtd_partitions);
@@ -753,26 +755,37 @@ int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
                         struct mtd_part_parser_data *data)
 {
        struct mtd_part_parser *parser;
-       int ret = 0;
+       int ret, err = 0;
 
        if (!types)
                types = default_mtd_part_types;
 
-       for ( ; ret <= 0 && *types; types++) {
+       for ( ; *types; types++) {
+               pr_debug("%s: parsing partitions %s\n", master->name, *types);
                parser = get_partition_parser(*types);
                if (!parser && !request_module("%s", *types))
                        parser = get_partition_parser(*types);
+               pr_debug("%s: got parser %s\n", master->name,
+                        parser ? parser->name : NULL);
                if (!parser)
                        continue;
                ret = (*parser->parse_fn)(master, pparts, data);
+               pr_debug("%s: parser %s: %i\n",
+                        master->name, parser->name, ret);
                put_partition_parser(parser);
                if (ret > 0) {
                        printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n",
                               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)