1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 #include <sys/epoll.h>
30 #include "load-fragment.h"
31 #include "load-dropin.h"
35 #include "path-util.h"
36 #include "mount-setup.h"
37 #include "unit-name.h"
38 #include "dbus-mount.h"
40 #include "bus-errors.h"
41 #include "exit-status.h"
44 static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = {
45 [MOUNT_DEAD] = UNIT_INACTIVE,
46 [MOUNT_MOUNTING] = UNIT_ACTIVATING,
47 [MOUNT_MOUNTING_DONE] = UNIT_ACTIVE,
48 [MOUNT_MOUNTED] = UNIT_ACTIVE,
49 [MOUNT_REMOUNTING] = UNIT_RELOADING,
50 [MOUNT_UNMOUNTING] = UNIT_DEACTIVATING,
51 [MOUNT_MOUNTING_SIGTERM] = UNIT_DEACTIVATING,
52 [MOUNT_MOUNTING_SIGKILL] = UNIT_DEACTIVATING,
53 [MOUNT_REMOUNTING_SIGTERM] = UNIT_RELOADING,
54 [MOUNT_REMOUNTING_SIGKILL] = UNIT_RELOADING,
55 [MOUNT_UNMOUNTING_SIGTERM] = UNIT_DEACTIVATING,
56 [MOUNT_UNMOUNTING_SIGKILL] = UNIT_DEACTIVATING,
57 [MOUNT_FAILED] = UNIT_FAILED
60 static void mount_init(Unit *u) {
64 assert(u->load_state == UNIT_STUB);
66 m->timeout_usec = DEFAULT_TIMEOUT_USEC;
67 m->directory_mode = 0755;
69 exec_context_init(&m->exec_context);
71 if (unit_has_name(u, "-.mount")) {
72 /* Don't allow start/stop for root directory */
73 UNIT(m)->refuse_manual_start = true;
74 UNIT(m)->refuse_manual_stop = true;
76 /* The stdio/kmsg bridge socket is on /, in order to avoid a
77 * dep loop, don't use kmsg logging for -.mount */
78 m->exec_context.std_output = u->manager->default_std_output;
79 m->exec_context.std_error = u->manager->default_std_error;
82 kill_context_init(&m->kill_context);
84 /* We need to make sure that /bin/mount is always called in
85 * the same process group as us, so that the autofs kernel
86 * side doesn't send us another mount request while we are
87 * already trying to comply its last one. */
88 m->exec_context.same_pgrp = true;
90 m->timer_watch.type = WATCH_INVALID;
92 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
94 UNIT(m)->ignore_on_isolate = true;
97 static void mount_unwatch_control_pid(Mount *m) {
100 if (m->control_pid <= 0)
103 unit_unwatch_pid(UNIT(m), m->control_pid);
107 static void mount_parameters_done(MountParameters *p) {
114 p->what = p->options = p->fstype = NULL;
117 static void mount_done(Unit *u) {
125 mount_parameters_done(&m->parameters_proc_self_mountinfo);
126 mount_parameters_done(&m->parameters_fragment);
128 exec_context_done(&m->exec_context);
129 exec_command_done_array(m->exec_command, _MOUNT_EXEC_COMMAND_MAX);
130 m->control_command = NULL;
132 mount_unwatch_control_pid(m);
134 unit_unwatch_timer(u, &m->timer_watch);
137 static MountParameters* get_mount_parameters_fragment(Mount *m) {
140 if (m->from_fragment)
141 return &m->parameters_fragment;
146 static MountParameters* get_mount_parameters(Mount *m) {
149 if (m->from_proc_self_mountinfo)
150 return &m->parameters_proc_self_mountinfo;
152 return get_mount_parameters_fragment(m);
155 static int mount_add_mount_links(Mount *m) {
162 pm = get_mount_parameters_fragment(m);
164 /* Adds in links to other mount points that might lie below or
165 * above us in the hierarchy */
167 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_MOUNT]) {
168 Mount *n = MOUNT(other);
174 if (UNIT(n)->load_state != UNIT_LOADED)
177 pn = get_mount_parameters_fragment(n);
179 if (path_startswith(m->where, n->where)) {
181 if ((r = unit_add_dependency(UNIT(m), UNIT_AFTER, UNIT(n), true)) < 0)
185 if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0)
188 } else if (path_startswith(n->where, m->where)) {
190 if ((r = unit_add_dependency(UNIT(n), UNIT_AFTER, UNIT(m), true)) < 0)
194 if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0)
197 } else if (pm && pm->what && path_startswith(pm->what, n->where)) {
199 if ((r = unit_add_dependency(UNIT(m), UNIT_AFTER, UNIT(n), true)) < 0)
202 if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0)
205 } else if (pn && pn->what && path_startswith(pn->what, m->where)) {
207 if ((r = unit_add_dependency(UNIT(n), UNIT_AFTER, UNIT(m), true)) < 0)
210 if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0)
218 static int mount_add_swap_links(Mount *m) {
224 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_SWAP])
225 if ((r = swap_add_one_mount_link(SWAP(other), m)) < 0)
231 static int mount_add_path_links(Mount *m) {
237 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_PATH])
238 if ((r = path_add_one_mount_link(PATH(other), m)) < 0)
244 static int mount_add_automount_links(Mount *m) {
250 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_AUTOMOUNT])
251 if ((r = automount_add_one_mount_link(AUTOMOUNT(other), m)) < 0)
257 static int mount_add_socket_links(Mount *m) {
263 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_SOCKET])
264 if ((r = socket_add_one_mount_link(SOCKET(other), m)) < 0)
270 static int mount_add_requires_mounts_links(Mount *m) {
276 LIST_FOREACH(has_requires_mounts_for, other, UNIT(m)->manager->has_requires_mounts_for) {
277 r = unit_add_one_mount_link(other, m);
285 static char* mount_test_option(const char *haystack, const char *needle) {
290 /* Like glibc's hasmntopt(), but works on a string, not a
297 me.mnt_opts = (char*) haystack;
299 return hasmntopt(&me, needle);
302 static bool mount_is_network(MountParameters *p) {
305 if (mount_test_option(p->options, "_netdev"))
308 if (p->fstype && fstype_is_network(p->fstype))
314 static bool mount_is_bind(MountParameters *p) {
317 if (mount_test_option(p->options, "bind"))
320 if (p->fstype && streq(p->fstype, "bind"))
326 static bool needs_quota(MountParameters *p) {
329 if (mount_is_network(p))
332 if (mount_is_bind(p))
335 return mount_test_option(p->options, "usrquota") ||
336 mount_test_option(p->options, "grpquota") ||
337 mount_test_option(p->options, "quota") ||
338 mount_test_option(p->options, "usrjquota") ||
339 mount_test_option(p->options, "grpjquota");
342 static int mount_add_device_links(Mount *m) {
348 p = get_mount_parameters_fragment(m);
355 if (!mount_is_bind(p) &&
356 !path_equal(m->where, "/") &&
357 is_device_path(p->what)) {
358 r = unit_add_node_link(UNIT(m), p->what, false);
365 !path_equal(m->where, "/") &&
366 is_device_path(p->what) &&
367 UNIT(m)->manager->running_as == SYSTEMD_SYSTEM) {
370 /* Let's add in the fsck service */
372 /* aka SPECIAL_FSCK_SERVICE */
373 name = unit_name_from_path_instance("systemd-fsck", p->what, ".service");
377 r = manager_load_unit_prepare(UNIT(m)->manager, name, NULL, NULL, &fsck);
379 log_warning("Failed to prepare unit %s: %s", name, strerror(-r));
385 SERVICE(fsck)->fsck_passno = p->passno;
387 r = unit_add_two_dependencies(UNIT(m), UNIT_AFTER, UNIT_REQUIRES, fsck, true);
395 static int mount_add_quota_links(Mount *m) {
401 if (UNIT(m)->manager->running_as != SYSTEMD_SYSTEM)
404 p = get_mount_parameters_fragment(m);
411 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTACHECK_SERVICE, NULL, true);
415 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTAON_SERVICE, NULL, true);
422 static int mount_add_default_dependencies(Mount *m) {
429 if (UNIT(m)->manager->running_as != SYSTEMD_SYSTEM)
432 p = get_mount_parameters_fragment(m);
436 if (path_equal(m->where, "/"))
439 if (mount_is_network(p))
440 after = SPECIAL_REMOTE_FS_PRE_TARGET;
442 after = SPECIAL_LOCAL_FS_PRE_TARGET;
444 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_WANTS, UNIT_AFTER, after, NULL, true);
448 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
455 static int mount_fix_timeouts(Mount *m) {
457 const char *timeout = NULL;
466 p = get_mount_parameters_fragment(m);
470 /* Allow configuration how long we wait for a device that
471 * backs a mount point to show up. This is useful to support
472 * endless device timeouts for devices that show up only after
473 * user input, like crypto devices. */
475 if ((timeout = mount_test_option(p->options, "comment=systemd.device-timeout")))
477 else if ((timeout = mount_test_option(p->options, "x-systemd.device-timeout")))
482 t = strndup(timeout, strcspn(timeout, ",;" WHITESPACE));
486 r = parse_usec(t, &u);
490 log_warning("Failed to parse timeout for %s, ignoring: %s", m->where, timeout);
494 SET_FOREACH(other, UNIT(m)->dependencies[UNIT_AFTER], i) {
495 if (other->type != UNIT_DEVICE)
498 other->job_timeout = u;
504 static int mount_verify(Mount *m) {
509 if (UNIT(m)->load_state != UNIT_LOADED)
512 if (!m->from_fragment && !m->from_proc_self_mountinfo)
515 if (!(e = unit_name_from_path(m->where, ".mount")))
518 b = unit_has_name(UNIT(m), e);
522 log_error("%s's Where setting doesn't match unit name. Refusing.", UNIT(m)->id);
526 if (mount_point_is_api(m->where) || mount_point_ignore(m->where)) {
527 log_error("Cannot create mount unit for API file system %s. Refusing.", m->where);
531 if (UNIT(m)->fragment_path && !m->parameters_fragment.what) {
532 log_error("%s's What setting is missing. Refusing.", UNIT(m)->id);
536 if (m->exec_context.pam_name && m->kill_context.kill_mode != KILL_CONTROL_GROUP) {
537 log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(m)->id);
544 static int mount_add_extras(Mount *m) {
548 r = unit_add_exec_dependencies(u, &m->exec_context);
552 if (UNIT(m)->fragment_path)
553 m->from_fragment = true;
556 m->where = unit_name_to_path(u->id);
561 path_kill_slashes(m->where);
563 if (!UNIT(m)->description) {
564 r = unit_set_description(u, m->where);
569 r = mount_add_device_links(m);
573 r = mount_add_mount_links(m);
577 r = mount_add_socket_links(m);
581 r = mount_add_swap_links(m);
585 r = mount_add_path_links(m);
589 r = mount_add_requires_mounts_links(m);
593 r = mount_add_automount_links(m);
597 r = mount_add_quota_links(m);
601 if (UNIT(m)->default_dependencies) {
602 r = mount_add_default_dependencies(m);
607 r = unit_add_default_cgroups(u);
611 r = mount_fix_timeouts(m);
618 static int mount_load(Unit *u) {
623 assert(u->load_state == UNIT_STUB);
625 if (m->from_proc_self_mountinfo)
626 r = unit_load_fragment_and_dropin_optional(u);
628 r = unit_load_fragment_and_dropin(u);
633 /* This is a new unit? Then let's add in some extras */
634 if (u->load_state == UNIT_LOADED) {
635 r = mount_add_extras(m);
639 r = unit_exec_context_defaults(u, &m->exec_context);
644 return mount_verify(m);
647 static int mount_notify_automount(Mount *m, int status) {
654 SET_FOREACH(p, UNIT(m)->dependencies[UNIT_TRIGGERED_BY], i)
655 if (p->type == UNIT_AUTOMOUNT) {
656 r = automount_send_ready(AUTOMOUNT(p), status);
664 static void mount_set_state(Mount *m, MountState state) {
665 MountState old_state;
668 old_state = m->state;
671 if (state != MOUNT_MOUNTING &&
672 state != MOUNT_MOUNTING_DONE &&
673 state != MOUNT_REMOUNTING &&
674 state != MOUNT_UNMOUNTING &&
675 state != MOUNT_MOUNTING_SIGTERM &&
676 state != MOUNT_MOUNTING_SIGKILL &&
677 state != MOUNT_UNMOUNTING_SIGTERM &&
678 state != MOUNT_UNMOUNTING_SIGKILL &&
679 state != MOUNT_REMOUNTING_SIGTERM &&
680 state != MOUNT_REMOUNTING_SIGKILL) {
681 unit_unwatch_timer(UNIT(m), &m->timer_watch);
682 mount_unwatch_control_pid(m);
683 m->control_command = NULL;
684 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
687 if (state == MOUNT_MOUNTED ||
688 state == MOUNT_REMOUNTING)
689 mount_notify_automount(m, 0);
690 else if (state == MOUNT_DEAD ||
691 state == MOUNT_UNMOUNTING ||
692 state == MOUNT_MOUNTING_SIGTERM ||
693 state == MOUNT_MOUNTING_SIGKILL ||
694 state == MOUNT_REMOUNTING_SIGTERM ||
695 state == MOUNT_REMOUNTING_SIGKILL ||
696 state == MOUNT_UNMOUNTING_SIGTERM ||
697 state == MOUNT_UNMOUNTING_SIGKILL ||
698 state == MOUNT_FAILED) {
699 if (state != old_state)
700 mount_notify_automount(m, -ENODEV);
703 if (state != old_state)
704 log_debug("%s changed %s -> %s",
706 mount_state_to_string(old_state),
707 mount_state_to_string(state));
709 unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state], m->reload_result == MOUNT_SUCCESS);
710 m->reload_result = MOUNT_SUCCESS;
713 static int mount_coldplug(Unit *u) {
715 MountState new_state = MOUNT_DEAD;
719 assert(m->state == MOUNT_DEAD);
721 if (m->deserialized_state != m->state)
722 new_state = m->deserialized_state;
723 else if (m->from_proc_self_mountinfo)
724 new_state = MOUNT_MOUNTED;
726 if (new_state != m->state) {
728 if (new_state == MOUNT_MOUNTING ||
729 new_state == MOUNT_MOUNTING_DONE ||
730 new_state == MOUNT_REMOUNTING ||
731 new_state == MOUNT_UNMOUNTING ||
732 new_state == MOUNT_MOUNTING_SIGTERM ||
733 new_state == MOUNT_MOUNTING_SIGKILL ||
734 new_state == MOUNT_UNMOUNTING_SIGTERM ||
735 new_state == MOUNT_UNMOUNTING_SIGKILL ||
736 new_state == MOUNT_REMOUNTING_SIGTERM ||
737 new_state == MOUNT_REMOUNTING_SIGKILL) {
739 if (m->control_pid <= 0)
742 if ((r = unit_watch_pid(UNIT(m), m->control_pid)) < 0)
745 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
749 mount_set_state(m, new_state);
755 static void mount_dump(Unit *u, FILE *f, const char *prefix) {
762 p = get_mount_parameters(m);
765 "%sMount State: %s\n"
769 "%sFile System Type: %s\n"
771 "%sFrom /proc/self/mountinfo: %s\n"
772 "%sFrom fragment: %s\n"
773 "%sDirectoryMode: %04o\n",
774 prefix, mount_state_to_string(m->state),
775 prefix, mount_result_to_string(m->result),
777 prefix, strna(p->what),
778 prefix, strna(p->fstype),
779 prefix, strna(p->options),
780 prefix, yes_no(m->from_proc_self_mountinfo),
781 prefix, yes_no(m->from_fragment),
782 prefix, m->directory_mode);
784 if (m->control_pid > 0)
786 "%sControl PID: %lu\n",
787 prefix, (unsigned long) m->control_pid);
789 exec_context_dump(&m->exec_context, f, prefix);
790 kill_context_dump(&m->kill_context, f, prefix);
793 static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
801 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
804 if ((r = exec_spawn(c,
808 UNIT(m)->manager->environment,
812 UNIT(m)->manager->confirm_spawn,
813 UNIT(m)->cgroup_bondings,
814 UNIT(m)->cgroup_attributes,
821 if ((r = unit_watch_pid(UNIT(m), pid)) < 0)
822 /* FIXME: we need to do something here */
830 unit_unwatch_timer(UNIT(m), &m->timer_watch);
835 static void mount_enter_dead(Mount *m, MountResult f) {
838 if (f != MOUNT_SUCCESS)
841 mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD);
844 static void mount_enter_mounted(Mount *m, MountResult f) {
847 if (f != MOUNT_SUCCESS)
850 mount_set_state(m, MOUNT_MOUNTED);
853 static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
856 bool wait_for_exit = false;
860 if (f != MOUNT_SUCCESS)
863 if (m->kill_context.kill_mode != KILL_NONE) {
864 int sig = (state == MOUNT_MOUNTING_SIGTERM ||
865 state == MOUNT_UNMOUNTING_SIGTERM ||
866 state == MOUNT_REMOUNTING_SIGTERM) ? m->kill_context.kill_signal : SIGKILL;
868 if (m->control_pid > 0) {
869 if (kill_and_sigcont(m->control_pid, sig) < 0 && errno != ESRCH)
871 log_warning("Failed to kill control process %li: %m", (long) m->control_pid);
873 wait_for_exit = true;
876 if (m->kill_context.kill_mode == KILL_CONTROL_GROUP) {
878 if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
883 /* Exclude the control pid from being killed via the cgroup */
884 if (m->control_pid > 0)
885 if ((r = set_put(pid_set, LONG_TO_PTR(m->control_pid))) < 0)
888 r = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, sig, true, false, pid_set, NULL);
890 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
891 log_warning("Failed to kill control group: %s", strerror(-r));
893 wait_for_exit = true;
901 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
904 mount_set_state(m, state);
905 } else if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
906 mount_enter_mounted(m, MOUNT_SUCCESS);
908 mount_enter_dead(m, MOUNT_SUCCESS);
913 log_warning("%s failed to kill processes: %s", UNIT(m)->id, strerror(-r));
915 if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
916 mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
918 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
924 static void mount_enter_unmounting(Mount *m) {
929 m->control_command_id = MOUNT_EXEC_UNMOUNT;
930 m->control_command = m->exec_command + MOUNT_EXEC_UNMOUNT;
932 if ((r = exec_command_set(
939 mount_unwatch_control_pid(m);
941 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
944 mount_set_state(m, MOUNT_UNMOUNTING);
949 log_warning("%s failed to run 'umount' task: %s", UNIT(m)->id, strerror(-r));
950 mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
953 static void mount_enter_mounting(Mount *m) {
959 m->control_command_id = MOUNT_EXEC_MOUNT;
960 m->control_command = m->exec_command + MOUNT_EXEC_MOUNT;
962 mkdir_p_label(m->where, m->directory_mode);
964 if (dir_is_empty(m->where) <= 0)
965 log_notice("%s: Directory %s to mount over is not empty, mounting anyway. (To see the over-mounted files, please manually mount the underlying file system to a secondary location.)", m->meta.id, m->where);
967 /* Create the source directory for bind-mounts if needed */
968 p = get_mount_parameters_fragment(m);
969 if (p && mount_is_bind(p))
970 mkdir_p_label(p->what, m->directory_mode);
972 if (m->from_fragment)
973 r = exec_command_set(
976 m->parameters_fragment.what,
978 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
979 m->parameters_fragment.options ? "-o" : NULL, m->parameters_fragment.options,
987 mount_unwatch_control_pid(m);
989 r = mount_spawn(m, m->control_command, &m->control_pid);
993 mount_set_state(m, MOUNT_MOUNTING);
998 log_warning("%s failed to run 'mount' task: %s", UNIT(m)->id, strerror(-r));
999 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
1002 static void mount_enter_mounting_done(Mount *m) {
1005 mount_set_state(m, MOUNT_MOUNTING_DONE);
1008 static void mount_enter_remounting(Mount *m) {
1013 m->control_command_id = MOUNT_EXEC_REMOUNT;
1014 m->control_command = m->exec_command + MOUNT_EXEC_REMOUNT;
1016 if (m->from_fragment) {
1020 if (m->parameters_fragment.options) {
1021 if (!(buf = strappend("remount,", m->parameters_fragment.options))) {
1030 r = exec_command_set(
1033 m->parameters_fragment.what,
1035 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
1046 mount_unwatch_control_pid(m);
1048 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
1051 mount_set_state(m, MOUNT_REMOUNTING);
1056 log_warning("%s failed to run 'remount' task: %s", UNIT(m)->id, strerror(-r));
1057 m->reload_result = MOUNT_FAILURE_RESOURCES;
1058 mount_enter_mounted(m, MOUNT_SUCCESS);
1061 static int mount_start(Unit *u) {
1062 Mount *m = MOUNT(u);
1066 /* We cannot fulfill this request right now, try again later
1068 if (m->state == MOUNT_UNMOUNTING ||
1069 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1070 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1071 m->state == MOUNT_MOUNTING_SIGTERM ||
1072 m->state == MOUNT_MOUNTING_SIGKILL)
1075 /* Already on it! */
1076 if (m->state == MOUNT_MOUNTING)
1079 assert(m->state == MOUNT_DEAD || m->state == MOUNT_FAILED);
1081 m->result = MOUNT_SUCCESS;
1082 m->reload_result = MOUNT_SUCCESS;
1084 mount_enter_mounting(m);
1088 static int mount_stop(Unit *u) {
1089 Mount *m = MOUNT(u);
1094 if (m->state == MOUNT_UNMOUNTING ||
1095 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1096 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1097 m->state == MOUNT_MOUNTING_SIGTERM ||
1098 m->state == MOUNT_MOUNTING_SIGKILL)
1101 assert(m->state == MOUNT_MOUNTING ||
1102 m->state == MOUNT_MOUNTING_DONE ||
1103 m->state == MOUNT_MOUNTED ||
1104 m->state == MOUNT_REMOUNTING ||
1105 m->state == MOUNT_REMOUNTING_SIGTERM ||
1106 m->state == MOUNT_REMOUNTING_SIGKILL);
1108 mount_enter_unmounting(m);
1112 static int mount_reload(Unit *u) {
1113 Mount *m = MOUNT(u);
1117 if (m->state == MOUNT_MOUNTING_DONE)
1120 assert(m->state == MOUNT_MOUNTED);
1122 mount_enter_remounting(m);
1126 static int mount_serialize(Unit *u, FILE *f, FDSet *fds) {
1127 Mount *m = MOUNT(u);
1133 unit_serialize_item(u, f, "state", mount_state_to_string(m->state));
1134 unit_serialize_item(u, f, "result", mount_result_to_string(m->result));
1135 unit_serialize_item(u, f, "reload-result", mount_result_to_string(m->reload_result));
1137 if (m->control_pid > 0)
1138 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) m->control_pid);
1140 if (m->control_command_id >= 0)
1141 unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(m->control_command_id));
1146 static int mount_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1147 Mount *m = MOUNT(u);
1154 if (streq(key, "state")) {
1157 if ((state = mount_state_from_string(value)) < 0)
1158 log_debug("Failed to parse state value %s", value);
1160 m->deserialized_state = state;
1161 } else if (streq(key, "result")) {
1164 f = mount_result_from_string(value);
1166 log_debug("Failed to parse result value %s", value);
1167 else if (f != MOUNT_SUCCESS)
1170 } else if (streq(key, "reload-result")) {
1173 f = mount_result_from_string(value);
1175 log_debug("Failed to parse reload result value %s", value);
1176 else if (f != MOUNT_SUCCESS)
1177 m->reload_result = f;
1179 } else if (streq(key, "control-pid")) {
1182 if (parse_pid(value, &pid) < 0)
1183 log_debug("Failed to parse control-pid value %s", value);
1185 m->control_pid = pid;
1186 } else if (streq(key, "control-command")) {
1187 MountExecCommand id;
1189 if ((id = mount_exec_command_from_string(value)) < 0)
1190 log_debug("Failed to parse exec-command value %s", value);
1192 m->control_command_id = id;
1193 m->control_command = m->exec_command + id;
1197 log_debug("Unknown serialization key '%s'", key);
1202 static UnitActiveState mount_active_state(Unit *u) {
1205 return state_translation_table[MOUNT(u)->state];
1208 static const char *mount_sub_state_to_string(Unit *u) {
1211 return mount_state_to_string(MOUNT(u)->state);
1214 static bool mount_check_gc(Unit *u) {
1215 Mount *m = MOUNT(u);
1219 return m->from_proc_self_mountinfo;
1222 static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1223 Mount *m = MOUNT(u);
1229 if (pid != m->control_pid)
1234 if (is_clean_exit(code, status, NULL))
1236 else if (code == CLD_EXITED)
1237 f = MOUNT_FAILURE_EXIT_CODE;
1238 else if (code == CLD_KILLED)
1239 f = MOUNT_FAILURE_SIGNAL;
1240 else if (code == CLD_DUMPED)
1241 f = MOUNT_FAILURE_CORE_DUMP;
1243 assert_not_reached("Unknown code");
1245 if (f != MOUNT_SUCCESS)
1248 if (m->control_command) {
1249 exec_status_exit(&m->control_command->exec_status, &m->exec_context, pid, code, status);
1251 m->control_command = NULL;
1252 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
1255 log_full(f == MOUNT_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
1256 "%s mount process exited, code=%s status=%i", u->id, sigchld_code_to_string(code), status);
1258 /* Note that mount(8) returning and the kernel sending us a
1259 * mount table change event might happen out-of-order. If an
1260 * operation succeed we assume the kernel will follow soon too
1261 * and already change into the resulting state. If it fails
1262 * we check if the kernel still knows about the mount. and
1263 * change state accordingly. */
1267 case MOUNT_MOUNTING:
1268 case MOUNT_MOUNTING_DONE:
1269 case MOUNT_MOUNTING_SIGKILL:
1270 case MOUNT_MOUNTING_SIGTERM:
1272 if (f == MOUNT_SUCCESS)
1273 mount_enter_mounted(m, f);
1274 else if (m->from_proc_self_mountinfo)
1275 mount_enter_mounted(m, f);
1277 mount_enter_dead(m, f);
1280 case MOUNT_REMOUNTING:
1281 case MOUNT_REMOUNTING_SIGKILL:
1282 case MOUNT_REMOUNTING_SIGTERM:
1284 m->reload_result = f;
1285 if (m->from_proc_self_mountinfo)
1286 mount_enter_mounted(m, MOUNT_SUCCESS);
1288 mount_enter_dead(m, MOUNT_SUCCESS);
1292 case MOUNT_UNMOUNTING:
1293 case MOUNT_UNMOUNTING_SIGKILL:
1294 case MOUNT_UNMOUNTING_SIGTERM:
1296 if (f == MOUNT_SUCCESS)
1297 mount_enter_dead(m, f);
1298 else if (m->from_proc_self_mountinfo)
1299 mount_enter_mounted(m, f);
1301 mount_enter_dead(m, f);
1305 assert_not_reached("Uh, control process died at wrong time.");
1308 /* Notify clients about changed exit status */
1309 unit_add_to_dbus_queue(u);
1312 static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
1313 Mount *m = MOUNT(u);
1316 assert(elapsed == 1);
1317 assert(w == &m->timer_watch);
1321 case MOUNT_MOUNTING:
1322 case MOUNT_MOUNTING_DONE:
1323 log_warning("%s mounting timed out. Stopping.", u->id);
1324 mount_enter_signal(m, MOUNT_MOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1327 case MOUNT_REMOUNTING:
1328 log_warning("%s remounting timed out. Stopping.", u->id);
1329 m->reload_result = MOUNT_FAILURE_TIMEOUT;
1330 mount_enter_mounted(m, MOUNT_SUCCESS);
1333 case MOUNT_UNMOUNTING:
1334 log_warning("%s unmounting timed out. Stopping.", u->id);
1335 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1338 case MOUNT_MOUNTING_SIGTERM:
1339 if (m->kill_context.send_sigkill) {
1340 log_warning("%s mounting timed out. Killing.", u->id);
1341 mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1343 log_warning("%s mounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1345 if (m->from_proc_self_mountinfo)
1346 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1348 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1352 case MOUNT_REMOUNTING_SIGTERM:
1353 if (m->kill_context.send_sigkill) {
1354 log_warning("%s remounting timed out. Killing.", u->id);
1355 mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1357 log_warning("%s remounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1359 if (m->from_proc_self_mountinfo)
1360 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1362 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1366 case MOUNT_UNMOUNTING_SIGTERM:
1367 if (m->kill_context.send_sigkill) {
1368 log_warning("%s unmounting timed out. Killing.", u->id);
1369 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1371 log_warning("%s unmounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1373 if (m->from_proc_self_mountinfo)
1374 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1376 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1380 case MOUNT_MOUNTING_SIGKILL:
1381 case MOUNT_REMOUNTING_SIGKILL:
1382 case MOUNT_UNMOUNTING_SIGKILL:
1383 log_warning("%s mount process still around after SIGKILL. Ignoring.", u->id);
1385 if (m->from_proc_self_mountinfo)
1386 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1388 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1392 assert_not_reached("Timeout at wrong time.");
1396 static int mount_add_one(
1400 const char *options,
1407 char *e, *w = NULL, *o = NULL, *f = NULL;
1416 /* Ignore API mount points. They should never be referenced in
1417 * dependencies ever. */
1418 if (mount_point_is_api(where) || mount_point_ignore(where))
1421 if (streq(fstype, "autofs"))
1424 /* probably some kind of swap, ignore */
1425 if (!is_path(where))
1428 e = unit_name_from_path(where, ".mount");
1432 u = manager_get_unit(m, e);
1436 u = unit_new(m, sizeof(Mount));
1442 r = unit_add_name(u, e);
1448 MOUNT(u)->where = strdup(where);
1449 if (!MOUNT(u)->where) {
1454 unit_add_to_load_queue(u);
1459 if (u->load_state == UNIT_ERROR) {
1460 u->load_state = UNIT_LOADED;
1462 r = mount_add_extras(MOUNT(u));
1468 if (!(w = strdup(what)) ||
1469 !(o = strdup(options)) ||
1470 !(f = strdup(fstype))) {
1475 p = &MOUNT(u)->parameters_proc_self_mountinfo;
1477 MOUNT(u)->is_mounted = true;
1478 MOUNT(u)->just_mounted = !MOUNT(u)->from_proc_self_mountinfo;
1479 MOUNT(u)->just_changed = !streq_ptr(p->options, o);
1482 MOUNT(u)->from_proc_self_mountinfo = true;
1495 unit_add_to_dbus_queue(u);
1510 static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
1513 char *device, *path, *options, *options2, *fstype, *d, *p, *o;
1517 rewind(m->proc_self_mountinfo);
1522 device = path = options = options2 = fstype = d = p = o = NULL;
1524 if ((k = fscanf(m->proc_self_mountinfo,
1525 "%*s " /* (1) mount id */
1526 "%*s " /* (2) parent id */
1527 "%*s " /* (3) major:minor */
1528 "%*s " /* (4) root */
1529 "%ms " /* (5) mount point */
1530 "%ms" /* (6) mount options */
1531 "%*[^-]" /* (7) optional fields */
1532 "- " /* (8) separator */
1533 "%ms " /* (9) file system type */
1534 "%ms" /* (10) mount source */
1535 "%ms" /* (11) mount options 2 */
1536 "%*[^\n]", /* some rubbish at the end */
1546 log_warning("Failed to parse /proc/self/mountinfo:%u.", i);
1550 o = strjoin(options, ",", options2, NULL);
1556 if (!(d = cunescape(device)) ||
1557 !(p = cunescape(path))) {
1562 if ((k = mount_add_one(m, d, p, o, fstype, 0, set_flags)) < 0)
1589 static void mount_shutdown(Manager *m) {
1592 if (m->proc_self_mountinfo) {
1593 fclose(m->proc_self_mountinfo);
1594 m->proc_self_mountinfo = NULL;
1598 static int mount_enumerate(Manager *m) {
1600 struct epoll_event ev;
1603 if (!m->proc_self_mountinfo) {
1604 if (!(m->proc_self_mountinfo = fopen("/proc/self/mountinfo", "re")))
1607 m->mount_watch.type = WATCH_MOUNT;
1608 m->mount_watch.fd = fileno(m->proc_self_mountinfo);
1611 ev.events = EPOLLPRI;
1612 ev.data.ptr = &m->mount_watch;
1614 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->mount_watch.fd, &ev) < 0)
1618 if ((r = mount_load_proc_self_mountinfo(m, false)) < 0)
1628 void mount_fd_event(Manager *m, int events) {
1633 assert(events & EPOLLPRI);
1635 /* The manager calls this for every fd event happening on the
1636 * /proc/self/mountinfo file, which informs us about mounting
1639 if ((r = mount_load_proc_self_mountinfo(m, true)) < 0) {
1640 log_error("Failed to reread /proc/self/mountinfo: %s", strerror(-r));
1642 /* Reset flags, just in case, for later calls */
1643 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1644 Mount *mount = MOUNT(u);
1646 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1652 manager_dispatch_load_queue(m);
1654 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1655 Mount *mount = MOUNT(u);
1657 if (!mount->is_mounted) {
1658 /* This has just been unmounted. */
1660 mount->from_proc_self_mountinfo = false;
1662 switch (mount->state) {
1665 mount_enter_dead(mount, MOUNT_SUCCESS);
1669 mount_set_state(mount, mount->state);
1674 } else if (mount->just_mounted || mount->just_changed) {
1676 /* New or changed mount entry */
1678 switch (mount->state) {
1682 mount_enter_mounted(mount, MOUNT_SUCCESS);
1685 case MOUNT_MOUNTING:
1686 mount_enter_mounting_done(mount);
1690 /* Nothing really changed, but let's
1691 * issue an notification call
1692 * nonetheless, in case somebody is
1693 * waiting for this. (e.g. file system
1694 * ro/rw remounts.) */
1695 mount_set_state(mount, mount->state);
1700 /* Reset the flags for later calls */
1701 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1705 static void mount_reset_failed(Unit *u) {
1706 Mount *m = MOUNT(u);
1710 if (m->state == MOUNT_FAILED)
1711 mount_set_state(m, MOUNT_DEAD);
1713 m->result = MOUNT_SUCCESS;
1714 m->reload_result = MOUNT_SUCCESS;
1717 static int mount_kill(Unit *u, KillWho who, int signo, DBusError *error) {
1718 Mount *m = MOUNT(u);
1720 Set *pid_set = NULL;
1724 if (who == KILL_MAIN) {
1725 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "Mount units have no main processes");
1729 if (m->control_pid <= 0 && who == KILL_CONTROL) {
1730 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
1734 if (who == KILL_CONTROL || who == KILL_ALL)
1735 if (m->control_pid > 0)
1736 if (kill(m->control_pid, signo) < 0)
1739 if (who == KILL_ALL) {
1742 pid_set = set_new(trivial_hash_func, trivial_compare_func);
1746 /* Exclude the control pid from being killed via the cgroup */
1747 if (m->control_pid > 0) {
1748 q = set_put(pid_set, LONG_TO_PTR(m->control_pid));
1755 q = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, signo, false, false, pid_set, NULL);
1756 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
1767 static const char* const mount_state_table[_MOUNT_STATE_MAX] = {
1768 [MOUNT_DEAD] = "dead",
1769 [MOUNT_MOUNTING] = "mounting",
1770 [MOUNT_MOUNTING_DONE] = "mounting-done",
1771 [MOUNT_MOUNTED] = "mounted",
1772 [MOUNT_REMOUNTING] = "remounting",
1773 [MOUNT_UNMOUNTING] = "unmounting",
1774 [MOUNT_MOUNTING_SIGTERM] = "mounting-sigterm",
1775 [MOUNT_MOUNTING_SIGKILL] = "mounting-sigkill",
1776 [MOUNT_REMOUNTING_SIGTERM] = "remounting-sigterm",
1777 [MOUNT_REMOUNTING_SIGKILL] = "remounting-sigkill",
1778 [MOUNT_UNMOUNTING_SIGTERM] = "unmounting-sigterm",
1779 [MOUNT_UNMOUNTING_SIGKILL] = "unmounting-sigkill",
1780 [MOUNT_FAILED] = "failed"
1783 DEFINE_STRING_TABLE_LOOKUP(mount_state, MountState);
1785 static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = {
1786 [MOUNT_EXEC_MOUNT] = "ExecMount",
1787 [MOUNT_EXEC_UNMOUNT] = "ExecUnmount",
1788 [MOUNT_EXEC_REMOUNT] = "ExecRemount",
1791 DEFINE_STRING_TABLE_LOOKUP(mount_exec_command, MountExecCommand);
1793 static const char* const mount_result_table[_MOUNT_RESULT_MAX] = {
1794 [MOUNT_SUCCESS] = "success",
1795 [MOUNT_FAILURE_RESOURCES] = "resources",
1796 [MOUNT_FAILURE_TIMEOUT] = "timeout",
1797 [MOUNT_FAILURE_EXIT_CODE] = "exit-code",
1798 [MOUNT_FAILURE_SIGNAL] = "signal",
1799 [MOUNT_FAILURE_CORE_DUMP] = "core-dump"
1802 DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult);
1804 const UnitVTable mount_vtable = {
1805 .object_size = sizeof(Mount),
1806 .exec_context_offset = offsetof(Mount, exec_context),
1814 .no_instances = true,
1820 .coldplug = mount_coldplug,
1824 .start = mount_start,
1826 .reload = mount_reload,
1830 .serialize = mount_serialize,
1831 .deserialize_item = mount_deserialize_item,
1833 .active_state = mount_active_state,
1834 .sub_state_to_string = mount_sub_state_to_string,
1836 .check_gc = mount_check_gc,
1838 .sigchld_event = mount_sigchld_event,
1839 .timer_event = mount_timer_event,
1841 .reset_failed = mount_reset_failed,
1843 .bus_interface = "org.freedesktop.systemd1.Mount",
1844 .bus_message_handler = bus_mount_message_handler,
1845 .bus_invalidating_properties = bus_mount_invalidating_properties,
1847 .enumerate = mount_enumerate,
1848 .shutdown = mount_shutdown,
1850 .status_message_formats = {
1851 .starting_stopping = {
1852 [0] = "Mounting %s...",
1853 [1] = "Unmounting %s...",
1855 .finished_start_job = {
1856 [JOB_DONE] = "Mounted %s.",
1857 [JOB_FAILED] = "Failed to mount %s.",
1858 [JOB_DEPENDENCY] = "Dependency failed for %s.",
1859 [JOB_TIMEOUT] = "Timed out mounting %s.",
1861 .finished_stop_job = {
1862 [JOB_DONE] = "Unmounted %s.",
1863 [JOB_FAILED] = "Failed unmounting %s.",
1864 [JOB_TIMEOUT] = "Timed out unmounting %s.",