Followup fixes on the mtdparts spread patchset
Consolidate some code in mtd_get_len_incl_bad(), and fix a condition
where a valid partition could be reported as truncated if it has a
good block at the end of the device (unlikely, since the BBT is usually
there).
Fix mid-block declarations in net_part_size().
Signed-off-by: Scott Wood <scottwood@freescale.com>
Reviewed-by: Ben Gardiner <bengardiner@nanometrics.ca>
diff --git a/common/cmd_mtdparts.c b/common/cmd_mtdparts.c
index 17865b7..5481c88 100644
--- a/common/cmd_mtdparts.c
+++ b/common/cmd_mtdparts.c
@@ -1228,15 +1228,16 @@
*/
static uint64_t net_part_size(struct mtd_info *mtd, struct part_info *part)
{
+ uint64_t i, net_size = 0;
+
if (!mtd->block_isbad)
return part->size;
- uint64_t i, net_size = 0;
-
for (i = 0; i < part->size; i += mtd->erasesize) {
if (!mtd->block_isbad(mtd, part->offset + i))
net_size += mtd->erasesize;
}
+
return net_size;
}
#endif
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 78f2a08..a195dda 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -162,11 +162,6 @@
*truncated = 0;
*len_incl_bad = 0;
- if (offset >= mtd->size) {
- *truncated = 1;
- return;
- }
-
if (!mtd->block_isbad) {
*len_incl_bad = length;
return;
@@ -176,6 +171,11 @@
uint64_t block_len;
while (len_excl_bad < length) {
+ if (offset >= mtd->size) {
+ *truncated = 1;
+ return;
+ }
+
block_len = mtd->erasesize - (offset & (mtd->erasesize - 1));
if (!mtd->block_isbad(mtd, offset & ~(mtd->erasesize - 1)))
@@ -183,11 +183,6 @@
*len_incl_bad += block_len;
offset += block_len;
-
- if (offset >= mtd->size) {
- *truncated = 1;
- break;
- }
}
}
#endif /* defined(CONFIG_CMD_MTDPARTS_SPREAD) */