9fc0f6
From 8610788332cb6492d8e5275b32200db4138401bb Mon Sep 17 00:00:00 2001
9fc0f6
From: Tom Gundersen <teg@jklm.no>
9fc0f6
Date: Sat, 19 Oct 2013 11:38:42 +0200
9fc0f6
Subject: [PATCH] fsck-root: only run when requested in fstab
9fc0f6
9fc0f6
fsck-root is redundant in case an initrd is used, or in case the rootfs
9fc0f6
is never remounted 'rw', so the new default is the correct behavior for
9fc0f6
most users. For the rest, they should enable it in fstab.
9fc0f6
---
9fc0f6
 Makefile.am                           |  1 -
9fc0f6
 man/systemd-fsck@.service.xml         |  4 +++-
9fc0f6
 src/fstab-generator/fstab-generator.c | 31 ++++++++++++++++++++++---------
9fc0f6
 3 files changed, 25 insertions(+), 11 deletions(-)
9fc0f6
9fc0f6
diff --git a/Makefile.am b/Makefile.am
9fc0f6
index df63275..fa2fba6 100644
9fc0f6
--- a/Makefile.am
9fc0f6
+++ b/Makefile.am
9fc0f6
@@ -4415,7 +4415,6 @@ SYSINIT_TARGET_WANTS += \
9fc0f6
 	systemd-update-utmp.service
9fc0f6
 LOCAL_FS_TARGET_WANTS += \
9fc0f6
 	systemd-remount-fs.service \
9fc0f6
-	systemd-fsck-root.service \
9fc0f6
 	tmp.mount
9fc0f6
 MULTI_USER_TARGET_WANTS += \
9fc0f6
 	getty.target \
9fc0f6
diff --git a/man/systemd-fsck@.service.xml b/man/systemd-fsck@.service.xml
9fc0f6
index 17bd1c0..811392b 100644
9fc0f6
--- a/man/systemd-fsck@.service.xml
9fc0f6
+++ b/man/systemd-fsck@.service.xml
9fc0f6
@@ -63,7 +63,9 @@
9fc0f6
                 check. <filename>systemd-fsck-root.service</filename> is
9fc0f6
                 responsible for file system checks on the root
9fc0f6
                 file system. The root file system check is performed
9fc0f6
-                before the other file systems.</para>
9fc0f6
+                before the other file systems. Either service is enabled
9fc0f6
+                at boot if passno in <filename>/etc/fstab</filename> for
9fc0f6
+                the filesystem is set to a value greater than zero.</para>
9fc0f6
 
9fc0f6
                 <para><filename>systemd-fsck</filename> will
9fc0f6
                 forward file system checking progress to the
9fc0f6
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
9fc0f6
index 7874ff1..c0c2992 100644
9fc0f6
--- a/src/fstab-generator/fstab-generator.c
9fc0f6
+++ b/src/fstab-generator/fstab-generator.c
9fc0f6
@@ -210,17 +210,29 @@ static int add_mount(
9fc0f6
                         post);
9fc0f6
 
9fc0f6
         if (passno > 0) {
9fc0f6
-                _cleanup_free_ char *fsck = NULL;
9fc0f6
+                if (streq(where, "/")) {
9fc0f6
+                        lnk = strjoin(arg_dest, "/", SPECIAL_LOCAL_FS_TARGET, ".wants/", "systemd-fsck-root.service", NULL);
9fc0f6
+                        if (!lnk)
9fc0f6
+                                return log_oom();
9fc0f6
 
9fc0f6
-                fsck = unit_name_from_path_instance("systemd-fsck", what, ".service");
9fc0f6
-                if (!fsck)
9fc0f6
-                        return log_oom();
9fc0f6
+                        mkdir_parents_label(lnk, 0755);
9fc0f6
+                        if (symlink("systemd-fsck-root.service", lnk) < 0) {
9fc0f6
+                                log_error("Failed to create symlink %s: %m", lnk);
9fc0f6
+                                return -errno;
9fc0f6
+                        }
9fc0f6
+                } else {
9fc0f6
+                        _cleanup_free_ char *fsck = NULL;
9fc0f6
 
9fc0f6
-                fprintf(f,
9fc0f6
-                        "Requires=%s\n"
9fc0f6
-                        "After=%s\n",
9fc0f6
-                        fsck,
9fc0f6
-                        fsck);
9fc0f6
+                        fsck = unit_name_from_path_instance("systemd-fsck", what, ".service");
9fc0f6
+                        if (!fsck)
9fc0f6
+                                return log_oom();
9fc0f6
+
9fc0f6
+                        fprintf(f,
9fc0f6
+                                "Requires=%s\n"
9fc0f6
+                                "After=%s\n",
9fc0f6
+                                fsck,
9fc0f6
+                                fsck);
9fc0f6
+                }
9fc0f6
         }
9fc0f6
 
9fc0f6
 
9fc0f6
@@ -248,6 +260,7 @@ static int add_mount(
9fc0f6
 
9fc0f6
         if (!noauto) {
9fc0f6
                 if (post) {
9fc0f6
+                        free(lnk);
9fc0f6
                         lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL);
9fc0f6
                         if (!lnk)
9fc0f6
                                 return log_oom();