X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmount.c;h=8528d17a804ffa9d796872c06bbeeca7319d4156;hb=cd25cce98f5cc930202212c3c9c13605c09698b4;hp=1f311cee41cf3f243d4b0c3cb703411956fd4e99;hpb=0a494f1ff323ef36b7acc637c198fdfa240c2bb2;p=elogind.git diff --git a/src/mount.c b/src/mount.c index 1f311cee4..8528d17a8 100644 --- a/src/mount.c +++ b/src/mount.c @@ -37,6 +37,7 @@ #include "special.h" #include "bus-errors.h" #include "exit-status.h" +#include "def.h" static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = { [MOUNT_DEAD] = UNIT_INACTIVE, @@ -289,9 +290,13 @@ static int mount_add_target_links(Mount *m) { noauto = !!mount_test_option(p->options, MNTOPT_NOAUTO); nofail = !!mount_test_option(p->options, "nofail"); - handle = !!mount_test_option(p->options, "comment=systemd.mount") || + handle = + mount_test_option(p->options, "comment=systemd.mount") || + mount_test_option(p->options, "x-systemd-mount") || m->meta.manager->mount_auto; - automount = !!mount_test_option(p->options, "comment=systemd.automount"); + automount = + mount_test_option(p->options, "comment=systemd.automount") || + mount_test_option(p->options, "x-systemd-automount"); if (mount_test_option(p->options, "_netdev") || (p->fstype && fstype_is_network(p->fstype))) { @@ -306,7 +311,7 @@ static int mount_add_target_links(Mount *m) { return r; if (after) - if ((r = unit_add_dependency_by_name(tu, UNIT_AFTER, after, NULL, true)) < 0) + if ((r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, after, NULL, true)) < 0) return r; if (automount && m->meta.manager->running_as == MANAGER_SYSTEM) { @@ -408,9 +413,22 @@ static int mount_add_default_dependencies(Mount *m) { if (m->meta.manager->running_as == MANAGER_SYSTEM && !path_equal(m->where, "/")) { + MountParameters *p; - if ((r = unit_add_dependency_by_name(UNIT(m), UNIT_BEFORE, SPECIAL_QUOTACHECK_SERVICE, NULL, true)) < 0) - return r; + if (m->from_fragment) + p = &m->parameters_fragment; + else if (m->from_etc_fstab) + p = &m->parameters_etc_fstab; + else + p = NULL; + + if (!p || + (!mount_test_option(p->options, "_netdev") && + !(p->fstype && fstype_is_network(p->fstype)) && + (mount_test_option(p->options, "usrquota") || mount_test_option(p->options, "grpquota")))) + if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTACHECK_SERVICE, NULL, true)) < 0 || + (r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTAON_SERVICE, NULL, true)) < 0) + return r; if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true)) < 0) return r; @@ -466,6 +484,9 @@ static int mount_load(Unit *u) { /* This is a new unit? Then let's add in some extras */ if (u->meta.load_state == UNIT_LOADED) { + if ((r = unit_add_exec_dependencies(u, &m->exec_context)) < 0) + return r; + if (m->meta.fragment_path) m->from_fragment = true; @@ -726,9 +747,7 @@ static void mount_enter_signal(Mount *m, MountState state, bool success) { state == MOUNT_REMOUNTING_SIGTERM) ? m->exec_context.kill_signal : SIGKILL; if (m->control_pid > 0) { - if (kill(m->exec_context.kill_mode == KILL_PROCESS_GROUP ? - -m->control_pid : - m->control_pid, sig) < 0 && errno != ESRCH) + if (kill_and_sigcont(m->control_pid, sig) < 0 && errno != ESRCH) log_warning("Failed to kill control process %li: %m", (long) m->control_pid); else @@ -747,7 +766,7 @@ static void mount_enter_signal(Mount *m, MountState state, bool success) { if ((r = set_put(pid_set, LONG_TO_PTR(m->control_pid))) < 0) goto fail; - if ((r = cgroup_bonding_kill_list(m->meta.cgroup_bondings, sig, pid_set)) < 0) { + if ((r = cgroup_bonding_kill_list(m->meta.cgroup_bondings, sig, true, pid_set)) < 0) { if (r != -EAGAIN && r != -ESRCH && r != -ENOENT) log_warning("Failed to kill control group: %s", strerror(-r)); } else if (r > 0) @@ -823,6 +842,10 @@ static void mount_enter_mounting(Mount *m) { mkdir_p(m->where, m->directory_mode); + /* create the source directory for bind-mounts if needed */ + if (m->parameters_fragment.fstype && strcmp(m->parameters_fragment.fstype, "bind") == 0) + mkdir_p(m->parameters_fragment.what, m->directory_mode); + if (m->from_fragment) r = exec_command_set( m->control_command, @@ -1659,7 +1682,7 @@ static int mount_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError } if (m->control_pid > 0) - if (kill(mode == KILL_PROCESS_GROUP ? -m->control_pid : m->control_pid, signo) < 0) + if (kill(m->control_pid, signo) < 0) r = -errno; if (mode == KILL_CONTROL_GROUP) { @@ -1675,7 +1698,7 @@ static int mount_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError goto finish; } - if ((q = cgroup_bonding_kill_list(m->meta.cgroup_bondings, signo, pid_set)) < 0) + if ((q = cgroup_bonding_kill_list(m->meta.cgroup_bondings, signo, false, pid_set)) < 0) if (r != -EAGAIN && r != -ESRCH && r != -ENOENT) r = q; }