mtd: trx: use separated buffer for TRX header
authorRafał Miłecki <zajec5@gmail.com>
Mon, 9 May 2016 17:00:53 +0000 (19:00 +0200)
committerRafał Miłecki <zajec5@gmail.com>
Mon, 9 May 2016 18:10:58 +0000 (20:10 +0200)
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>
package/system/mtd/src/trx.c

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