diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-07-25 17:28:32 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-07-25 17:28:32 +0000 |
commit | a596792a94ce2d8018062a7193df5a60ae409fbf (patch) | |
tree | cfd322af9842ff436e0e083ba050881b7854ce64 /package/mtd/src | |
parent | 670865f3231761534f01cb04be9b4e9c64ffe86f (diff) |
mtd: fix trx_fixup
With the BRCM47xx image I have built (Linksys E3000), there are additional
writes following the completion of "mtd_replace_jffs2" which invalidate the
'trx_fixup' performed by 'mtd_replace_jffs2'. Moving the 'trx_fixup' to somewhere
after all writes have completed fixes the problem. I also noticed that 'erasesize'
used to compute 'block_offset' in 'mtd_fixtrx' is used before it is computed by
'mtd_check_open'; moving the call to 'mtd_check_open' up a few lines fixes this.
Unlike 'mtd_fixtrx', 'trx_fixup' appears to assume that the TRX header is always at
offset 0; which may be the cause of the problem described in Ticket #8960.
Signed-off-by: Nathan Hintz <nlhintz@hotmail.com>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@32866 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/mtd/src')
-rw-r--r-- | package/mtd/src/jffs2.c | 3 | ||||
-rw-r--r-- | package/mtd/src/mtd.c | 8 | ||||
-rw-r--r-- | package/mtd/src/trx.c | 6 |
3 files changed, 10 insertions, 7 deletions
diff --git a/package/mtd/src/jffs2.c b/package/mtd/src/jffs2.c index aaf9be5a9..2a83bd47f 100644 --- a/package/mtd/src/jffs2.c +++ b/package/mtd/src/jffs2.c @@ -244,9 +244,6 @@ int mtd_replace_jffs2(const char *mtd, int fd, int ofs, const char *filename) pad(erasesize); free(buf); - if (trx_fixup) { - trx_fixup(outfd, mtd); - } return (mtdofs - ofs); } diff --git a/package/mtd/src/mtd.c b/package/mtd/src/mtd.c index 92873ca19..18efcf57c 100644 --- a/package/mtd/src/mtd.c +++ b/package/mtd/src/mtd.c @@ -294,6 +294,7 @@ mtd_write(int imagefd, const char *mtd, char *fis_layout, size_t part_offset) ssize_t r, w, e; ssize_t skip = 0; uint32_t offset = 0; + int jffs2_replaced = 0; #ifdef FIS_SUPPORT static struct fis_part new_parts[MAX_ARGS]; @@ -417,6 +418,7 @@ resume: fprintf(stderr, "\nAppending jffs2 data from %s to %s...", jffs2file, mtd); /* got an EOF marker - this is the place to add some jffs2 data */ skip = mtd_replace_jffs2(mtd, fd, e, jffs2file); + jffs2_replaced = 1; /* don't add it again */ jffs2file = NULL; @@ -482,6 +484,10 @@ resume: offset = 0; } + if (jffs2_replaced && trx_fixup) { + trx_fixup(fd, mtd); + } + if (!quiet) fprintf(stderr, "\b\b\b\b "); @@ -575,7 +581,7 @@ int main (int argc, char **argv) force = 0; buflen = 0; quiet = 0; - no_erase = 0; + no_erase = 0; while ((ch = getopt(argc, argv, #ifdef FIS_SUPPORT diff --git a/package/mtd/src/trx.c b/package/mtd/src/trx.c index d1aab3692..65c24404c 100644 --- a/package/mtd/src/trx.c +++ b/package/mtd/src/trx.c @@ -154,15 +154,15 @@ mtd_fixtrx(const char *mtd, size_t offset) if (quiet < 2) fprintf(stderr, "Trying to fix trx header in %s at 0x%x...\n", mtd, offset); - block_offset = offset & ~(erasesize - 1); - offset -= block_offset; - fd = mtd_check_open(mtd); if(fd < 0) { fprintf(stderr, "Could not open mtd device: %s\n", mtd); exit(1); } + block_offset = offset & ~(erasesize - 1); + offset -= block_offset; + if (block_offset + erasesize > mtdsize) { fprintf(stderr, "Offset too large, device size 0x%x\n", mtdsize); exit(1); |