diff options
author | Doug Zongker <dougz@android.com> | 2010-11-03 14:31:01 -0700 |
---|---|---|
committer | Doug Zongker <dougz@android.com> | 2010-11-03 14:31:01 -0700 |
commit | 5d6309e77f6055a9aec062dd991d071054726ebb (patch) | |
tree | b77fcc831eb1c8c17399d2a1e6e7dae9ff22b5ff | |
parent | 51266d1397309978eac9b2e96035582454f0321b (diff) | |
download | bootable_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
-rw-r--r-- | mtdutils/mtdutils.c | 2 |
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", |