summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/fsck/fsck.c40
-rw-r--r--src/fstab-generator/fstab-generator.c77
2 files changed, 82 insertions, 35 deletions
diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c
index c2e1c741d5..4f1aa22f9d 100644
--- a/src/fsck/fsck.c
+++ b/src/fsck/fsck.c
@@ -212,10 +212,11 @@ int main(int argc, char *argv[]) {
siginfo_t status;
_cleanup_udev_unref_ struct udev *udev = NULL;
_cleanup_udev_device_unref_ struct udev_device *udev_device = NULL;
- const char *device;
+ const char *device, *type;
bool root_directory;
int progress_pipe[2] = { -1, -1 };
char dash_c[2+10+1];
+ struct stat st;
if (argc > 2) {
log_error("This program expects one or no arguments.");
@@ -234,11 +235,27 @@ int main(int argc, char *argv[]) {
if (!arg_force && arg_skip)
return 0;
+ udev = udev_new();
+ if (!udev) {
+ log_oom();
+ return EXIT_FAILURE;
+ }
+
if (argc > 1) {
device = argv[1];
root_directory = false;
+
+ if (stat(device, &st) < 0) {
+ log_error("Failed to stat '%s': %m", device);
+ return EXIT_FAILURE;
+ }
+
+ udev_device = udev_device_new_from_devnum(udev, 'b', st.st_rdev);
+ if (!udev_device) {
+ log_error("Failed to detect device %s", device);
+ return EXIT_FAILURE;
+ }
} else {
- struct stat st;
struct timespec times[2];
/* Find root device */
@@ -260,12 +277,6 @@ int main(int argc, char *argv[]) {
return EXIT_SUCCESS;
}
- udev = udev_new();
- if (!udev) {
- log_oom();
- return EXIT_FAILURE;
- }
-
udev_device = udev_device_new_from_devnum(udev, 'b', st.st_dev);
if (!udev_device) {
log_error("Failed to detect root device.");
@@ -281,6 +292,19 @@ int main(int argc, char *argv[]) {
root_directory = true;
}
+ type = udev_device_get_property_value(udev_device, "ID_FS_TYPE");
+ if (type) {
+ const char *checker = strappenda("/sbin/fsck.", type);
+ r = access(checker, X_OK);
+ if (r < 0) {
+ if (errno == ENOENT) {
+ log_info("%s doesn't exist, not checking file system.", checker);
+ return EXIT_SUCCESS;
+ } else
+ log_warning("%s cannot be used: %m", checker);
+ }
+ }
+
if (arg_show_progress)
if (pipe(progress_pipe) < 0) {
log_error("pipe(): %m");
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();