mtd: make the mtd dump call run properly on nand flash

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

SVN-Revision: 43503
master
John Crispin 10 years ago
parent 5331a85501
commit ff02ea36e0
  1. 21
      package/system/mtd/src/mtd.c

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

Loading…
Cancel
Save