Browse Source

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>
Scott Wood 14 years ago
parent
commit
36650ca9f1
2 changed files with 8 additions and 12 deletions
  1. 3 2
      common/cmd_mtdparts.c
  2. 5 10
      drivers/mtd/mtdcore.c

+ 3 - 2
common/cmd_mtdparts.c

@@ -1228,15 +1228,16 @@ static int generate_mtdparts_save(char *buf, u32 buflen)
  */
 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

+ 5 - 10
drivers/mtd/mtdcore.c

@@ -162,11 +162,6 @@ void mtd_get_len_incl_bad(struct mtd_info *mtd, uint64_t offset,
 	*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 @@ void mtd_get_len_incl_bad(struct mtd_info *mtd, uint64_t offset,
 	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 @@ void mtd_get_len_incl_bad(struct mtd_info *mtd, uint64_t offset,
 
 		*len_incl_bad += block_len;
 		offset       += block_len;
-
-		if (offset >= mtd->size) {
-			*truncated = 1;
-			break;
-		}
 	}
 }
 #endif /* defined(CONFIG_CMD_MTDPARTS_SPREAD) */