package/mtd: write remaining data after adding file to the jffs2 partition
authorGabor Juhos <juhosg@openwrt.org>
Fri, 3 Sep 2010 18:14:32 +0000 (18:14 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Fri, 3 Sep 2010 18:14:32 +0000 (18:14 +0000)
SVN-Revision: 22881

package/mtd/Makefile
package/mtd/src/jffs2.c
package/mtd/src/mtd.c

index 332ce3034cd8e35356afc43b8a58fb248d184dd6..3b4dd5523d61ccaba12902cf08ffd0b75758aa0d 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2009 OpenWrt.org
+# Copyright (C) 2006-2010 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mtd
-PKG_RELEASE:=13
+PKG_RELEASE:=14
 
 PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME)
 STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)
index 49a7d56120e05cc78a6e12754a1a67c9eab2670a..512f22278cd3a261c7cc8a7c00df309b79f34e35 100644 (file)
@@ -247,7 +247,7 @@ int mtd_replace_jffs2(const char *mtd, int fd, int ofs, const char *filename)
 #ifdef target_brcm
        trx_fixup(outfd, mtd);
 #endif
-       return 0;
+       return (mtdofs - ofs);
 }
 
 void mtd_parse_jffs2data(const char *buf, const char *dir)
index ff75fcb8a93435ff02a1d407c01dab8fdc213e81..b2d760e84f087dae03a42d8fc01c9bd390da0cee 100644 (file)
@@ -367,6 +367,16 @@ mtd_refresh(const char *mtd)
        return 0;
 }
 
+static void
+indicate_writing(const char *mtd)
+{
+       if (quiet < 2)
+               fprintf(stderr, "\nWriting from %s to %s ... ", imagefile, mtd);
+
+       if (!quiet)
+               fprintf(stderr, " [ ]");
+}
+
 static int
 mtd_write(int imagefd, const char *mtd, char *fis_layout)
 {
@@ -374,6 +384,7 @@ mtd_write(int imagefd, const char *mtd, char *fis_layout)
        char *str = NULL;
        int fd, result;
        ssize_t r, w, e;
+       ssize_t skip = 0;
        uint32_t offset = 0;
 
 #ifdef FIS_SUPPORT
@@ -451,13 +462,9 @@ resume:
                exit(1);
        }
 
-       if (quiet < 2)
-               fprintf(stderr, "Writing from %s to %s ... ", imagefile, mtd);
+       indicate_writing(mtd);
 
        w = e = 0;
-       if (!quiet)
-               fprintf(stderr, " [ ]");
-
        for (;;) {
                /* buffer may contain data already (from trx check or last mtd partition write attempt) */
                while (buflen < erasesize) {
@@ -480,6 +487,15 @@ resume:
                if (buflen == 0)
                        break;
 
+               if (skip > 0) {
+                       skip -= buflen;
+                       buflen = 0;
+                       if (skip <= 0)
+                               indicate_writing(mtd);
+
+                       continue;
+               }
+
                if (jffs2file) {
                        if (memcmp(buf, JFFS2_EOF, sizeof(JFFS2_EOF) - 1) == 0) {
                                if (!quiet)
@@ -487,8 +503,14 @@ resume:
                                if (quiet < 2)
                                        fprintf(stderr, "\nAppending jffs2 data from %s to %s...", jffs2file, mtd);
                                /* got an EOF marker - this is the place to add some jffs2 data */
-                               mtd_replace_jffs2(mtd, fd, e, jffs2file);
-                               goto done;
+                               skip = mtd_replace_jffs2(mtd, fd, e, jffs2file);
+
+                               w += skip;
+                               e += skip;
+                               skip -= buflen;
+                               buflen = 0;
+                               offset = 0;
+                               continue;
                        }
                        /* no EOF marker, make sure we figure out the last inode number
                         * before appending some data */