From ff02ea36e0acd996f3374ad1814e2b131356c9e0 Mon Sep 17 00:00:00 2001
From: John Crispin <john@openwrt.org>
Date: Tue, 2 Dec 2014 19:28:23 +0000
Subject: [PATCH] mtd: make the mtd dump call run properly on nand flash

Signed-off-by: John Crispin <blogic@openwrt.org>

SVN-Revision: 43503
---
 package/system/mtd/src/mtd.c | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/package/system/mtd/src/mtd.c b/package/system/mtd/src/mtd.c
index e0a90f6719..db3fc804c9 100644
--- a/package/system/mtd/src/mtd.c
+++ b/package/system/mtd/src/mtd.c
@@ -276,8 +276,9 @@ mtd_erase(const char *mtd)
 static int
 mtd_dump(const char *mtd, int size)
 {
-	int ret = 0;
+	int ret = 0, offset = 0;
 	int fd;
+	char *buf;
 
 	if (quiet < 2)
 		fprintf(stderr, "Dumping %s ...\n", mtd);
@@ -288,9 +289,15 @@ mtd_dump(const char *mtd, int size)
 		return -1;
 	}
 
+	if (!size)
+		size = mtdsize;
+
+	buf = malloc(erasesize);
+	if (!buf)
+		return -1;
+
 	do {
-		char buf[256];
-		int len = (size > sizeof(buf)) ? (sizeof(buf)) : (size);
+		int len = (size > erasesize) ? (erasesize) : (size);
 		int rlen = read(fd, buf, len);
 
 		if (rlen < 0) {
@@ -299,9 +306,15 @@ mtd_dump(const char *mtd, int size)
 			ret = -1;
 			goto out;
 		}
-		if (!rlen)
+		if (!rlen || rlen != len)
 			break;
-		write(1, buf, rlen);
+		if (mtd_block_is_bad(fd, offset)) {
+			fprintf(stderr, "skipping bad block at 0x%08x\n", offset);
+		} else {
+			size -= rlen;
+			write(1, buf, rlen);
+		}
+		offset += rlen;
 	} while (size > 0);
 
 out:
-- 
GitLab