/* * Called in the early (PREINIT) stage, when we immediately need some writable * filesystem. */ static int start(int argc, char *argv[1]) { struct volume *root; struct volume *data = volume_find("rootfs_data"); if (!getenv("PREINIT")) return -1; if (!data) { root = volume_find("rootfs"); volume_init(root); ULOG_NOTE("mounting /dev/root\n"); mount("/dev/root", "/", NULL, MS_NOATIME | MS_REMOUNT, 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()) { ULOG_NOTE("switched to extroot\n"); return 0; } /* There isn't extroot, so just try to mount "rootfs_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_JFFS2: case FS_UBIFS: mount_overlay(data); break; case FS_SNAPSHOT: mount_snapshot(data); break; } return 0; }
static int start(int argc, char *argv[1]) { struct volume *v = volume_find("rootfs_data"); if (!getenv("PREINIT")) return -1; if (!v) { v = volume_find("rootfs"); volume_init(v); fprintf(stderr, "mounting /dev/root\n"); mount("/dev/root", "/", NULL, MS_NOATIME | MS_REMOUNT, 0); return 0; } extroot_prefix = ""; if (!mount_extroot()) { fprintf(stderr, "fs-state: switched to extroot\n"); return 0; } switch (volume_identify(v)) { case FS_NONE: case FS_DEADCODE: return ramoverlay(); case FS_JFFS2: case FS_UBIFS: mount_overlay(); break; case FS_SNAPSHOT: mount_snapshot(); break; } return 0; }