chiark / gitweb /
Do no isolate in case of emergency or severe problems
authorDr. Tilmann Bubeck <t.bubeck@reinform.de>
Fri, 4 May 2012 08:32:47 +0000 (10:32 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 2 Apr 2013 03:43:48 +0000 (23:43 -0400)
This patch changes local-fs.target and systemd-fsck to not use
"isolate" when going into emergency.
This fixes https://bugzilla.redhat.com/show_bug.cgi?id=810722

The motivation is, that when something wents wrong, we should
keep everything as it is, to let the user fix the problem. When
isolating we stop a lot of services and therefore change the
system heavily so that it gets harder for the user to fix.

An example is a crypted partition. When the fsck in a crypted
partition fails, it previously used "emergency/start/isolate"
which stops cryptsetup. Therefore if the user tries to fsck
e.g. /dev/mapper/luks-356c20ae-c7a2-4f1c-ae1d-1d290a91b691
as printed by the failing fsck, then it will not find this
device (because it got closed).

So please apply this patch to let the user see the failing
situation.

Thanks!

[zj: removed dead isolate param from start_target().]

https://bugs.freedesktop.org/show_bug.cgi?id=49463
https://bugzilla.redhat.com/show_bug.cgi?id=810722

src/fsck/fsck.c
units/local-fs.target

index f692b3a8d3e338c10984f6baef21f8e5e143b6c5..f298cf7b9ab82d2f5f00c9a655d34942e94d9b4b 100644 (file)
@@ -41,10 +41,10 @@ static bool arg_skip = false;
 static bool arg_force = false;
 static bool arg_show_progress = false;
 
-static void start_target(const char *target, bool isolate) {
+static void start_target(const char *target) {
         DBusMessage *m = NULL, *reply = NULL;
         DBusError error;
-        const char *mode, *basic_target = "basic.target";
+        const char *mode = "replace", *basic_target = "basic.target";
         DBusConnection *bus = NULL;
 
         assert(target);
@@ -56,11 +56,6 @@ static void start_target(const char *target, bool isolate) {
                 goto finish;
         }
 
-        if (isolate)
-                mode = "isolate";
-        else
-                mode = "replace";
-
         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"))) {
@@ -389,10 +384,10 @@ int main(int argc, char *argv[]) {
 
                 if (status.si_code == CLD_EXITED && (status.si_status & 2) && root_directory)
                         /* System should be rebooted. */
-                        start_target(SPECIAL_REBOOT_TARGET, false);
+                        start_target(SPECIAL_REBOOT_TARGET);
                 else if (status.si_code == CLD_EXITED && (status.si_status & 6))
                         /* Some other problem */
-                        start_target(SPECIAL_EMERGENCY_TARGET, true);
+                        start_target(SPECIAL_EMERGENCY_TARGET);
                 else {
                         r = EXIT_SUCCESS;
                         log_warning("Ignoring error.");
index ee02e4e98861c21fec163ba9b9dbc9eec80172bf..18c3d74f1865ecbea9606a8f0e3cce901c382ac9 100644 (file)
@@ -10,4 +10,4 @@ Description=Local File Systems
 Documentation=man:systemd.special(7)
 After=local-fs-pre.target
 OnFailure=emergency.target
-OnFailureIsolate=yes
+OnFailureIsolate=no