]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/mtd/mtdpart.c
[MTD][MTDPART] Cleanup and document the erase region handling
[linux-2.6-omap-h63xx.git] / drivers / mtd / mtdpart.c
index 9cf73d360e78b231eed1104dd70adefadb6f302e..5aac59c21ead8a8769cb3e4e08f773d8cecdc10b 100644 (file)
@@ -424,18 +424,24 @@ static struct mtd_part *add_one_partition(struct mtd_info *master,
        }
        if (master->numeraseregions > 1) {
                /* Deal with variable erase size stuff */
-               int i;
+               int i, max = master->numeraseregions;
+               u32 end = slave->offset + slave->mtd.size;
                struct mtd_erase_region_info *regions = master->eraseregions;
 
-               /* Find the first erase regions which is part of this partition. */
-               for (i = 0; i < master->numeraseregions && regions[i].offset <= slave->offset; i++)
+               /* Find the first erase regions which is part of this
+                * partition. */
+               for (i = 0; i < max && regions[i].offset <= slave->offset; i++)
                        ;
+               /* The loop searched for the region _behind_ the first one */
+               i--;
 
-               for (i--; i < master->numeraseregions && regions[i].offset < slave->offset + slave->mtd.size; i++) {
+               /* Pick biggest erasesize */
+               for (; i < max && regions[i].offset < end; i++) {
                        if (slave->mtd.erasesize < regions[i].erasesize) {
                                slave->mtd.erasesize = regions[i].erasesize;
                        }
                }
+               BUG_ON(slave->mtd.erasesize == 0);
        } else {
                /* Single erase size */
                slave->mtd.erasesize = master->erasesize;