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))
358 if (!is_device_path(p->what))
361 if (path_equal(m->where, "/"))
364 r = unit_add_node_link(UNIT(m), p->what, false);
369 UNIT(m)->manager->running_as == SYSTEMD_SYSTEM) {
372 /* Let's add in the fsck service */
374 /* aka SPECIAL_FSCK_SERVICE */
375 name = unit_name_from_path_instance("systemd-fsck", p->what, ".service");
379 r = manager_load_unit_prepare(UNIT(m)->manager, name, NULL, NULL, &fsck);
381 log_warning("Failed to prepare unit %s: %s", name, strerror(-r));
387 SERVICE(fsck)->fsck_passno = p->passno;
389 r = unit_add_two_dependencies(UNIT(m), UNIT_AFTER, UNIT_REQUIRES, fsck, true);
397 static int mount_add_quota_links(Mount *m) {
403 if (UNIT(m)->manager->running_as != SYSTEMD_SYSTEM)
406 p = get_mount_parameters_fragment(m);
413 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTACHECK_SERVICE, NULL, true);
417 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTAON_SERVICE, NULL, true);
424 static int mount_add_default_dependencies(Mount *m) {
431 if (UNIT(m)->manager->running_as != SYSTEMD_SYSTEM)
434 p = get_mount_parameters_fragment(m);
438 if (path_equal(m->where, "/"))
441 if (mount_is_network(p))
442 after = SPECIAL_REMOTE_FS_PRE_TARGET;
444 after = SPECIAL_LOCAL_FS_PRE_TARGET;
446 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_WANTS, UNIT_AFTER, after, NULL, true);
450 r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
457 static int mount_fix_timeouts(Mount *m) {
459 const char *timeout = NULL;
468 p = get_mount_parameters_fragment(m);
472 /* Allow configuration how long we wait for a device that
473 * backs a mount point to show up. This is useful to support
474 * endless device timeouts for devices that show up only after
475 * user input, like crypto devices. */
477 if ((timeout = mount_test_option(p->options, "comment=systemd.device-timeout")))
479 else if ((timeout = mount_test_option(p->options, "x-systemd.device-timeout")))
484 t = strndup(timeout, strcspn(timeout, ",;" WHITESPACE));
488 r = parse_usec(t, &u);
492 log_warning("Failed to parse timeout for %s, ignoring: %s", m->where, timeout);
496 SET_FOREACH(other, UNIT(m)->dependencies[UNIT_AFTER], i) {
497 if (other->type != UNIT_DEVICE)
500 other->job_timeout = u;
506 static int mount_verify(Mount *m) {
511 if (UNIT(m)->load_state != UNIT_LOADED)
514 if (!m->from_fragment && !m->from_proc_self_mountinfo)
517 if (!(e = unit_name_from_path(m->where, ".mount")))
520 b = unit_has_name(UNIT(m), e);
524 log_error("%s's Where setting doesn't match unit name. Refusing.", UNIT(m)->id);
528 if (mount_point_is_api(m->where) || mount_point_ignore(m->where)) {
529 log_error("Cannot create mount unit for API file system %s. Refusing.", m->where);
533 if (UNIT(m)->fragment_path && !m->parameters_fragment.what) {
534 log_error("%s's What setting is missing. Refusing.", UNIT(m)->id);
538 if (m->exec_context.pam_name && m->kill_context.kill_mode != KILL_CONTROL_GROUP) {
539 log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(m)->id);
546 static int mount_add_extras(Mount *m) {
550 if (UNIT(m)->fragment_path)
551 m->from_fragment = true;
554 m->where = unit_name_to_path(u->id);
559 path_kill_slashes(m->where);
561 r = unit_add_exec_dependencies(u, &m->exec_context);
565 if (!UNIT(m)->description) {
566 r = unit_set_description(u, m->where);
571 r = mount_add_device_links(m);
575 r = mount_add_mount_links(m);
579 r = mount_add_socket_links(m);
583 r = mount_add_swap_links(m);
587 r = mount_add_path_links(m);
591 r = mount_add_requires_mounts_links(m);
595 r = mount_add_automount_links(m);
599 r = mount_add_quota_links(m);
603 if (UNIT(m)->default_dependencies) {
604 r = mount_add_default_dependencies(m);
609 r = unit_add_default_cgroups(u);
613 r = mount_fix_timeouts(m);
620 static int mount_load(Unit *u) {
625 assert(u->load_state == UNIT_STUB);
627 if (m->from_proc_self_mountinfo)
628 r = unit_load_fragment_and_dropin_optional(u);
630 r = unit_load_fragment_and_dropin(u);
635 /* This is a new unit? Then let's add in some extras */
636 if (u->load_state == UNIT_LOADED) {
637 r = mount_add_extras(m);
641 r = unit_exec_context_defaults(u, &m->exec_context);
646 return mount_verify(m);
649 static int mount_notify_automount(Mount *m, int status) {
656 SET_FOREACH(p, UNIT(m)->dependencies[UNIT_TRIGGERED_BY], i)
657 if (p->type == UNIT_AUTOMOUNT) {
658 r = automount_send_ready(AUTOMOUNT(p), status);
666 static void mount_set_state(Mount *m, MountState state) {
667 MountState old_state;
670 old_state = m->state;
673 if (state != MOUNT_MOUNTING &&
674 state != MOUNT_MOUNTING_DONE &&
675 state != MOUNT_REMOUNTING &&
676 state != MOUNT_UNMOUNTING &&
677 state != MOUNT_MOUNTING_SIGTERM &&
678 state != MOUNT_MOUNTING_SIGKILL &&
679 state != MOUNT_UNMOUNTING_SIGTERM &&
680 state != MOUNT_UNMOUNTING_SIGKILL &&
681 state != MOUNT_REMOUNTING_SIGTERM &&
682 state != MOUNT_REMOUNTING_SIGKILL) {
683 unit_unwatch_timer(UNIT(m), &m->timer_watch);
684 mount_unwatch_control_pid(m);
685 m->control_command = NULL;
686 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
689 if (state == MOUNT_MOUNTED ||
690 state == MOUNT_REMOUNTING)
691 mount_notify_automount(m, 0);
692 else if (state == MOUNT_DEAD ||
693 state == MOUNT_UNMOUNTING ||
694 state == MOUNT_MOUNTING_SIGTERM ||
695 state == MOUNT_MOUNTING_SIGKILL ||
696 state == MOUNT_REMOUNTING_SIGTERM ||
697 state == MOUNT_REMOUNTING_SIGKILL ||
698 state == MOUNT_UNMOUNTING_SIGTERM ||
699 state == MOUNT_UNMOUNTING_SIGKILL ||
700 state == MOUNT_FAILED) {
701 if (state != old_state)
702 mount_notify_automount(m, -ENODEV);
705 if (state != old_state)
706 log_debug("%s changed %s -> %s",
708 mount_state_to_string(old_state),
709 mount_state_to_string(state));
711 unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state], m->reload_result == MOUNT_SUCCESS);
712 m->reload_result = MOUNT_SUCCESS;
715 static int mount_coldplug(Unit *u) {
717 MountState new_state = MOUNT_DEAD;
721 assert(m->state == MOUNT_DEAD);
723 if (m->deserialized_state != m->state)
724 new_state = m->deserialized_state;
725 else if (m->from_proc_self_mountinfo)
726 new_state = MOUNT_MOUNTED;
728 if (new_state != m->state) {
730 if (new_state == MOUNT_MOUNTING ||
731 new_state == MOUNT_MOUNTING_DONE ||
732 new_state == MOUNT_REMOUNTING ||
733 new_state == MOUNT_UNMOUNTING ||
734 new_state == MOUNT_MOUNTING_SIGTERM ||
735 new_state == MOUNT_MOUNTING_SIGKILL ||
736 new_state == MOUNT_UNMOUNTING_SIGTERM ||
737 new_state == MOUNT_UNMOUNTING_SIGKILL ||
738 new_state == MOUNT_REMOUNTING_SIGTERM ||
739 new_state == MOUNT_REMOUNTING_SIGKILL) {
741 if (m->control_pid <= 0)
744 r = unit_watch_pid(UNIT(m), m->control_pid);
748 r = unit_watch_timer(UNIT(m), CLOCK_MONOTONIC, true, m->timeout_usec, &m->timer_watch);
753 mount_set_state(m, new_state);
759 static void mount_dump(Unit *u, FILE *f, const char *prefix) {
766 p = get_mount_parameters(m);
769 "%sMount State: %s\n"
773 "%sFile System Type: %s\n"
775 "%sFrom /proc/self/mountinfo: %s\n"
776 "%sFrom fragment: %s\n"
777 "%sDirectoryMode: %04o\n",
778 prefix, mount_state_to_string(m->state),
779 prefix, mount_result_to_string(m->result),
781 prefix, strna(p->what),
782 prefix, strna(p->fstype),
783 prefix, strna(p->options),
784 prefix, yes_no(m->from_proc_self_mountinfo),
785 prefix, yes_no(m->from_fragment),
786 prefix, m->directory_mode);
788 if (m->control_pid > 0)
790 "%sControl PID: %lu\n",
791 prefix, (unsigned long) m->control_pid);
793 exec_context_dump(&m->exec_context, f, prefix);
794 kill_context_dump(&m->kill_context, f, prefix);
797 static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
805 r = unit_watch_timer(UNIT(m), CLOCK_MONOTONIC, true, m->timeout_usec, &m->timer_watch);
809 if ((r = exec_spawn(c,
813 UNIT(m)->manager->environment,
817 UNIT(m)->manager->confirm_spawn,
818 UNIT(m)->cgroup_bondings,
819 UNIT(m)->cgroup_attributes,
826 if ((r = unit_watch_pid(UNIT(m), pid)) < 0)
827 /* FIXME: we need to do something here */
835 unit_unwatch_timer(UNIT(m), &m->timer_watch);
840 static void mount_enter_dead(Mount *m, MountResult f) {
843 if (f != MOUNT_SUCCESS)
846 mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD);
849 static void mount_enter_mounted(Mount *m, MountResult f) {
852 if (f != MOUNT_SUCCESS)
855 mount_set_state(m, MOUNT_MOUNTED);
858 static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
861 bool wait_for_exit = false;
865 if (f != MOUNT_SUCCESS)
868 if (m->kill_context.kill_mode != KILL_NONE) {
869 int sig = (state == MOUNT_MOUNTING_SIGTERM ||
870 state == MOUNT_UNMOUNTING_SIGTERM ||
871 state == MOUNT_REMOUNTING_SIGTERM) ? m->kill_context.kill_signal : SIGKILL;
873 if (m->control_pid > 0) {
874 if (kill_and_sigcont(m->control_pid, sig) < 0 && errno != ESRCH)
876 log_warning("Failed to kill control process %li: %m", (long) m->control_pid);
878 wait_for_exit = true;
881 if (m->kill_context.kill_mode == KILL_CONTROL_GROUP) {
883 if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
888 /* Exclude the control pid from being killed via the cgroup */
889 if (m->control_pid > 0)
890 if ((r = set_put(pid_set, LONG_TO_PTR(m->control_pid))) < 0)
893 r = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, sig, true, false, pid_set, NULL);
895 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
896 log_warning("Failed to kill control group: %s", strerror(-r));
898 wait_for_exit = true;
906 r = unit_watch_timer(UNIT(m), CLOCK_MONOTONIC, true, m->timeout_usec, &m->timer_watch);
910 mount_set_state(m, state);
911 } else if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
912 mount_enter_mounted(m, MOUNT_SUCCESS);
914 mount_enter_dead(m, MOUNT_SUCCESS);
919 log_warning("%s failed to kill processes: %s", UNIT(m)->id, strerror(-r));
921 if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
922 mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
924 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
930 static void mount_enter_unmounting(Mount *m) {
935 m->control_command_id = MOUNT_EXEC_UNMOUNT;
936 m->control_command = m->exec_command + MOUNT_EXEC_UNMOUNT;
938 if ((r = exec_command_set(
945 mount_unwatch_control_pid(m);
947 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
950 mount_set_state(m, MOUNT_UNMOUNTING);
955 log_warning("%s failed to run 'umount' task: %s", UNIT(m)->id, strerror(-r));
956 mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
959 static void mount_enter_mounting(Mount *m) {
965 m->control_command_id = MOUNT_EXEC_MOUNT;
966 m->control_command = m->exec_command + MOUNT_EXEC_MOUNT;
968 mkdir_p_label(m->where, m->directory_mode);
970 if (dir_is_empty(m->where) <= 0)
971 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);
973 /* Create the source directory for bind-mounts if needed */
974 p = get_mount_parameters_fragment(m);
975 if (p && mount_is_bind(p))
976 mkdir_p_label(p->what, m->directory_mode);
978 if (m->from_fragment)
979 r = exec_command_set(
982 m->parameters_fragment.what,
984 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
985 m->parameters_fragment.options ? "-o" : NULL, m->parameters_fragment.options,
993 mount_unwatch_control_pid(m);
995 r = mount_spawn(m, m->control_command, &m->control_pid);
999 mount_set_state(m, MOUNT_MOUNTING);
1004 log_warning("%s failed to run 'mount' task: %s", UNIT(m)->id, strerror(-r));
1005 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
1008 static void mount_enter_mounting_done(Mount *m) {
1011 mount_set_state(m, MOUNT_MOUNTING_DONE);
1014 static void mount_enter_remounting(Mount *m) {
1019 m->control_command_id = MOUNT_EXEC_REMOUNT;
1020 m->control_command = m->exec_command + MOUNT_EXEC_REMOUNT;
1022 if (m->from_fragment) {
1026 if (m->parameters_fragment.options) {
1027 if (!(buf = strappend("remount,", m->parameters_fragment.options))) {
1036 r = exec_command_set(
1039 m->parameters_fragment.what,
1041 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
1052 mount_unwatch_control_pid(m);
1054 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
1057 mount_set_state(m, MOUNT_REMOUNTING);
1062 log_warning("%s failed to run 'remount' task: %s", UNIT(m)->id, strerror(-r));
1063 m->reload_result = MOUNT_FAILURE_RESOURCES;
1064 mount_enter_mounted(m, MOUNT_SUCCESS);
1067 static int mount_start(Unit *u) {
1068 Mount *m = MOUNT(u);
1072 /* We cannot fulfill this request right now, try again later
1074 if (m->state == MOUNT_UNMOUNTING ||
1075 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1076 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1077 m->state == MOUNT_MOUNTING_SIGTERM ||
1078 m->state == MOUNT_MOUNTING_SIGKILL)
1081 /* Already on it! */
1082 if (m->state == MOUNT_MOUNTING)
1085 assert(m->state == MOUNT_DEAD || m->state == MOUNT_FAILED);
1087 m->result = MOUNT_SUCCESS;
1088 m->reload_result = MOUNT_SUCCESS;
1090 mount_enter_mounting(m);
1094 static int mount_stop(Unit *u) {
1095 Mount *m = MOUNT(u);
1100 if (m->state == MOUNT_UNMOUNTING ||
1101 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1102 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1103 m->state == MOUNT_MOUNTING_SIGTERM ||
1104 m->state == MOUNT_MOUNTING_SIGKILL)
1107 assert(m->state == MOUNT_MOUNTING ||
1108 m->state == MOUNT_MOUNTING_DONE ||
1109 m->state == MOUNT_MOUNTED ||
1110 m->state == MOUNT_REMOUNTING ||
1111 m->state == MOUNT_REMOUNTING_SIGTERM ||
1112 m->state == MOUNT_REMOUNTING_SIGKILL);
1114 mount_enter_unmounting(m);
1118 static int mount_reload(Unit *u) {
1119 Mount *m = MOUNT(u);
1123 if (m->state == MOUNT_MOUNTING_DONE)
1126 assert(m->state == MOUNT_MOUNTED);
1128 mount_enter_remounting(m);
1132 static int mount_serialize(Unit *u, FILE *f, FDSet *fds) {
1133 Mount *m = MOUNT(u);
1139 unit_serialize_item(u, f, "state", mount_state_to_string(m->state));
1140 unit_serialize_item(u, f, "result", mount_result_to_string(m->result));
1141 unit_serialize_item(u, f, "reload-result", mount_result_to_string(m->reload_result));
1143 if (m->control_pid > 0)
1144 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) m->control_pid);
1146 if (m->control_command_id >= 0)
1147 unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(m->control_command_id));
1152 static int mount_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1153 Mount *m = MOUNT(u);
1160 if (streq(key, "state")) {
1163 if ((state = mount_state_from_string(value)) < 0)
1164 log_debug("Failed to parse state value %s", value);
1166 m->deserialized_state = state;
1167 } else if (streq(key, "result")) {
1170 f = mount_result_from_string(value);
1172 log_debug("Failed to parse result value %s", value);
1173 else if (f != MOUNT_SUCCESS)
1176 } else if (streq(key, "reload-result")) {
1179 f = mount_result_from_string(value);
1181 log_debug("Failed to parse reload result value %s", value);
1182 else if (f != MOUNT_SUCCESS)
1183 m->reload_result = f;
1185 } else if (streq(key, "control-pid")) {
1188 if (parse_pid(value, &pid) < 0)
1189 log_debug("Failed to parse control-pid value %s", value);
1191 m->control_pid = pid;
1192 } else if (streq(key, "control-command")) {
1193 MountExecCommand id;
1195 if ((id = mount_exec_command_from_string(value)) < 0)
1196 log_debug("Failed to parse exec-command value %s", value);
1198 m->control_command_id = id;
1199 m->control_command = m->exec_command + id;
1203 log_debug("Unknown serialization key '%s'", key);
1208 static UnitActiveState mount_active_state(Unit *u) {
1211 return state_translation_table[MOUNT(u)->state];
1214 static const char *mount_sub_state_to_string(Unit *u) {
1217 return mount_state_to_string(MOUNT(u)->state);
1220 static bool mount_check_gc(Unit *u) {
1221 Mount *m = MOUNT(u);
1225 return m->from_proc_self_mountinfo;
1228 static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1229 Mount *m = MOUNT(u);
1235 if (pid != m->control_pid)
1240 if (is_clean_exit(code, status, NULL))
1242 else if (code == CLD_EXITED)
1243 f = MOUNT_FAILURE_EXIT_CODE;
1244 else if (code == CLD_KILLED)
1245 f = MOUNT_FAILURE_SIGNAL;
1246 else if (code == CLD_DUMPED)
1247 f = MOUNT_FAILURE_CORE_DUMP;
1249 assert_not_reached("Unknown code");
1251 if (f != MOUNT_SUCCESS)
1254 if (m->control_command) {
1255 exec_status_exit(&m->control_command->exec_status, &m->exec_context, pid, code, status);
1257 m->control_command = NULL;
1258 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
1261 log_full(f == MOUNT_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
1262 "%s mount process exited, code=%s status=%i", u->id, sigchld_code_to_string(code), status);
1264 /* Note that mount(8) returning and the kernel sending us a
1265 * mount table change event might happen out-of-order. If an
1266 * operation succeed we assume the kernel will follow soon too
1267 * and already change into the resulting state. If it fails
1268 * we check if the kernel still knows about the mount. and
1269 * change state accordingly. */
1273 case MOUNT_MOUNTING:
1274 case MOUNT_MOUNTING_DONE:
1275 case MOUNT_MOUNTING_SIGKILL:
1276 case MOUNT_MOUNTING_SIGTERM:
1278 if (f == MOUNT_SUCCESS)
1279 mount_enter_mounted(m, f);
1280 else if (m->from_proc_self_mountinfo)
1281 mount_enter_mounted(m, f);
1283 mount_enter_dead(m, f);
1286 case MOUNT_REMOUNTING:
1287 case MOUNT_REMOUNTING_SIGKILL:
1288 case MOUNT_REMOUNTING_SIGTERM:
1290 m->reload_result = f;
1291 if (m->from_proc_self_mountinfo)
1292 mount_enter_mounted(m, MOUNT_SUCCESS);
1294 mount_enter_dead(m, MOUNT_SUCCESS);
1298 case MOUNT_UNMOUNTING:
1299 case MOUNT_UNMOUNTING_SIGKILL:
1300 case MOUNT_UNMOUNTING_SIGTERM:
1302 if (f == MOUNT_SUCCESS)
1303 mount_enter_dead(m, f);
1304 else if (m->from_proc_self_mountinfo)
1305 mount_enter_mounted(m, f);
1307 mount_enter_dead(m, f);
1311 assert_not_reached("Uh, control process died at wrong time.");
1314 /* Notify clients about changed exit status */
1315 unit_add_to_dbus_queue(u);
1318 static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
1319 Mount *m = MOUNT(u);
1322 assert(elapsed == 1);
1323 assert(w == &m->timer_watch);
1327 case MOUNT_MOUNTING:
1328 case MOUNT_MOUNTING_DONE:
1329 log_warning("%s mounting timed out. Stopping.", u->id);
1330 mount_enter_signal(m, MOUNT_MOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1333 case MOUNT_REMOUNTING:
1334 log_warning("%s remounting timed out. Stopping.", u->id);
1335 m->reload_result = MOUNT_FAILURE_TIMEOUT;
1336 mount_enter_mounted(m, MOUNT_SUCCESS);
1339 case MOUNT_UNMOUNTING:
1340 log_warning("%s unmounting timed out. Stopping.", u->id);
1341 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1344 case MOUNT_MOUNTING_SIGTERM:
1345 if (m->kill_context.send_sigkill) {
1346 log_warning("%s mounting timed out. Killing.", u->id);
1347 mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1349 log_warning("%s mounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1351 if (m->from_proc_self_mountinfo)
1352 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1354 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1358 case MOUNT_REMOUNTING_SIGTERM:
1359 if (m->kill_context.send_sigkill) {
1360 log_warning("%s remounting timed out. Killing.", u->id);
1361 mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1363 log_warning("%s remounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1365 if (m->from_proc_self_mountinfo)
1366 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1368 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1372 case MOUNT_UNMOUNTING_SIGTERM:
1373 if (m->kill_context.send_sigkill) {
1374 log_warning("%s unmounting timed out. Killing.", u->id);
1375 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1377 log_warning("%s unmounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1379 if (m->from_proc_self_mountinfo)
1380 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1382 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1386 case MOUNT_MOUNTING_SIGKILL:
1387 case MOUNT_REMOUNTING_SIGKILL:
1388 case MOUNT_UNMOUNTING_SIGKILL:
1389 log_warning("%s mount process still around after SIGKILL. Ignoring.", u->id);
1391 if (m->from_proc_self_mountinfo)
1392 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1394 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1398 assert_not_reached("Timeout at wrong time.");
1402 static int mount_add_one(
1406 const char *options,
1413 char *e, *w = NULL, *o = NULL, *f = NULL;
1415 bool load_extras = false;
1423 /* Ignore API mount points. They should never be referenced in
1424 * dependencies ever. */
1425 if (mount_point_is_api(where) || mount_point_ignore(where))
1428 if (streq(fstype, "autofs"))
1431 /* probably some kind of swap, ignore */
1432 if (!is_path(where))
1435 e = unit_name_from_path(where, ".mount");
1439 u = manager_get_unit(m, e);
1443 u = unit_new(m, sizeof(Mount));
1449 r = unit_add_name(u, e);
1455 MOUNT(u)->where = strdup(where);
1456 if (!MOUNT(u)->where) {
1461 unit_add_to_load_queue(u);
1466 if (!MOUNT(u)->where) {
1467 MOUNT(u)->where = strdup(where);
1468 if (!MOUNT(u)->where) {
1474 if (u->load_state == UNIT_ERROR) {
1475 u->load_state = UNIT_LOADED;
1478 /* Load in the extras later on, after we
1479 * finished initialization of the unit */
1484 if (!(w = strdup(what)) ||
1485 !(o = strdup(options)) ||
1486 !(f = strdup(fstype))) {
1491 p = &MOUNT(u)->parameters_proc_self_mountinfo;
1493 MOUNT(u)->is_mounted = true;
1494 MOUNT(u)->just_mounted = !MOUNT(u)->from_proc_self_mountinfo;
1495 MOUNT(u)->just_changed = !streq_ptr(p->options, o);
1498 MOUNT(u)->from_proc_self_mountinfo = true;
1512 r = mount_add_extras(MOUNT(u));
1517 unit_add_to_dbus_queue(u);
1532 static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
1535 char *device, *path, *options, *options2, *fstype, *d, *p, *o;
1539 rewind(m->proc_self_mountinfo);
1544 device = path = options = options2 = fstype = d = p = o = NULL;
1546 if ((k = fscanf(m->proc_self_mountinfo,
1547 "%*s " /* (1) mount id */
1548 "%*s " /* (2) parent id */
1549 "%*s " /* (3) major:minor */
1550 "%*s " /* (4) root */
1551 "%ms " /* (5) mount point */
1552 "%ms" /* (6) mount options */
1553 "%*[^-]" /* (7) optional fields */
1554 "- " /* (8) separator */
1555 "%ms " /* (9) file system type */
1556 "%ms" /* (10) mount source */
1557 "%ms" /* (11) mount options 2 */
1558 "%*[^\n]", /* some rubbish at the end */
1568 log_warning("Failed to parse /proc/self/mountinfo:%u.", i);
1572 o = strjoin(options, ",", options2, NULL);
1578 if (!(d = cunescape(device)) ||
1579 !(p = cunescape(path))) {
1584 if ((k = mount_add_one(m, d, p, o, fstype, 0, set_flags)) < 0)
1611 static void mount_shutdown(Manager *m) {
1614 if (m->proc_self_mountinfo) {
1615 fclose(m->proc_self_mountinfo);
1616 m->proc_self_mountinfo = NULL;
1620 static int mount_enumerate(Manager *m) {
1622 struct epoll_event ev;
1625 if (!m->proc_self_mountinfo) {
1626 if (!(m->proc_self_mountinfo = fopen("/proc/self/mountinfo", "re")))
1629 m->mount_watch.type = WATCH_MOUNT;
1630 m->mount_watch.fd = fileno(m->proc_self_mountinfo);
1633 ev.events = EPOLLPRI;
1634 ev.data.ptr = &m->mount_watch;
1636 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->mount_watch.fd, &ev) < 0)
1640 if ((r = mount_load_proc_self_mountinfo(m, false)) < 0)
1650 void mount_fd_event(Manager *m, int events) {
1655 assert(events & EPOLLPRI);
1657 /* The manager calls this for every fd event happening on the
1658 * /proc/self/mountinfo file, which informs us about mounting
1661 if ((r = mount_load_proc_self_mountinfo(m, true)) < 0) {
1662 log_error("Failed to reread /proc/self/mountinfo: %s", strerror(-r));
1664 /* Reset flags, just in case, for later calls */
1665 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1666 Mount *mount = MOUNT(u);
1668 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1674 manager_dispatch_load_queue(m);
1676 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1677 Mount *mount = MOUNT(u);
1679 if (!mount->is_mounted) {
1680 /* This has just been unmounted. */
1682 mount->from_proc_self_mountinfo = false;
1684 switch (mount->state) {
1687 mount_enter_dead(mount, MOUNT_SUCCESS);
1691 mount_set_state(mount, mount->state);
1696 } else if (mount->just_mounted || mount->just_changed) {
1698 /* New or changed mount entry */
1700 switch (mount->state) {
1704 mount_enter_mounted(mount, MOUNT_SUCCESS);
1707 case MOUNT_MOUNTING:
1708 mount_enter_mounting_done(mount);
1712 /* Nothing really changed, but let's
1713 * issue an notification call
1714 * nonetheless, in case somebody is
1715 * waiting for this. (e.g. file system
1716 * ro/rw remounts.) */
1717 mount_set_state(mount, mount->state);
1722 /* Reset the flags for later calls */
1723 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1727 static void mount_reset_failed(Unit *u) {
1728 Mount *m = MOUNT(u);
1732 if (m->state == MOUNT_FAILED)
1733 mount_set_state(m, MOUNT_DEAD);
1735 m->result = MOUNT_SUCCESS;
1736 m->reload_result = MOUNT_SUCCESS;
1739 static int mount_kill(Unit *u, KillWho who, int signo, DBusError *error) {
1740 Mount *m = MOUNT(u);
1742 Set *pid_set = NULL;
1746 if (who == KILL_MAIN) {
1747 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "Mount units have no main processes");
1751 if (m->control_pid <= 0 && who == KILL_CONTROL) {
1752 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
1756 if (who == KILL_CONTROL || who == KILL_ALL)
1757 if (m->control_pid > 0)
1758 if (kill(m->control_pid, signo) < 0)
1761 if (who == KILL_ALL) {
1764 pid_set = set_new(trivial_hash_func, trivial_compare_func);
1768 /* Exclude the control pid from being killed via the cgroup */
1769 if (m->control_pid > 0) {
1770 q = set_put(pid_set, LONG_TO_PTR(m->control_pid));
1777 q = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, signo, false, false, pid_set, NULL);
1778 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
1789 static const char* const mount_state_table[_MOUNT_STATE_MAX] = {
1790 [MOUNT_DEAD] = "dead",
1791 [MOUNT_MOUNTING] = "mounting",
1792 [MOUNT_MOUNTING_DONE] = "mounting-done",
1793 [MOUNT_MOUNTED] = "mounted",
1794 [MOUNT_REMOUNTING] = "remounting",
1795 [MOUNT_UNMOUNTING] = "unmounting",
1796 [MOUNT_MOUNTING_SIGTERM] = "mounting-sigterm",
1797 [MOUNT_MOUNTING_SIGKILL] = "mounting-sigkill",
1798 [MOUNT_REMOUNTING_SIGTERM] = "remounting-sigterm",
1799 [MOUNT_REMOUNTING_SIGKILL] = "remounting-sigkill",
1800 [MOUNT_UNMOUNTING_SIGTERM] = "unmounting-sigterm",
1801 [MOUNT_UNMOUNTING_SIGKILL] = "unmounting-sigkill",
1802 [MOUNT_FAILED] = "failed"
1805 DEFINE_STRING_TABLE_LOOKUP(mount_state, MountState);
1807 static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = {
1808 [MOUNT_EXEC_MOUNT] = "ExecMount",
1809 [MOUNT_EXEC_UNMOUNT] = "ExecUnmount",
1810 [MOUNT_EXEC_REMOUNT] = "ExecRemount",
1813 DEFINE_STRING_TABLE_LOOKUP(mount_exec_command, MountExecCommand);
1815 static const char* const mount_result_table[_MOUNT_RESULT_MAX] = {
1816 [MOUNT_SUCCESS] = "success",
1817 [MOUNT_FAILURE_RESOURCES] = "resources",
1818 [MOUNT_FAILURE_TIMEOUT] = "timeout",
1819 [MOUNT_FAILURE_EXIT_CODE] = "exit-code",
1820 [MOUNT_FAILURE_SIGNAL] = "signal",
1821 [MOUNT_FAILURE_CORE_DUMP] = "core-dump"
1824 DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult);
1826 const UnitVTable mount_vtable = {
1827 .object_size = sizeof(Mount),
1828 .exec_context_offset = offsetof(Mount, exec_context),
1836 .no_instances = true,
1842 .coldplug = mount_coldplug,
1846 .start = mount_start,
1848 .reload = mount_reload,
1852 .serialize = mount_serialize,
1853 .deserialize_item = mount_deserialize_item,
1855 .active_state = mount_active_state,
1856 .sub_state_to_string = mount_sub_state_to_string,
1858 .check_gc = mount_check_gc,
1860 .sigchld_event = mount_sigchld_event,
1861 .timer_event = mount_timer_event,
1863 .reset_failed = mount_reset_failed,
1865 .bus_interface = "org.freedesktop.systemd1.Mount",
1866 .bus_message_handler = bus_mount_message_handler,
1867 .bus_invalidating_properties = bus_mount_invalidating_properties,
1869 .enumerate = mount_enumerate,
1870 .shutdown = mount_shutdown,
1872 .status_message_formats = {
1873 .starting_stopping = {
1874 [0] = "Mounting %s...",
1875 [1] = "Unmounting %s...",
1877 .finished_start_job = {
1878 [JOB_DONE] = "Mounted %s.",
1879 [JOB_FAILED] = "Failed to mount %s.",
1880 [JOB_DEPENDENCY] = "Dependency failed for %s.",
1881 [JOB_TIMEOUT] = "Timed out mounting %s.",
1883 .finished_stop_job = {
1884 [JOB_DONE] = "Unmounted %s.",
1885 [JOB_FAILED] = "Failed unmounting %s.",
1886 [JOB_TIMEOUT] = "Timed out unmounting %s.",