summaryrefslogtreecommitdiffstats
path: root/mtdutils
diff options
context:
space:
mode:
authorDoug Zongker <dougz@android.com>2010-11-03 14:31:01 -0700
committerDoug Zongker <dougz@android.com>2010-11-03 14:31:01 -0700
commit5d6309e77f6055a9aec062dd991d071054726ebb (patch)
treeb77fcc831eb1c8c17399d2a1e6e7dae9ff22b5ff /mtdutils
parent51266d1397309978eac9b2e96035582454f0321b (diff)
downloadbootable_recovery-5d6309e77f6055a9aec062dd991d071054726ebb.zip
bootable_recovery-5d6309e77f6055a9aec062dd991d071054726ebb.tar.gz
bootable_recovery-5d6309e77f6055a9aec062dd991d071054726ebb.tar.bz2
fix comparison of ECC stats before and after mtd reads
ECC errors are found by comparing the result of ioctl(ECCGETSTATS) before and after the read. But if an error was found causing us to go to the next block, we'd compare the stats before the *first* read to the stats after the second (third, fourth, etc.) reads, so we'd read to the end of the partition without ever succeeding. Fix logic so we compare the values before and after each read independently. Bug: 3162777 Change-Id: I5a13abd7243d2afd1d21bd98cbb233e5124b2e80
Diffstat (limited to 'mtdutils')
-rw-r--r--mtdutils/mtdutils.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/mtdutils/mtdutils.c b/mtdutils/mtdutils.c
index 48d5ea9..198f498 100644
--- a/mtdutils/mtdutils.c
+++ b/mtdutils/mtdutils.c
@@ -309,6 +309,8 @@ static int read_block(const MtdPartition *partition, int fd, char *data)
fprintf(stderr, "mtd: ECC errors (%d soft, %d hard) at 0x%08llx\n",
after.corrected - before.corrected,
after.failed - before.failed, pos);
+ // copy the comparison baseline for the next read.
+ memcpy(&before, &after, sizeof(struct mtd_ecc_stats));
} else if ((mgbb = ioctl(fd, MEMGETBADBLOCK, &pos))) {
fprintf(stderr,
"mtd: MEMGETBADBLOCK returned %d at 0x%08llx (errno=%d)\n",