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, 0755); + 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, 0755); + 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,13 @@ +#ifndef _FS_TYPE_H__ +#define _FS_TYPE_H__ +enum { + FS_NONE, + FS_SNAPSHOT, + FS_JFFS2, + FS_DEADCODE, + FS_UBIFS, + FS_F2FS, + FS_EXT4, + FS_TARGZ, +}; +#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,20 +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, - FS_TARGZ, -}; - enum fs_state { FS_STATE_UNKNOWN, FS_STATE_PENDING,