[PATCH] fstools: support extroot for non-MTD rootfs_data

liuqi_colin at msn.com liuqi_colin at msn.com
Sun Aug 16 02:57:52 EDT 2020


From: Qi Liu <liuqi_colin at msn.com>

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 <liuqi_colin at msn.com>
---
 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 <libubox/avl-cmp.h>
 #include <libubus.h>
 
+#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 <libubox/blob.h>
 #include <libubox/ulog.h>
 #include <libubox/utils.h>
+#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,
-- 
2.24.3 (Apple Git-128)




More information about the openwrt-devel mailing list