>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