1 /* 2 * Copyright (C) 2014 John Crispin <blogic@openwrt.org> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License version 2.1 6 * as published by the Free Software Foundation 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 */ 13 14 #include <sys/mount.h> 15 #include <sys/types.h> 16 #include <sys/stat.h> 17 #include <unistd.h> 18 #include <stdio.h> 19 #include <stdlib.h> 20 21 #include <libubox/ulog.h> 22 23 #include "libfstools/libfstools.h" 24 #include "libfstools/volume.h" 25 26 /* 27 * Called in the early (PREINIT) stage, when we immediately need some writable 28 * filesystem. 29 */ 30 static int 31 start(int argc, char *argv[1]) 32 { 33 struct volume *root; 34 struct volume *data = volume_find("rootfs_data"); 35 struct stat s; 36 37 if (!getenv("PREINIT") && stat("/tmp/.preinit", &s)) 38 return -1; 39 40 if (!data) { 41 root = volume_find("rootfs"); 42 volume_init(root); 43 ULOG_NOTE("mounting /dev/root\n"); 44 mount("/dev/root", "/", NULL, MS_NOATIME | MS_REMOUNT, 0); 45 } 46 47 /* Check for extroot config in rootfs before even trying rootfs_data */ 48 if (!mount_extroot("")) { 49 ULOG_NOTE("switched to extroot\n"); 50 return 0; 51 } 52 53 /* There isn't extroot, so just try to mount "rootfs_data" */ 54 volume_init(data); 55 switch (volume_identify(data)) { 56 case FS_NONE: 57 ULOG_WARN("no usable overlay filesystem found, using tmpfs overlay\n"); 58 return ramoverlay(); 59 60 case FS_DEADCODE: 61 /* 62 * Filesystem isn't ready yet and we are in the preinit, so we 63 * can't afford waiting for it. Use tmpfs for now and handle it 64 * properly in the "done" call. 65 */ 66 ULOG_NOTE("jffs2 not ready yet, using temporary tmpfs overlay\n"); 67 return ramoverlay(); 68 69 case FS_EXT4: 70 case FS_F2FS: 71 case FS_JFFS2: 72 case FS_UBIFS: 73 mount_overlay(data); 74 break; 75 76 case FS_SNAPSHOT: 77 mount_snapshot(data); 78 break; 79 } 80 81 return 0; 82 } 83 84 static int 85 stop(int argc, char *argv[1]) 86 { 87 if (!getenv("SHUTDOWN")) 88 return -1; 89 90 return 0; 91 } 92 93 /* 94 * Called at the end of init, it can wait for filesystem if needed. 95 */ 96 static int 97 done(int argc, char *argv[1]) 98 { 99 struct volume *v = volume_find("rootfs_data"); 100 101 if (!v) 102 return -1; 103 104 switch (volume_identify(v)) { 105 case FS_NONE: 106 case FS_DEADCODE: 107 return jffs2_switch(v); 108 109 case FS_EXT4: 110 case FS_F2FS: 111 case FS_JFFS2: 112 case FS_UBIFS: 113 fs_state_set("/overlay", FS_STATE_READY); 114 break; 115 } 116 117 return 0; 118 } 119 120 int main(int argc, char **argv) 121 { 122 if (argc < 2) 123 return start(argc, argv); 124 if (!strcmp(argv[1], "ram")) 125 return ramoverlay(); 126 if (!strcmp(argv[1], "stop")) 127 return stop(argc, argv); 128 if (!strcmp(argv[1], "done")) 129 return done(argc, argv); 130 return -1; 131 } 132
This page was automatically generated by LXR 0.3.1. • OpenWrt