X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmount.c;h=f978a5467d2f542e76046f7292ecafa8168585b0;hb=867b3b7d6b88ba4d07ec7c830576d4ac2f7dd226;hp=d62ce8f40893de885c2ce8b54344cdcfe2e77269;hpb=b81884e7466b8e8bc1261b1b1a722d11694b8c54;p=elogind.git diff --git a/src/mount.c b/src/mount.c index d62ce8f40..f978a5467 100644 --- a/src/mount.c +++ b/src/mount.c @@ -36,6 +36,7 @@ #include "dbus-mount.h" #include "special.h" #include "bus-errors.h" +#include "exit-status.h" static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = { [MOUNT_DEAD] = UNIT_INACTIVE, @@ -265,7 +266,7 @@ static int mount_add_target_links(Mount *m) { MountParameters *p; Unit *tu; int r; - bool noauto, handle, automount; + bool noauto, nofail, handle, automount; assert(m); @@ -277,6 +278,7 @@ static int mount_add_target_links(Mount *m) { return 0; noauto = !!mount_test_option(p->options, MNTOPT_NOAUTO); + nofail = !!mount_test_option(p->options, "nofail"); handle = !!mount_test_option(p->options, "comment=systemd.mount") || m->meta.manager->mount_auto; automount = !!mount_test_option(p->options, "comment=systemd.automount"); @@ -309,6 +311,7 @@ static int mount_add_target_links(Mount *m) { /* Automatically add mount points that aren't natively * configured to local-fs.target */ if (!noauto && + !nofail && handle && m->from_etc_fstab && m->meta.manager->running_as == MANAGER_SYSTEM) @@ -398,7 +401,7 @@ static int mount_add_default_dependencies(Mount *m) { if ((r = unit_add_dependency_by_name(UNIT(m), UNIT_BEFORE, SPECIAL_QUOTACHECK_SERVICE, NULL, true)) < 0) return r; - if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTED_BY, SPECIAL_UMOUNT_TARGET, NULL, true)) < 0) + if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true)) < 0) return r; } @@ -486,7 +489,7 @@ static int mount_load(Unit *u) { if ((r = mount_add_target_links(m)) < 0) return r; - if ((r = unit_add_default_cgroup(u)) < 0) + if ((r = unit_add_default_cgroups(u)) < 0) return r; if (m->meta.default_dependencies) @@ -552,7 +555,8 @@ static void mount_set_state(Mount *m, MountState state) { mount_state_to_string(old_state), mount_state_to_string(state)); - unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state]); + unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state], !m->reload_failure); + m->reload_failure = false; } static int mount_coldplug(Unit *u) { @@ -908,7 +912,8 @@ static void mount_enter_remounting(Mount *m, bool success) { fail: log_warning("%s failed to run 'remount' task: %s", m->meta.id, strerror(-r)); - mount_enter_mounted(m, false); + m->reload_failure = true; + mount_enter_mounted(m, true); } static int mount_start(Unit *u) { @@ -1096,9 +1101,6 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) { case MOUNT_MOUNTING_DONE: case MOUNT_MOUNTING_SIGKILL: case MOUNT_MOUNTING_SIGTERM: - case MOUNT_REMOUNTING: - case MOUNT_REMOUNTING_SIGKILL: - case MOUNT_REMOUNTING_SIGTERM: if (success) mount_enter_mounted(m, true); @@ -1108,6 +1110,18 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) { mount_enter_dead(m, false); break; + case MOUNT_REMOUNTING: + case MOUNT_REMOUNTING_SIGKILL: + case MOUNT_REMOUNTING_SIGTERM: + + m->reload_failure = !success; + if (m->from_proc_self_mountinfo) + mount_enter_mounted(m, true); + else + mount_enter_dead(m, true); + + break; + case MOUNT_UNMOUNTING: case MOUNT_UNMOUNTING_SIGKILL: case MOUNT_UNMOUNTING_SIGTERM: @@ -1145,7 +1159,8 @@ static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) { case MOUNT_REMOUNTING: log_warning("%s remounting timed out. Stopping.", u->meta.id); - mount_enter_signal(m, MOUNT_REMOUNTING_SIGTERM, false); + m->reload_failure = true; + mount_enter_mounted(m, true); break; case MOUNT_UNMOUNTING: @@ -1154,18 +1169,45 @@ static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) { break; case MOUNT_MOUNTING_SIGTERM: - log_warning("%s mounting timed out. Killing.", u->meta.id); - mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, false); + if (m->exec_context.send_sigkill) { + log_warning("%s mounting timed out. Killing.", u->meta.id); + mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, false); + } else { + log_warning("%s mounting timed out. Skipping SIGKILL. Ignoring.", u->meta.id); + + if (m->from_proc_self_mountinfo) + mount_enter_mounted(m, false); + else + mount_enter_dead(m, false); + } break; case MOUNT_REMOUNTING_SIGTERM: - log_warning("%s remounting timed out. Killing.", u->meta.id); - mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, false); + if (m->exec_context.send_sigkill) { + log_warning("%s remounting timed out. Killing.", u->meta.id); + mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, false); + } else { + log_warning("%s remounting timed out. Skipping SIGKILL. Ignoring.", u->meta.id); + + if (m->from_proc_self_mountinfo) + mount_enter_mounted(m, false); + else + mount_enter_dead(m, false); + } break; case MOUNT_UNMOUNTING_SIGTERM: - log_warning("%s unmounting timed out. Killing.", u->meta.id); - mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, false); + if (m->exec_context.send_sigkill) { + log_warning("%s unmounting timed out. Killing.", u->meta.id); + mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, false); + } else { + log_warning("%s unmounting timed out. Skipping SIGKILL. Ignoring.", u->meta.id); + + if (m->from_proc_self_mountinfo) + mount_enter_mounted(m, false); + else + mount_enter_dead(m, false); + } break; case MOUNT_MOUNTING_SIGKILL: @@ -1211,6 +1253,8 @@ static int mount_add_one( * dependencies ever. */ if (mount_point_is_api(where)) return 0; + if (mount_point_ignore(where)) + return 0; if (streq(fstype, "autofs")) return 0; @@ -1295,56 +1339,6 @@ fail: return r; } -static char *fstab_node_to_udev_node(char *p) { - char *dn, *t, *u; - int r; - - /* FIXME: to follow udev's logic 100% we need to leave valid - * UTF8 chars unescaped */ - - if (startswith(p, "LABEL=")) { - - if (!(u = unquote(p+6, "\"\'"))) - return NULL; - - t = xescape(u, "/ "); - free(u); - - if (!t) - return NULL; - - r = asprintf(&dn, "/dev/disk/by-label/%s", t); - free(t); - - if (r < 0) - return NULL; - - return dn; - } - - if (startswith(p, "UUID=")) { - - if (!(u = unquote(p+5, "\"\'"))) - return NULL; - - t = xescape(u, "/ "); - free(u); - - if (!t) - return NULL; - - r = asprintf(&dn, "/dev/disk/by-uuid/%s", ascii_strlower(t)); - free(t); - - if (r < 0) - return NULL; - - return dn; - } - - return strdup(p); -} - static int mount_find_pri(char *options) { char *end, *pri; unsigned long r;