mtd: make the mtd dump call run properly on nand flash
authorJohn Crispin <john@openwrt.org>
Tue, 2 Dec 2014 19:28:23 +0000 (19:28 +0000)
committerJohn Crispin <john@openwrt.org>
Tue, 2 Dec 2014 19:28:23 +0000 (19:28 +0000)
Signed-off-by: John Crispin <blogic@openwrt.org>
SVN-Revision: 43503

package/system/mtd/src/mtd.c

index e0a90f6719cbc8c86cbe531056f166f4c2c13e8f..db3fc804c9ea680ffb9af0747b36e5c208a3513a 100644 (file)
@@ -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: