• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/fstools/mount_root.c

  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