summaryrefslogtreecommitdiff
path: root/src/fstab-generator
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-11-12 00:53:59 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-11-15 22:53:14 -0500
commit94192cdaf652c9717f15274504ed315126c07a93 (patch)
treef516c284f8ac20132cb0f62d41a1634f40cb7fac /src/fstab-generator
parente375825da0cbdbf3be755c277f9c0dec35b41a09 (diff)
fsck,fstab-generator: be lenient about missing fsck.<type>
If fstab contains 1 for passno, treat this as an error, but only warn briefly. If fstab doesn't contain this information, don't complain at all. Patch is complicated a bit by the fact that we might have the fstype specified in fstab or on /proc/cmdline, in which case we can check if we have the appropriate fsck tool, or not specified, or specified as auto, in which case we have to look and check the type of the filesystem ourselves. It cannot be done before the device appears, so it is too early in the generator phase, and it must be done directly in fsck service.
Diffstat (limited to 'src/fstab-generator')
-rw-r--r--src/fstab-generator/fstab-generator.c77
1 files changed, 50 insertions, 27 deletions
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index 96b0906149..fa0d3f735e 100644
--- a/src/fstab-generator/fstab-generator.c
+++ b/src/fstab-generator/fstab-generator.c
@@ -146,6 +146,52 @@ static bool mount_in_initrd(struct mntent *me) {
streq(me->mnt_dir, "/usr");
}
+static int add_fsck(FILE *f, const char *what, const char *where, const char *type, int passno) {
+ assert(f);
+
+ if (passno == 0)
+ return 0;
+
+ if (type && !streq(type, "auto")) {
+ int r;
+ const char *checker;
+
+ checker = strappenda("/sbin/fsck.", type);
+ r = access(checker, X_OK);
+ if (r < 0) {
+ log_warning("Checking was requested for %s, but %s cannot be used: %m", what, checker);
+
+ /* treat missing check as essentially OK */
+ return errno == ENOENT ? 0 : -errno;
+ }
+ }
+
+ if (streq(where, "/")) {
+ char *lnk;
+
+ lnk = strappenda(arg_dest, "/" SPECIAL_LOCAL_FS_TARGET ".wants/systemd-fsck-root.service");
+ mkdir_parents_label(lnk, 0755);
+ if (symlink("systemd-fsck-root.service", lnk) < 0) {
+ log_error("Failed to create symlink %s: %m", lnk);
+ return -errno;
+ }
+ } else {
+ _cleanup_free_ char *fsck = NULL;
+
+ fsck = unit_name_from_path_instance("systemd-fsck", what, ".service");
+ if (!fsck)
+ return log_oom();
+
+ fprintf(f,
+ "Requires=%s\n"
+ "After=%s\n",
+ fsck,
+ fsck);
+ }
+
+ return 0;
+}
+
static int add_mount(
const char *what,
const char *where,
@@ -161,6 +207,7 @@ static int add_mount(
*name = NULL, *unit = NULL, *lnk = NULL,
*automount_name = NULL, *automount_unit = NULL;
_cleanup_fclose_ FILE *f = NULL;
+ int r;
assert(what);
assert(where);
@@ -208,32 +255,9 @@ static int add_mount(
"Before=%s\n",
post);
- if (passno > 0) {
- if (streq(where, "/")) {
- lnk = strjoin(arg_dest, "/", SPECIAL_LOCAL_FS_TARGET, ".wants/", "systemd-fsck-root.service", NULL);
- if (!lnk)
- return log_oom();
-
- mkdir_parents_label(lnk, 0755);
- if (symlink("systemd-fsck-root.service", lnk) < 0) {
- log_error("Failed to create symlink %s: %m", lnk);
- return -errno;
- }
- } else {
- _cleanup_free_ char *fsck = NULL;
-
- fsck = unit_name_from_path_instance("systemd-fsck", what, ".service");
- if (!fsck)
- return log_oom();
-
- fprintf(f,
- "Requires=%s\n"
- "After=%s\n",
- fsck,
- fsck);
- }
- }
-
+ r = add_fsck(f, what, where, type, passno);
+ if (r < 0)
+ return r;
fprintf(f,
"\n"
@@ -259,7 +283,6 @@ static int add_mount(
if (!noauto) {
if (post) {
- free(lnk);
lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL);
if (!lnk)
return log_oom();