[git commit master 1/1] nandwrite: always check the first erase block

Denys Vlasenko vda.linux at googlemail.com
Sun Aug 29 11:30:22 UTC 2010


commit: http://git.busybox.net/busybox/commit/?id=7715b48c36a453b41f4555ee57c2f936e25f06f1
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Current code does not check the first erase block when mtdoffset is not erase
block aligned. Fix this.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 miscutils/nandwrite.c |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/miscutils/nandwrite.c b/miscutils/nandwrite.c
index 8df0fdc..f422426 100644
--- a/miscutils/nandwrite.c
+++ b/miscutils/nandwrite.c
@@ -52,7 +52,7 @@ int nandwrite_main(int argc UNUSED_PARAM, char **argv)
 	unsigned opts;
 	int fd;
 	ssize_t cnt;
-	unsigned mtdoffset, meminfo_writesize;
+	unsigned mtdoffset, meminfo_writesize, blockstart;
 	struct mtd_info_user meminfo;
 	unsigned char *filebuf;
 	const char *opt_s = "0";
@@ -83,9 +83,21 @@ int nandwrite_main(int argc UNUSED_PARAM, char **argv)
 
 	filebuf = xmalloc(meminfo_writesize);
 
+	blockstart = mtdoffset & ~(meminfo.erasesize - 1);
+	if (blockstart != mtdoffset) {
+		unsigned tmp;
+		/* mtdoffset is in the middle of an erase block, verify that
+		 * this block is OK. Advance mtdoffset only if this block is
+		 * bad.
+		 */
+		tmp = next_good_eraseblock(fd, &meminfo, blockstart);
+		if (tmp != blockstart) /* bad block(s), advance mtdoffset */
+			mtdoffset = tmp;
+	}
+
 	cnt = -1;
 	while (mtdoffset < meminfo.size) {
-		unsigned blockstart = mtdoffset & ~(meminfo.erasesize - 1);
+		blockstart = mtdoffset & ~(meminfo.erasesize - 1);
 		if (blockstart == mtdoffset) {
 			/* starting a new eraseblock */
 			mtdoffset = next_good_eraseblock(fd, &meminfo, blockstart);
-- 
1.7.1



More information about the busybox-cvs mailing list