Просмотр исходного кода

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 <[email protected]>

SVN-Revision: 32866
Felix Fietkau 13 лет назад
Родитель
Сommit
5832e754fb
4 измененных файлов с 11 добавлено и 8 удалено
  1. 1 1
      package/mtd/Makefile
  2. 0 3
      package/mtd/src/jffs2.c
  3. 7 1
      package/mtd/src/mtd.c
  4. 3 3
      package/mtd/src/trx.c

+ 1 - 1
package/mtd/Makefile

@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 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)

+ 0 - 3
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);
 }
 

+ 7 - 1
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

+ 3 - 3
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);