/* * 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; }
static int done(int argc, char *argv[1]) { struct volume *v = volume_find("rootfs_data"); if (!v) return -1; switch (volume_identify(v)) { case FS_NONE: case FS_DEADCODE: return jffs2_switch(argc, argv); } return 0; }
/* * Called at the end of init, it can wait for filesystem if needed. */ static int done(int argc, char *argv[1]) { struct volume *v = volume_find("rootfs_data"); if (!v) return -1; switch (volume_identify(v)) { case FS_NONE: case FS_DEADCODE: return jffs2_switch(v); case FS_JFFS2: case FS_UBIFS: fs_state_set("/overlay", FS_STATE_READY); break; } return 0; }
int main(int argc, char **argv) { struct volume *v; int ch, yes = 0, reset = 0; while ((ch = getopt(argc, argv, "yr")) != -1) { switch(ch) { case 'y': yes = 1; break; case 'r': reset = 1; break; } } if (!yes && ask_user()) return -1; /* * TODO: Currently this only checks if kernel supports OverlayFS. We * should check if there is a mount point using it with rootfs_data * as upperdir. */ if (find_filesystem("overlay")) { ULOG_ERR("overlayfs not supported by kernel\n"); return -1; } v = volume_find("rootfs_data"); if (!v) { ULOG_ERR("MTD partition 'rootfs_data' not found\n"); return -1; } volume_init(v); if (!strcmp(*argv, "jffs2mark")) return jffs2_mark(v); return jffs2_reset(v, reset); }