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>
SVN-Revision: 32866
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=mtd
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=mtd
PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME)
STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)
PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME)
STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)
pad(erasesize);
free(buf);
pad(erasesize);
free(buf);
- if (trx_fixup) {
- trx_fixup(outfd, mtd);
- }
ssize_t r, w, e;
ssize_t skip = 0;
uint32_t offset = 0;
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];
#ifdef FIS_SUPPORT
static struct fis_part new_parts[MAX_ARGS];
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);
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);
/* don't add it again */
jffs2file = NULL;
/* don't add it again */
jffs2file = NULL;
+ if (jffs2_replaced && trx_fixup) {
+ trx_fixup(fd, mtd);
+ }
+
if (!quiet)
fprintf(stderr, "\b\b\b\b ");
if (!quiet)
fprintf(stderr, "\b\b\b\b ");
force = 0;
buflen = 0;
quiet = 0;
force = 0;
buflen = 0;
quiet = 0;
while ((ch = getopt(argc, argv,
#ifdef FIS_SUPPORT
while ((ch = getopt(argc, argv,
#ifdef FIS_SUPPORT
if (quiet < 2)
fprintf(stderr, "Trying to fix trx header in %s at 0x%x...\n", mtd, 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);
}
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);
if (block_offset + erasesize > mtdsize) {
fprintf(stderr, "Offset too large, device size 0x%x\n", mtdsize);
exit(1);