mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-24 01:01:52 +02:00
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
This commit is contained in:
parent
670865f323
commit
a596792a94
@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
include $(INCLUDE_DIR)/kernel.mk
|
include $(INCLUDE_DIR)/kernel.mk
|
||||||
|
|
||||||
PKG_NAME:=mtd
|
PKG_NAME:=mtd
|
||||||
PKG_RELEASE:=17
|
PKG_RELEASE:=18
|
||||||
|
|
||||||
PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME)
|
PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME)
|
||||||
STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)
|
STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)
|
||||||
|
@ -244,9 +244,6 @@ int mtd_replace_jffs2(const char *mtd, int fd, int ofs, const char *filename)
|
|||||||
pad(erasesize);
|
pad(erasesize);
|
||||||
free(buf);
|
free(buf);
|
||||||
|
|
||||||
if (trx_fixup) {
|
|
||||||
trx_fixup(outfd, mtd);
|
|
||||||
}
|
|
||||||
return (mtdofs - ofs);
|
return (mtdofs - ofs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 r, w, e;
|
||||||
ssize_t skip = 0;
|
ssize_t skip = 0;
|
||||||
uint32_t offset = 0;
|
uint32_t offset = 0;
|
||||||
|
int jffs2_replaced = 0;
|
||||||
|
|
||||||
#ifdef FIS_SUPPORT
|
#ifdef FIS_SUPPORT
|
||||||
static struct fis_part new_parts[MAX_ARGS];
|
static struct fis_part new_parts[MAX_ARGS];
|
||||||
@ -417,6 +418,7 @@ resume:
|
|||||||
fprintf(stderr, "\nAppending jffs2 data from %s to %s...", jffs2file, mtd);
|
fprintf(stderr, "\nAppending jffs2 data from %s to %s...", jffs2file, mtd);
|
||||||
/* got an EOF marker - this is the place to add some jffs2 data */
|
/* got an EOF marker - this is the place to add some jffs2 data */
|
||||||
skip = mtd_replace_jffs2(mtd, fd, e, jffs2file);
|
skip = mtd_replace_jffs2(mtd, fd, e, jffs2file);
|
||||||
|
jffs2_replaced = 1;
|
||||||
|
|
||||||
/* don't add it again */
|
/* don't add it again */
|
||||||
jffs2file = NULL;
|
jffs2file = NULL;
|
||||||
@ -482,6 +484,10 @@ resume:
|
|||||||
offset = 0;
|
offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (jffs2_replaced && trx_fixup) {
|
||||||
|
trx_fixup(fd, mtd);
|
||||||
|
}
|
||||||
|
|
||||||
if (!quiet)
|
if (!quiet)
|
||||||
fprintf(stderr, "\b\b\b\b ");
|
fprintf(stderr, "\b\b\b\b ");
|
||||||
|
|
||||||
@ -575,7 +581,7 @@ int main (int argc, char **argv)
|
|||||||
force = 0;
|
force = 0;
|
||||||
buflen = 0;
|
buflen = 0;
|
||||||
quiet = 0;
|
quiet = 0;
|
||||||
no_erase = 0;
|
no_erase = 0;
|
||||||
|
|
||||||
while ((ch = getopt(argc, argv,
|
while ((ch = getopt(argc, argv,
|
||||||
#ifdef FIS_SUPPORT
|
#ifdef FIS_SUPPORT
|
||||||
|
@ -154,15 +154,15 @@ mtd_fixtrx(const char *mtd, size_t offset)
|
|||||||
if (quiet < 2)
|
if (quiet < 2)
|
||||||
fprintf(stderr, "Trying to fix trx header in %s at 0x%x...\n", mtd, offset);
|
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);
|
fd = mtd_check_open(mtd);
|
||||||
if(fd < 0) {
|
if(fd < 0) {
|
||||||
fprintf(stderr, "Could not open mtd device: %s\n", mtd);
|
fprintf(stderr, "Could not open mtd device: %s\n", mtd);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
block_offset = offset & ~(erasesize - 1);
|
||||||
|
offset -= block_offset;
|
||||||
|
|
||||||
if (block_offset + erasesize > mtdsize) {
|
if (block_offset + erasesize > mtdsize) {
|
||||||
fprintf(stderr, "Offset too large, device size 0x%x\n", mtdsize);
|
fprintf(stderr, "Offset too large, device size 0x%x\n", mtdsize);
|
||||||
exit(1);
|
exit(1);
|
||||||
|
Loading…
Reference in New Issue
Block a user