mtd: trx: use separated buffer for TRX header

We plan to adjust usage of the main buffer to allow reading custom
amount of data for CRC32. This means we need another buffer that will be
always block aligned.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
This commit is contained in:
Rafał Miłecki 2016-05-09 19:00:53 +02:00
parent 6de401b1f8
commit 2dd125048d

View file

@ -152,6 +152,7 @@ mtd_fixtrx(const char *mtd, size_t offset)
{ {
int fd; int fd;
struct trx_header *trx; struct trx_header *trx;
char *first_block;
char *buf; char *buf;
ssize_t res; ssize_t res;
size_t block_offset; size_t block_offset;
@ -173,19 +174,19 @@ mtd_fixtrx(const char *mtd, size_t offset)
exit(1); exit(1);
} }
buf = malloc(erasesize); first_block = malloc(erasesize);
if (!buf) { if (!first_block) {
perror("malloc"); perror("malloc");
exit(1); exit(1);
} }
res = pread(fd, buf, erasesize, block_offset); res = pread(fd, first_block, erasesize, block_offset);
if (res != erasesize) { if (res != erasesize) {
perror("pread"); perror("pread");
exit(1); exit(1);
} }
trx = (struct trx_header *) (buf + offset); trx = (struct trx_header *)(first_block + offset);
if (trx->magic != STORE32_LE(0x30524448)) { if (trx->magic != STORE32_LE(0x30524448)) {
fprintf(stderr, "No trx magic found\n"); fprintf(stderr, "No trx magic found\n");
exit(1); exit(1);
@ -198,6 +199,18 @@ mtd_fixtrx(const char *mtd, size_t offset)
return 0; return 0;
} }
buf = malloc(erasesize);
if (!buf) {
perror("malloc");
exit(1);
}
res = pread(fd, buf, erasesize, block_offset);
if (res != erasesize) {
perror("pread");
exit(1);
}
trx->len = STORE32_LE(erasesize - offset); trx->len = STORE32_LE(erasesize - offset);
trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize - offset - 3*4)); trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize - offset - 3*4));
@ -209,7 +222,7 @@ mtd_fixtrx(const char *mtd, size_t offset)
if (quiet < 2) if (quiet < 2)
fprintf(stderr, "New crc32: 0x%x, rewriting block\n", trx->crc32); fprintf(stderr, "New crc32: 0x%x, rewriting block\n", trx->crc32);
if (pwrite(fd, buf, erasesize, block_offset) != erasesize) { if (pwrite(fd, first_block, erasesize, block_offset) != erasesize) {
fprintf(stderr, "Error writing block (%s)\n", strerror(errno)); fprintf(stderr, "Error writing block (%s)\n", strerror(errno));
exit(1); exit(1);
} }