>From 730494a0accbc5b70e57d376ca11e81453868422 Mon Sep 17 00:00:00 2001
From: Gergely Kiss <mail.g...@gmail.com>
Date: Sun, 14 Dec 2014 14:23:05 +0100
Subject: [PATCH v2] [package] fstools: make extroot functionality work with 
ubifs

Signed-off-by: Gergely Kiss <mail.g...@gmail.com>
Tested-by: Gergely Kiss <mail.g...@gmail.com>
---

Hi John,

here's the new version of my patch providing the following improvements:

* Whitespace issues should be fixed now (changed to a new MUA), however while 
applying the patch,
there are some warnings generated. I couldn't make them disappear, sorry. If 
that's a problem
please let me know how to fix it (I'm still a newbie on how to make properly 
formatted patches).

* Config option added to enable/disable extroot support as requested (enabled 
by default
if NAND_SUPPORT is defined, otherwise hidden).

Hope everything will be fine with the patch this time.


Regards,
Gergely

 package/system/fstools/Makefile                    |  12 ++
 .../system/fstools/patches/001-ubifs-extroot.patch | 165 +++++++++++++++++++++
 2 files changed, 177 insertions(+)
 create mode 100644 package/system/fstools/patches/001-ubifs-extroot.patch

diff --git a/package/system/fstools/Makefile b/package/system/fstools/Makefile
index 2688f49..9eca044 100644
--- a/package/system/fstools/Makefile
+++ b/package/system/fstools/Makefile
@@ -31,12 +31,24 @@ include $(INCLUDE_DIR)/package.mk
 include $(INCLUDE_DIR)/cmake.mk
 
 TARGET_LDFLAGS += $(if $(CONFIG_USE_EGLIBC),-lrt)
+CMAKE_OPTIONS += $(if $(CONFIG_FSTOOLS_UBIFS_EXTROOT),-DCMAKE_UBIFS_EXTROOT=y)
 
 define Package/fstools
   SECTION:=base
   CATEGORY:=Base system
   DEPENDS:=+ubox +USE_EGLIBC:librt +NAND_SUPPORT:ubi-utils
   TITLE:=OpenWrt filesystem tools
+  MENU:=1
+endef
+
+define Package/fstools/config
+       config FSTOOLS_UBIFS_EXTROOT
+               depends on PACKAGE_fstools
+               depends on NAND_SUPPORT
+               bool "Support extroot functionality with UBIFS"
+               default y
+               help
+                       This option makes it possible to use extroot 
functionality if the root filesystem resides on an UBIFS partition
 endef
 
 define Package/block-mount
