Normally a jffs fs start with a know marker. If ubi is used, the
partition does not habe such a marker. Just 0xFFFFFFFF. This patch
checks if the partition is of type ubivol and has 0xFFFFFFFF at the
beginning. In this case the partition is mounted as a jffs.

Signed-off-by: André Valentin <avalen...@marcant.net>
---
 .../system/fstools/patches/001-jffs-empty.patch    |   87 ++++++++++++++++++++
 1 file changed, 87 insertions(+)
 create mode 100644 package/system/fstools/patches/001-jffs-empty.patch

diff --git a/package/system/fstools/patches/001-jffs-empty.patch 
b/package/system/fstools/patches/001-jffs-empty.patch
new file mode 100644
index 0000000..c40cbbf
--- /dev/null
+++ b/package/system/fstools/patches/001-jffs-empty.patch
@@ -0,0 +1,87 @@
+diff -uNrp a/backend/base.c b/backend/base.c
+--- a/backend/base.c   2014-03-21 10:15:20.000000000 +0100
++++ b/backend/base.c   2014-03-26 11:19:08.000000000 +0100
+@@ -67,6 +67,12 @@ start(int argc, char **argv)
+ 
+       switch (mtd_identify(mtd)) {
+       case FS_NONE:
++              if (mtd_is_ubivol(mtd)) {
++                      backend_mount("overlay");
++                      break;
++              }
++              return ramoverlay();
++
+       case FS_DEADCODE:
+               return ramoverlay();
+ 
+@@ -101,6 +107,10 @@ done(int argc, char **argv)
+ 
+       switch (mtd_identify(mtd)) {
+       case FS_NONE:
++              if (mtd_is_ubivol(mtd)) {
++                      return jffs2_switch(argc, argv);
++              }
++              return ramoverlay();
+       case FS_DEADCODE:
+               return jffs2_switch(argc, argv);
+       }
+diff -uNrp a/backend/jffs2.c b/backend/jffs2.c
+--- a/backend/jffs2.c  2014-03-21 10:15:20.000000000 +0100
++++ b/backend/jffs2.c  2014-03-26 11:23:58.000000000 +0100
+@@ -309,6 +309,16 @@ jffs2_switch(int argc, char **argv)
+       switch (mtd_identify(mtd)) {
+       case FS_NONE:
+               fprintf(stderr, "no jffs2 marker found\n");
++              if (mtd_is_ubivol(mtd)) {
++                  ret = jffs2_mount();
++                  if (ret)
++                          break;
++                  if (mount_move("/tmp", "", "/overlay") || 
fopivot("/overlay", "/rom")) {
++                          fprintf(stderr, "switching to jffs2 failed\n");
++                          ret = -1;
++                  }
++                  break;
++              }
+               /* fall through */
+ 
+       case FS_DEADCODE:
+diff -uNrp a/lib/mtd.c b/lib/mtd.c
+--- a/lib/mtd.c        2014-03-21 10:15:20.000000000 +0100
++++ b/lib/mtd.c        2014-03-26 11:18:09.000000000 +0100
+@@ -199,3 +199,26 @@ mtd_identify(char *mtd)
+ 
+       return FS_NONE;
+ }
++
++int
++mtd_is_ubivol(char *mtd)
++{
++      int fd = mtd_load(mtd);
++      struct mtd_info_user mtdInfo;
++
++      if (!fd) {
++              fprintf(stderr, "reading %s failed\n", mtd);
++              return -1;
++      }
++      if (ioctl(fd, MEMGETINFO, &mtdInfo)) {
++              fprintf(stderr, "Could not get MTD device info from %s\n", mtd);
++              close(fd);
++              return -1;
++      }
++
++      close(fd);
++      if (mtdInfo.type == MTD_UBIVOLUME) {
++              return 1;
++      }
++      return 0;
++}
+diff -uNrp a/lib/mtd.h b/lib/mtd.h
+--- a/lib/mtd.h        2014-03-21 10:15:20.000000000 +0100
++++ b/lib/mtd.h        2014-03-26 11:18:09.000000000 +0100
+@@ -24,5 +24,6 @@ int mtd_unlock(int fd);
+ int mtd_read_buffer(int fd, void *buf, int offset, int length);
+ int mtd_write_buffer(int fd, void *buf, int offset, int length);
+ int mtd_identify(char *mtd);
++int mtd_is_ubivol(char *mtd);
+ 
+ #endif
-- 
1.7.10.4
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to