X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffstools.git;a=blobdiff_plain;f=mount_root.c;h=dffb0a6c48ee9d9581baba626359005c956f874d;hp=1df472357db4b033dc75e7e31e1b0d4426f35cd9;hb=633a8d0981fed0c90f6d16ee2257858b04514dc8;hpb=002fcb582d73f6d5c354a7f7d844fe87f07fe9d2 diff --git a/mount_root.c b/mount_root.c index 1df4723..dffb0a6 100644 --- a/mount_root.c +++ b/mount_root.c @@ -12,46 +12,74 @@ */ #include +#include +#include +#include #include #include +#include + #include "libfstools/libfstools.h" #include "libfstools/volume.h" +/* + * Called in the early (PREINIT) stage, when we immediately need some writable + * filesystem. + */ static int start(int argc, char *argv[1]) { - struct volume *v = volume_find("rootfs_data"); + struct volume *root; + struct volume *data = volume_find("rootfs_data"); + struct stat s; - if (!getenv("PREINIT")) + if (!getenv("PREINIT") && stat("/tmp/.preinit", &s)) return -1; - if (!v) { - v = volume_find("rootfs"); - volume_init(v); - fprintf(stderr, "mounting /dev/root\n"); + if (!data) { + root = volume_find("rootfs"); + volume_init(root); + ULOG_NOTE("mounting /dev/root\n"); mount("/dev/root", "/", NULL, MS_NOATIME | MS_REMOUNT, 0); - return 0; } + /* + * Before trying to mount and use "rootfs_data" let's check if there is + * extroot configured. Following call will handle reading config from + * the "rootfs_data" on its own. + */ extroot_prefix = ""; if (!mount_extroot()) { - fprintf(stderr, "fs-state: switched to extroot\n"); + ULOG_NOTE("switched to extroot\n"); return 0; } - switch (volume_identify(v)) { + /* There isn't extroot, so just try to mount "rootfs_data" */ + volume_init(data); + switch (volume_identify(data)) { case FS_NONE: + ULOG_WARN("no usable overlay filesystem found, using tmpfs overlay\n"); + return ramoverlay(); + case FS_DEADCODE: + /* + * Filesystem isn't ready yet and we are in the preinit, so we + * can't afford waiting for it. Use tmpfs for now and handle it + * properly in the "done" call. + */ + ULOG_NOTE("jffs2 not ready yet, using temporary tmpfs overlay\n"); return ramoverlay(); + case FS_EXT4: + case FS_F2FS: case FS_JFFS2: case FS_UBIFS: - mount_overlay(); + mount_overlay(data); break; case FS_SNAPSHOT: - mount_snapshot(); + mount_snapshot(data); break; } @@ -67,6 +95,9 @@ stop(int argc, char *argv[1]) return 0; } +/* + * Called at the end of init, it can wait for filesystem if needed. + */ static int done(int argc, char *argv[1]) { @@ -78,7 +109,14 @@ done(int argc, char *argv[1]) switch (volume_identify(v)) { case FS_NONE: case FS_DEADCODE: - return jffs2_switch(argc, argv); + return jffs2_switch(v); + + case FS_EXT4: + case FS_F2FS: + case FS_JFFS2: + case FS_UBIFS: + fs_state_set("/overlay", FS_STATE_READY); + break; } return 0; @@ -88,6 +126,8 @@ int main(int argc, char **argv) { if (argc < 2) return start(argc, argv); + if (!strcmp(argv[1], "ram")) + return ramoverlay(); if (!strcmp(argv[1], "stop")) return stop(argc, argv); if (!strcmp(argv[1], "done"))