X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Ffsck.c;h=19ca75311ba50dbbfe20cadf81bbd12538e89f59;hp=96dea660a9be5871c94ceff09b625f3130d7f6bd;hb=0e456f978134100d2e0cc28c7205b3abefcc9cde;hpb=ef1de59b5e1d509cf3c619bd2c4975009aba1dd6 diff --git a/src/fsck.c b/src/fsck.c index 96dea660a..19ca75311 100644 --- a/src/fsck.c +++ b/src/fsck.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -39,7 +40,7 @@ static bool arg_force = false; static void start_target(const char *target, bool isolate) { DBusMessage *m = NULL, *reply = NULL; DBusError error; - const char *mode, *base_target = "base.target"; + const char *mode, *basic_target = "basic.target"; DBusConnection *bus = NULL; assert(target); @@ -56,7 +57,7 @@ static void start_target(const char *target, bool isolate) { else mode = "replace"; - log_debug("Running request %s/start/%s", target, mode); + log_info("Running request %s/start/%s", target, mode); if (!(m = dbus_message_new_method_call("org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartUnitReplace"))) { log_error("Could not allocate message."); @@ -66,7 +67,7 @@ static void start_target(const char *target, bool isolate) { /* Start these units only if we can replace base.target with it */ if (!dbus_message_append_args(m, - DBUS_TYPE_STRING, &base_target, + DBUS_TYPE_STRING, &basic_target, DBUS_TYPE_STRING, &target, DBUS_TYPE_STRING, &mode, DBUS_TYPE_INVALID)) { @@ -105,6 +106,9 @@ static int parse_proc_cmdline(void) { int r; size_t l; + if (detect_container(NULL) > 0) + return 0; + if ((r = read_one_line_file("/proc/cmdline", &line)) < 0) { log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); return 0; @@ -120,7 +124,7 @@ static int parse_proc_cmdline(void) { arg_skip = true; else if (startswith(w, "fsck.mode")) log_warning("Invalid fsck.mode= parameter. Ignoring."); -#ifdef TARGET_FEDORA +#if defined(TARGET_FEDORA) || defined(TARGET_MANDRIVA) else if (strneq(w, "fastboot", l)) arg_skip = true; else if (strneq(w, "forcefsck", l)) @@ -141,7 +145,7 @@ static void test_files(void) { } int main(int argc, char *argv[]) { - const char *cmdline[7]; + const char *cmdline[8]; int i = 0, r = EXIT_FAILURE, q; pid_t pid; siginfo_t status; @@ -170,6 +174,7 @@ int main(int argc, char *argv[]) { root_directory = false; } else { struct stat st; + struct timespec times[2]; /* Find root device */ @@ -182,6 +187,14 @@ int main(int argc, char *argv[]) { if (major(st.st_dev) == 0) return 0; + /* check if we are already writable */ + times[0] = st.st_atim; + times[1] = st.st_mtim; + if (utimensat(AT_FDCWD, "/", times, 0) == 0) { + log_info("Root directory is writable, skipping check."); + return 0; + } + if (!(udev = udev_new())) { log_error("Out of memory"); goto finish; @@ -203,6 +216,7 @@ int main(int argc, char *argv[]) { cmdline[i++] = "/sbin/fsck"; cmdline[i++] = "-a"; cmdline[i++] = "-T"; + cmdline[i++] = "-l"; if (!root_directory) cmdline[i++] = "-M"; @@ -236,18 +250,22 @@ int main(int argc, char *argv[]) { else log_error("fsck failed due to unknown reason."); - if (status.si_code == CLD_EXITED && status.si_status & 2) + if (status.si_code == CLD_EXITED && (status.si_status & 2) && root_directory) /* System should be rebooted. */ start_target(SPECIAL_REBOOT_TARGET, false); - else + else if (status.si_code == CLD_EXITED && (status.si_status & 6)) /* Some other problem */ start_target(SPECIAL_EMERGENCY_TARGET, true); + else { + r = EXIT_SUCCESS; + log_warning("Ignoring error."); + } } else r = EXIT_SUCCESS; if (status.si_code == CLD_EXITED && (status.si_status & 1)) - touch("/dev/.systemd/quotacheck"); + touch("/run/systemd/quotacheck"); finish: if (udev_device)