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=bfa35f2e56958a5f28c89e5b7be6c09142574227;hb=03aea2aecd6f9d2193af5d6cf866063da8d47ad5;hpb=70f12d37087721089a150fad985f0dca0f8af277;ds=sidebyside diff --git a/src/fsck.c b/src/fsck.c index bfa35f2e5..19ca75311 100644 --- a/src/fsck.c +++ b/src/fsck.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -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."); @@ -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)