From 48b8c58de77cf653cf6f3b9c149145cd89bd890f Mon Sep 17 00:00:00 2001 From: eSir <50467624+esirplayground@users.noreply.github.com> Date: Wed, 16 Sep 2020 08:04:13 -0400 Subject: [PATCH] fstools-support-extroot-for-non-MTD-rootfs (#5472) --- package/system/fstools/Makefile | 8 +- ...port-extroot-for-non-MTD-rootfs_data.patch | 137 ++++++++++++++++++ 2 files changed, 141 insertions(+), 4 deletions(-) create mode 100755 package/system/fstools/patches/0001-fstools-support-extroot-for-non-MTD-rootfs_data.patch diff --git a/package/system/fstools/Makefile b/package/system/fstools/Makefile index d5f44893c..023dedd4f 100644 --- a/package/system/fstools/Makefile +++ b/package/system/fstools/Makefile @@ -76,10 +76,10 @@ define Package/snapshot-tool endef define Package/block-mount - SECTION:=base - CATEGORY:=Base system - TITLE:=Block device mounting and checking - DEPENDS:=+ubox +libubox +libuci +libblobmsg-json +libjson-c + SECTION:=base + CATEGORY:=Base system + TITLE:=Block device mounting and checking + DEPENDS:=+fstools +ubox +libubox +libuci +libblobmsg-json +libjson-c endef define Package/blockd diff --git a/package/system/fstools/patches/0001-fstools-support-extroot-for-non-MTD-rootfs_data.patch b/package/system/fstools/patches/0001-fstools-support-extroot-for-non-MTD-rootfs_data.patch new file mode 100755 index 000000000..62ddceb79 --- /dev/null +++ b/package/system/fstools/patches/0001-fstools-support-extroot-for-non-MTD-rootfs_data.patch @@ -0,0 +1,137 @@ +From: Qi Liu + +In order to support extroot, block extroot command has to be able to +discover and properly mount the rootfs_data volume in order to discover +the extroot volume. Currently this process can only discover MTD devices. +This patch leverages libfstools in a similar way as mount_root to +discover, initialize, and mount rootfs_data volume. It would enable any +device with non-MTD rootfs_data volume to support extroot, including x86. + +Signed-off-by: Qi Liu +--- + CMakeLists.txt | 4 ++-- + block.c | 40 ++++++++++++++++++++++++++++++++++++++++ + libfstools/fstype.h | 12 ++++++++++++ + libfstools/libfstools.h | 11 +---------- + 4 files changed, 55 insertions(+), 12 deletions(-) + create mode 100644 libfstools/fstype.h + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index a586577..4b6e3e7 100644 + +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -75,9 +75,9 @@ INSTALL(TARGETS blockd RUNTIME DESTINATION sbin) + ADD_EXECUTABLE(block block.c probe.c probe-libblkid.c) + IF(DEFINED CMAKE_UBIFS_EXTROOT) + ADD_DEFINITIONS(-DUBIFS_EXTROOT) +- TARGET_LINK_LIBRARIES(block blkid-tiny dl uci ubox ubus blobmsg_json ubi-utils ${json}) ++ TARGET_LINK_LIBRARIES(block fstools blkid-tiny dl uci ubox ubus blobmsg_json ubi-utils ${json}) + ELSE(DEFINED CMAKE_UBIFS_EXTROOT) +- TARGET_LINK_LIBRARIES(block blkid-tiny dl uci ubox ubus blobmsg_json ${json}) ++ TARGET_LINK_LIBRARIES(block fstools blkid-tiny dl uci ubox ubus blobmsg_json ${json}) + ENDIF(DEFINED CMAKE_UBIFS_EXTROOT) + INSTALL(TARGETS block RUNTIME DESTINATION sbin) + +diff --git a/block.c b/block.c +index 569bf56..66cce46 100644 +--- a/block.c ++++ b/block.c +@@ -45,6 +45,8 @@ + #include + #include + ++#include "libfstools/fstype.h" ++#include "libfstools/volume.h" + #include "probe.h" + + #define AUTOFS_MOUNT_PATH "/tmp/run/blockd/" +@@ -1590,6 +1592,44 @@ static int main_extroot(int argc, char **argv) + } + #endif + ++ /* Find volume using libfstools */ ++ struct volume *data = volume_find("rootfs_data"); ++ if (data) { ++ volume_init(data); ++ ++ switch (volume_identify(data)) { ++ case FS_EXT4: { ++ char cfg[] = "/tmp/ext4_cfg"; ++ ++ /* Mount volume and try extroot (using fstab from that vol) */ ++ mkdir_p(cfg); ++ if (!mount(data->blk, cfg, "ext4", MS_NOATIME, NULL)) { ++ err = mount_extroot(cfg); ++ umount2(cfg, MNT_DETACH); ++ } ++ if (err < 0) ++ rmdir("/tmp/overlay"); ++ rmdir(cfg); ++ return err; ++ } ++ ++ case FS_F2FS: { ++ char cfg[] = "/tmp/f2fs_cfg"; ++ ++ /* Mount volume and try extroot (using fstab from that vol) */ ++ mkdir_p(cfg); ++ if (!mount(data->blk, cfg, "f2fs", MS_NOATIME, NULL)) { ++ err = mount_extroot(cfg); ++ umount2(cfg, MNT_DETACH); ++ } ++ if (err < 0) ++ rmdir("/tmp/overlay"); ++ rmdir(cfg); ++ return err; ++ } ++ } ++ } ++ + /* As a last resort look for /etc/config/fstab on "rootfs" partition */ + return mount_extroot(NULL); + } +diff --git a/libfstools/fstype.h b/libfstools/fstype.h +new file mode 100644 +index 0000000..8882343 +--- /dev/null ++++ b/libfstools/fstype.h +@@ -0,0 +1,12 @@ ++#ifndef _FS_TYPE_H__ ++#define _FS_TYPE_H__ ++enum { ++ FS_NONE, ++ FS_SNAPSHOT, ++ FS_JFFS2, ++ FS_DEADCODE, ++ FS_UBIFS, ++ FS_F2FS, ++ FS_EXT4, ++}; ++#endif +\ No newline at end of file +diff --git a/libfstools/libfstools.h b/libfstools/libfstools.h +index f27307a..8d3362f 100644 +--- a/libfstools/libfstools.h ++++ b/libfstools/libfstools.h +@@ -18,19 +18,10 @@ + #include + #include + #include ++#include "fstype.h" + + struct volume; + +-enum { +- FS_NONE, +- FS_SNAPSHOT, +- FS_JFFS2, +- FS_DEADCODE, +- FS_UBIFS, +- FS_F2FS, +- FS_EXT4, +-}; +- + enum fs_state { + FS_STATE_UNKNOWN, + FS_STATE_PENDING,