aboutsummaryrefslogtreecommitdiffstats
path: root/package/mtd/src
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2010-09-03 18:14:32 +0000
committerGabor Juhos <juhosg@openwrt.org>2010-09-03 18:14:32 +0000
commit2a541325d3db510c2b5aee30dc88c72255a797c0 (patch)
tree1bb4a97aa965348498a9c6cedeb907d5cc018cfc /package/mtd/src
parent6734c999af7372e8e8220efcf30fee1e6463b87c (diff)
downloadupstream-2a541325d3db510c2b5aee30dc88c72255a797c0.tar.gz
upstream-2a541325d3db510c2b5aee30dc88c72255a797c0.tar.bz2
upstream-2a541325d3db510c2b5aee30dc88c72255a797c0.zip
package/mtd: write remaining data after adding file to the jffs2 partition
SVN-Revision: 22881
Diffstat (limited to 'package/mtd/src')
-rw-r--r--package/mtd/src/jffs2.c2
-rw-r--r--package/mtd/src/mtd.c36
2 files changed, 30 insertions, 8 deletions
diff --git a/package/mtd/src/jffs2.c b/package/mtd/src/jffs2.c
index 49a7d56120..512f22278c 100644
--- a/package/mtd/src/jffs2.c
+++ b/package/mtd/src/jffs2.c
@@ -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)
diff --git a/package/mtd/src/mtd.c b/package/mtd/src/mtd.c
index ff75fcb8a9..b2d760e84f 100644
--- a/package/mtd/src/mtd.c
+++ b/package/mtd/src/mtd.c
@@ -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 */