diff options
author | Elliott Hughes <enh@google.com> | 2015-04-30 06:33:57 +0200 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-04-30 06:33:57 +0200 |
commit | f6c7af289c2990bd16d422ae689317a938f77fdc (patch) | |
tree | e2c357667b0e76e6fa5a43c7a7951c872c373e9c /mtdutils/mtdutils.c | |
parent | am f7466f9f: Stop using adb_strtok, and check argument validity. (diff) | |
parent | am 34c7731a: Merge "Check all lseek calls succeed." (diff) | |
download | android_bootable_recovery-f6c7af289c2990bd16d422ae689317a938f77fdc.tar android_bootable_recovery-f6c7af289c2990bd16d422ae689317a938f77fdc.tar.gz android_bootable_recovery-f6c7af289c2990bd16d422ae689317a938f77fdc.tar.bz2 android_bootable_recovery-f6c7af289c2990bd16d422ae689317a938f77fdc.tar.lz android_bootable_recovery-f6c7af289c2990bd16d422ae689317a938f77fdc.tar.xz android_bootable_recovery-f6c7af289c2990bd16d422ae689317a938f77fdc.tar.zst android_bootable_recovery-f6c7af289c2990bd16d422ae689317a938f77fdc.zip |
Diffstat (limited to 'mtdutils/mtdutils.c')
-rw-r--r-- | mtdutils/mtdutils.c | 54 |
1 files changed, 22 insertions, 32 deletions
diff --git a/mtdutils/mtdutils.c b/mtdutils/mtdutils.c index 9a17e38d8..cc3033444 100644 --- a/mtdutils/mtdutils.c +++ b/mtdutils/mtdutils.c @@ -108,7 +108,7 @@ mtd_scan_partitions() if (fd < 0) { goto bail; } - nbytes = read(fd, buf, sizeof(buf) - 1); + nbytes = TEMP_FAILURE_RETRY(read(fd, buf, sizeof(buf) - 1)); close(fd); if (nbytes < 0) { goto bail; @@ -279,12 +279,6 @@ MtdReadContext *mtd_read_partition(const MtdPartition *partition) return ctx; } -// Seeks to a location in the partition. Don't mix with reads of -// anything other than whole blocks; unpredictable things will result. -void mtd_read_skip_to(const MtdReadContext* ctx, size_t offset) { - lseek64(ctx->fd, offset, SEEK_SET); -} - static int read_block(const MtdPartition *partition, int fd, char *data) { struct mtd_ecc_stats before, after; @@ -293,13 +287,18 @@ static int read_block(const MtdPartition *partition, int fd, char *data) return -1; } - loff_t pos = lseek64(fd, 0, SEEK_CUR); + loff_t pos = TEMP_FAILURE_RETRY(lseek64(fd, 0, SEEK_CUR)); + if (pos == -1) { + printf("mtd: read_block: couldn't SEEK_CUR: %s\n", strerror(errno)); + return -1; + } ssize_t size = partition->erase_size; int mgbb; while (pos + size <= (int) partition->size) { - if (lseek64(fd, pos, SEEK_SET) != pos || read(fd, data, size) != size) { + if (TEMP_FAILURE_RETRY(lseek64(fd, pos, SEEK_SET)) != pos || + TEMP_FAILURE_RETRY(read(fd, data, size)) != size) { printf("mtd: read error at 0x%08llx (%s)\n", pos, strerror(errno)); } else if (ioctl(fd, ECCGETSTATS, &after)) { @@ -409,8 +408,11 @@ static int write_block(MtdWriteContext *ctx, const char *data) const MtdPartition *partition = ctx->partition; int fd = ctx->fd; - off_t pos = lseek(fd, 0, SEEK_CUR); - if (pos == (off_t) -1) return 1; + off_t pos = TEMP_FAILURE_RETRY(lseek(fd, 0, SEEK_CUR)); + if (pos == (off_t) -1) { + printf("mtd: write_block: couldn't SEEK_CUR: %s\n", strerror(errno)); + return -1; + } ssize_t size = partition->erase_size; while (pos + size <= (int) partition->size) { @@ -435,15 +437,15 @@ static int write_block(MtdWriteContext *ctx, const char *data) pos, strerror(errno)); continue; } - if (lseek(fd, pos, SEEK_SET) != pos || - write(fd, data, size) != size) { + if (TEMP_FAILURE_RETRY(lseek(fd, pos, SEEK_SET)) != pos || + TEMP_FAILURE_RETRY(write(fd, data, size)) != size) { printf("mtd: write error at 0x%08lx (%s)\n", pos, strerror(errno)); } char verify[size]; - if (lseek(fd, pos, SEEK_SET) != pos || - read(fd, verify, size) != size) { + if (TEMP_FAILURE_RETRY(lseek(fd, pos, SEEK_SET)) != pos || + TEMP_FAILURE_RETRY(read(fd, verify, size)) != size) { printf("mtd: re-read error at 0x%08lx (%s)\n", pos, strerror(errno)); continue; @@ -512,8 +514,11 @@ off_t mtd_erase_blocks(MtdWriteContext *ctx, int blocks) ctx->stored = 0; } - off_t pos = lseek(ctx->fd, 0, SEEK_CUR); - if ((off_t) pos == (off_t) -1) return pos; + off_t pos = TEMP_FAILURE_RETRY(lseek(ctx->fd, 0, SEEK_CUR)); + if ((off_t) pos == (off_t) -1) { + printf("mtd_erase_blocks: couldn't SEEK_CUR: %s\n", strerror(errno)); + return -1; + } const int total = (ctx->partition->size - pos) / ctx->partition->erase_size; if (blocks < 0) blocks = total; @@ -554,18 +559,3 @@ int mtd_write_close(MtdWriteContext *ctx) free(ctx); return r; } - -/* Return the offset of the first good block at or after pos (which - * might be pos itself). - */ -off_t mtd_find_write_start(MtdWriteContext *ctx, off_t pos) { - int i; - for (i = 0; i < ctx->bad_block_count; ++i) { - if (ctx->bad_block_offsets[i] == pos) { - pos += ctx->partition->erase_size; - } else if (ctx->bad_block_offsets[i] > pos) { - return pos; - } - } - return pos; -} |