diff --git a/package/system/fstools/patches/001-ubifs-extroot.patch 
b/package/system/fstools/patches/001-ubifs-extroot.patch
new file mode 100644
index 0000000..9ddfb6c
--- /dev/null
+++ b/package/system/fstools/patches/001-ubifs-extroot.patch
@@ -0,0 +1,165 @@
+diff -rupN fstools-2014-12-01.orig/block.c fstools-2014-12-01/block.c
+--- fstools-2014-12-01.orig/block.c    2014-12-14 14:15:20.000000000 +0100
++++ fstools-2014-12-01/block.c 2014-12-14 14:19:33.537985812 +0100
+@@ -36,6 +36,10 @@
+ 
+ #include "libblkid-tiny/libblkid-tiny.h"
+ 
++#ifdef UBIFS_EXTROOT
++#include "libubi/libubi.h"
++#endif
++
+ #define ERROR(fmt, ...) do { \
+               syslog(LOG_ERR, fmt, ## __VA_ARGS__); \
+               fprintf(stderr, "block: "fmt, ## __VA_ARGS__); \
+@@ -823,13 +827,77 @@ static int find_block_mtd(char *name, ch
+       return 0;
+ }
+ 
++#ifdef UBIFS_EXTROOT
++static int find_ubi_vol(libubi_t libubi, char *name, int *dev_num, int 
*vol_id)
++{
++      int dev = 0;
++
++      while (ubi_dev_present(libubi, dev))
++      {
++              struct ubi_dev_info dev_info;
++              struct ubi_vol_info vol_info;
++
++              if (ubi_get_dev_info1(libubi, dev++, &dev_info))
++                      continue;
++              if (ubi_get_vol_info1_nm(libubi, dev_info.dev_num, name, 
&vol_info))
++                      continue;
++
++              *dev_num = dev_info.dev_num;
++              *vol_id = vol_info.vol_id;
++
++              return 0;
++      }
++
++      return -1;
++}
++
++static int find_block_ubi(libubi_t libubi, char *name, char *part, int plen)
++{
++      int dev_num;
++      int vol_id;
++      int err = -1;
++
++      err = find_ubi_vol(libubi, name, &dev_num, &vol_id);
++      if (!err)
++              snprintf(part, plen, "/dev/ubi%d_%d", dev_num, vol_id);
++
++      return err;
++}
++
++static int find_block_ubi_RO(libubi_t libubi, char *name, char *part, int 
plen)
++{
++      int dev_num;
++      int vol_id;
++      int err = -1;
++
++      err = find_ubi_vol(libubi, name, &dev_num, &vol_id);
++      if (!err)
++              snprintf(part, plen, "/dev/ubiblock%d_%d", dev_num, vol_id);
++
++      return err;
++}
++#endif
++
+ static int check_extroot(char *path)
+ {
+       struct blkid_struct_probe *pr = NULL;
+       char fs[32];
+ 
++#ifdef UBIFS_EXTROOT
++      if (find_block_mtd("rootfs", fs, sizeof(fs))) {
++              int err = -1;
++              libubi_t libubi;
++
++              libubi = libubi_open();
++              err = find_block_ubi_RO(libubi, "rootfs", fs, sizeof(fs));
++              libubi_close(libubi);
++              if (err)
++                      return -1;
++      }
++#else
+       if (find_block_mtd("rootfs", fs, sizeof(fs)))
+               return -1;
++#endif
+ 
+       list_for_each_entry(pr, &devices, list) {
+               if (!strcmp(pr->dev, fs)) {
+@@ -933,6 +1001,9 @@ static int main_extroot(int argc, char *
+       char fs[32] = { 0 };
+       char fs_data[32] = { 0 };
+       int err = -1;
++#ifdef UBIFS_EXTROOT
++      libubi_t libubi;
++#endif
+ 
+       if (!getenv("PREINIT"))
+               return -1;
+@@ -947,8 +1018,18 @@ static int main_extroot(int argc, char *
+ 
+       find_block_mtd("rootfs", fs, sizeof(fs));
+       if (!fs[0]) {
++#ifdef UBIFS_EXTROOT
++              libubi = libubi_open();
++              find_block_ubi_RO(libubi, "rootfs", fs, sizeof(fs));
++              libubi_close(libubi);
++              if (!fs[0]) {
++                      ERROR("extroot: unable to locate rootfs mtdblock / 
ubiblock\n");
++                      return -2;
++              }
++#else
+               ERROR("extroot: unable to locate rootfs mtdblock\n");
+               return -2;
++#endif
+       }
+ 
+       pr = find_block_info(NULL, NULL, fs);
+@@ -975,6 +1056,26 @@ static int main_extroot(int argc, char *
+               }
+       }
+ 
++#ifdef UBIFS_EXTROOT
++      memset(fs_data, 0, sizeof(fs_data));
++      libubi = libubi_open();
++      find_block_ubi(libubi, "rootfs_data", fs_data, sizeof(fs_data));
++      libubi_close(libubi);
++      if (fs_data[0]) {
++              char cfg[] = "/tmp/ubifs_cfg";
++
++              mkdir_p(cfg);
++              if (!mount(fs_data, cfg, "ubifs", MS_NOATIME, NULL)) {
++                      err = mount_extroot(cfg);
++                      umount2(cfg, MNT_DETACH);
++              }
++              if (err < 0)
++                      rmdir("/tmp/overlay");
++              rmdir(cfg);
++              return err;
++       }
++#endif
++
+       return mount_extroot(NULL);
+ }
+ 
+diff -rupN fstools-2014-12-01.orig/CMakeLists.txt 
fstools-2014-12-01/CMakeLists.txt
+--- fstools-2014-12-01.orig/CMakeLists.txt     2014-12-14 14:15:20.000000000 
+0100
++++ fstools-2014-12-01/CMakeLists.txt  2014-12-14 14:19:18.140667538 +0100
+@@ -48,7 +48,12 @@ TARGET_LINK_LIBRARIES(mount_root fstools
+ INSTALL(TARGETS mount_root RUNTIME DESTINATION sbin)
+ 
+ ADD_EXECUTABLE(block block.c)
+-TARGET_LINK_LIBRARIES(block blkid-tiny uci ubox blobmsg_json)
++IF(DEFINED CMAKE_UBIFS_EXTROOT)
++      ADD_DEFINITIONS(-DUBIFS_EXTROOT)
++      TARGET_LINK_LIBRARIES(block blkid-tiny uci ubox blobmsg_json ubi-utils)
++ELSE(DEFINED CMAKE_UBIFS_EXTROOT)
++      TARGET_LINK_LIBRARIES(block blkid-tiny uci ubox blobmsg_json)
++ENDIF(DEFINED CMAKE_UBIFS_EXTROOT)
+ INSTALL(TARGETS block RUNTIME DESTINATION sbin)
+ 
+ ADD_EXECUTABLE(jffs2reset jffs2reset.c)
-- 
1.8.3.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to