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.

If this patch is OK; I could submit a similar patch for backfire if someone 
wants it;
might be a day or two though.

v2: Modified to only do 'trx_fixup' when required (e.g., jffs2 was written)

Signed-off-by: Nathan Hintz <nlhi...@hotmail.com>

Index: trunk/package/mtd/src/mtd.c
===================================================================
--- trunk/package/mtd/src/mtd.c (revision 29399)
+++ trunk/package/mtd/src/mtd.c (working copy)
@@ -290,6 +290,7 @@
        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];
@@ -408,6 +409,7 @@
                                        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;
@@ -473,6 +475,10 @@
                offset = 0;
        }
 
+       if (jffs2_replaced && trx_fixup) {
+               trx_fixup(fd, mtd);
+       }
+
        if (!quiet)
                fprintf(stderr, "\b\b\b\b    ");
 
@@ -565,7 +571,7 @@
        force = 0;
        buflen = 0;
        quiet = 0;
-  no_erase = 0;
+       no_erase = 0;
 
        while ((ch = getopt(argc, argv,
 #ifdef FIS_SUPPORT
Index: trunk/package/mtd/src/jffs2.c
===================================================================
--- trunk/package/mtd/src/jffs2.c       (revision 29399)
+++ trunk/package/mtd/src/jffs2.c       (working copy)
@@ -244,9 +244,6 @@
        pad(erasesize);
        free(buf);
 
-       if (trx_fixup) {
-         trx_fixup(outfd, mtd);
-       }
        return (mtdofs - ofs);
 }
 
Index: trunk/package/mtd/src/trx.c
===================================================================
--- trunk/package/mtd/src/trx.c (revision 29399)
+++ trunk/package/mtd/src/trx.c (working copy)
@@ -154,15 +154,15 @@
        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);
Index: trunk/package/mtd/Makefile
===================================================================
--- trunk/package/mtd/Makefile  (revision 29399)
+++ trunk/package/mtd/Makefile  (working copy)
@@ -9,7 +9,7 @@
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mtd
-PKG_RELEASE:=17
+PKG_RELEASE:=18
 
 PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME)
 STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to