From 4b499063acd64c7d5249a110d8eb7dc23d7b3e2b Mon Sep 17 00:00:00 2001 From: Scott Lamb Date: Wed, 21 Jul 2021 10:03:49 -0700 Subject: [PATCH] fsck: no emergency.target on nofail mounts Also describe failure behavior more precisely in the manpage. Fixes #20237. --- man/systemd-fsck@.service.xml | 15 ++++++++++++--- src/fsck/fsck.c | 7 ++----- units/systemd-fsck-root.service.in | 2 ++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/man/systemd-fsck@.service.xml b/man/systemd-fsck@.service.xml index 035382913f3..aa0d8b12aed 100644 --- a/man/systemd-fsck@.service.xml +++ b/man/systemd-fsck@.service.xml @@ -55,9 +55,18 @@ the filesystem should actually be checked based on the time since last check, number of mounts, unclean unmount, etc. - If a file system check fails for a service without - , emergency mode is activated, by isolating - to emergency.target. + systemd-fsck-root.service will activate + reboot.target if /sbin/fsck + returns the "System should reboot" condition, or + emergency.target if /sbin/fsck + returns the "Filesystem errors left uncorrected" condition. + + systemd-fsck@.service will fail if + /sbin/fsck returns with either "System should reboot" + or "Filesystem errors left uncorrected" conditions. For filesystems + listed in /etc/fstab without nofail + or noauto options, local-fs.target + will then activate emergency.target. diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c index cd7adfaeb96..745d01ff502 100644 --- a/src/fsck/fsck.c +++ b/src/fsck/fsck.c @@ -52,7 +52,7 @@ static void start_target(const char *target, const char *mode) { return; } - log_info("Running request %s/start/replace", target); + log_info("Running request %s/start/%s", target, mode); /* Start these units only if we can replace base.target with it */ r = sd_bus_call_method(bus, @@ -412,10 +412,7 @@ static int run(int argc, char *argv[]) { /* System should be rebooted. */ start_target(SPECIAL_REBOOT_TARGET, "replace-irreversibly"); return -EINVAL; - } else if (exit_status & (FSCK_SYSTEM_SHOULD_REBOOT | FSCK_ERRORS_LEFT_UNCORRECTED)) - /* Some other problem */ - start_target(SPECIAL_EMERGENCY_TARGET, "replace"); - else + } else if (!(exit_status & (FSCK_SYSTEM_SHOULD_REBOOT | FSCK_ERRORS_LEFT_UNCORRECTED))) log_warning("Ignoring error."); } diff --git a/units/systemd-fsck-root.service.in b/units/systemd-fsck-root.service.in index 6897f13159e..8378df84c71 100644 --- a/units/systemd-fsck-root.service.in +++ b/units/systemd-fsck-root.service.in @@ -14,6 +14,8 @@ DefaultDependencies=no Conflicts=shutdown.target Before=local-fs.target shutdown.target ConditionPathIsReadWrite=!/ +OnFailure=emergency.target +OnFailureJobMode=replace-irreversibly [Service] Type=oneshot