summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Zongker <dougz@android.com>2009-12-15 16:42:36 +0100
committerAndroid Git Automerger <android-git-automerger@android.com>2009-12-15 16:42:36 +0100
commitd36308c26d3f2947f4ff49f2ecc22cbb659fdf37 (patch)
tree1a3b8cc1c45ba9b08497d63aa31b0ebd87ad1902
parentam c652e41d: fix cut-and-paste error in verifier (diff)
parentuse MEMGETBADBLOCK to look for bad blocks when reading MTD partitions (diff)
downloadandroid_bootable_recovery-d36308c26d3f2947f4ff49f2ecc22cbb659fdf37.tar
android_bootable_recovery-d36308c26d3f2947f4ff49f2ecc22cbb659fdf37.tar.gz
android_bootable_recovery-d36308c26d3f2947f4ff49f2ecc22cbb659fdf37.tar.bz2
android_bootable_recovery-d36308c26d3f2947f4ff49f2ecc22cbb659fdf37.tar.lz
android_bootable_recovery-d36308c26d3f2947f4ff49f2ecc22cbb659fdf37.tar.xz
android_bootable_recovery-d36308c26d3f2947f4ff49f2ecc22cbb659fdf37.tar.zst
android_bootable_recovery-d36308c26d3f2947f4ff49f2ecc22cbb659fdf37.zip
-rw-r--r--mtdutils/mtdutils.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/mtdutils/mtdutils.c b/mtdutils/mtdutils.c
index fc067669b..8d3252059 100644
--- a/mtdutils/mtdutils.c
+++ b/mtdutils/mtdutils.c
@@ -283,19 +283,26 @@ static int read_block(const MtdPartition *partition, int fd, char *data)
return -1;
}
- off_t pos = lseek(fd, 0, SEEK_CUR);
+ loff_t pos = lseek64(fd, 0, SEEK_CUR);
+
ssize_t size = partition->erase_size;
+ int mgbb;
+
while (pos + size <= (int) partition->size) {
- if (lseek(fd, pos, SEEK_SET) != pos || read(fd, data, size) != size) {
- fprintf(stderr, "mtd: read error at 0x%08lx (%s)\n",
+ if (lseek64(fd, pos, SEEK_SET) != pos || read(fd, data, size) != size) {
+ fprintf(stderr, "mtd: read error at 0x%08llx (%s)\n",
pos, strerror(errno));
} else if (ioctl(fd, ECCGETSTATS, &after)) {
fprintf(stderr, "mtd: ECCGETSTATS error (%s)\n", strerror(errno));
return -1;
} else if (after.failed != before.failed) {
- fprintf(stderr, "mtd: ECC errors (%d soft, %d hard) at 0x%08lx\n",
+ fprintf(stderr, "mtd: ECC errors (%d soft, %d hard) at 0x%08llx\n",
after.corrected - before.corrected,
after.failed - before.failed, pos);
+ } else if ((mgbb = ioctl(fd, MEMGETBADBLOCK, &pos))) {
+ fprintf(stderr,
+ "mtd: MEMGETBADBLOCK returned %d at 0x%08llx (errno=%d)\n",
+ mgbb, pos, errno);
} else {
int i;
for (i = 0; i < size; ++i) {
@@ -303,7 +310,7 @@ static int read_block(const MtdPartition *partition, int fd, char *data)
return 0; // Success!
}
}
- fprintf(stderr, "mtd: read all-zero block at 0x%08lx; skipping\n",
+ fprintf(stderr, "mtd: read all-zero block at 0x%08llx; skipping\n",
pos);
}