skip over all-zero blocks when reading MTD partition
We fail to detect certain bad blocks (marked in the factory as bad, I think?) when reading mtd partitions. These come back as a block of all zeros. Since it's fairly unlikely a legitimate boot or recovery block will contain 128k of zeros, change mtdutils to skip over such blocks. Arve says https://review.source.android.com/10535 may be a long-term fix for this, but he isn't yet sure.
This commit is contained in:
parent
d8f7c9b85e
commit
bec02d57fb
@ -297,7 +297,14 @@ static int read_block(const MtdPartition *partition, int fd, char *data)
|
||||
after.corrected - before.corrected,
|
||||
after.failed - before.failed, pos);
|
||||
} else {
|
||||
return 0; // Success!
|
||||
int i;
|
||||
for (i = 0; i < size; ++i) {
|
||||
if (data[i] != 0) {
|
||||
return 0; // Success!
|
||||
}
|
||||
}
|
||||
fprintf(stderr, "mtd: read all-zero block at 0x%08lx; skipping\n",
|
||||
pos);
|
||||
}
|
||||
|
||||
pos += partition->erase_size;
|
||||
@ -326,6 +333,10 @@ ssize_t mtd_read_data(MtdReadContext *ctx, char *data, size_t len)
|
||||
read += ctx->partition->erase_size;
|
||||
}
|
||||
|
||||
if (read >= len) {
|
||||
return read;
|
||||
}
|
||||
|
||||
// Read the next block into the buffer
|
||||
if (ctx->consumed == ctx->partition->erase_size && read < (int) len) {
|
||||
if (read_block(ctx->partition, ctx->fd, ctx->buffer)) return -1;
|
||||
|
Loading…
Reference in New Issue
Block a user