summaryrefslogtreecommitdiffstats
path: root/package/system/mtd/src/jffs2.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2014-03-26 10:50:09 +0000
committerFelix Fietkau <nbd@openwrt.org>2014-03-26 10:50:09 +0000
commit608f4fe3b040089b30a019f1a28efeda1ca5809f (patch)
tree501b30c771418fcffdb4d9d7867552f7ab021d11 /package/system/mtd/src/jffs2.c
parent0555ebf66d415045b176181cde25ba2ed063c09d (diff)
downloadmaster-31e0f0ae-608f4fe3b040089b30a019f1a28efeda1ca5809f.tar.gz
master-31e0f0ae-608f4fe3b040089b30a019f1a28efeda1ca5809f.tar.bz2
master-31e0f0ae-608f4fe3b040089b30a019f1a28efeda1ca5809f.zip
mtd: add support for bad blocks in NAND flash
NAND flash is very likely to contain bad blocks. Currently, mtd and therefore sysupgrade fails when it encounters a single bad block, potentially leaving an unbootable system. This patch allows the mtd utility to skip bad blocks in NAND flash and complete sysupgrade successfully. Patch by: Matthew Redfearn <matt.redfearn@nxp.com> Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 40021
Diffstat (limited to 'package/system/mtd/src/jffs2.c')
-rw-r--r--package/system/mtd/src/jffs2.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/package/system/mtd/src/jffs2.c b/package/system/mtd/src/jffs2.c
index 2a83bd47f4..c29fb33e5c 100644
--- a/package/system/mtd/src/jffs2.c
+++ b/package/system/mtd/src/jffs2.c
@@ -59,6 +59,15 @@ static void pad(int size)
}
ofs = ofs % erasesize;
if (ofs == 0) {
+ while (mtd_block_is_bad(outfd, mtdofs) && (mtdofs < mtdsize)) {
+ if (!quiet)
+ fprintf(stderr, "\nSkipping bad block at 0x%08x ", mtdofs);
+
+ mtdofs += erasesize;
+
+ /* Move the file pointer along over the bad block. */
+ lseek(outfd, erasesize, SEEK_CUR);
+ }
mtd_erase_block(outfd, mtdofs);
write(outfd, buf, erasesize);
mtdofs += erasesize;