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 "mount-setup.h"
36 #include "unit-name.h"
37 #include "dbus-mount.h"
39 #include "bus-errors.h"
40 #include "exit-status.h"
43 static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = {
44 [MOUNT_DEAD] = UNIT_INACTIVE,
45 [MOUNT_MOUNTING] = UNIT_ACTIVATING,
46 [MOUNT_MOUNTING_DONE] = UNIT_ACTIVE,
47 [MOUNT_MOUNTED] = UNIT_ACTIVE,
48 [MOUNT_REMOUNTING] = UNIT_RELOADING,
49 [MOUNT_UNMOUNTING] = UNIT_DEACTIVATING,
50 [MOUNT_MOUNTING_SIGTERM] = UNIT_DEACTIVATING,
51 [MOUNT_MOUNTING_SIGKILL] = UNIT_DEACTIVATING,
52 [MOUNT_REMOUNTING_SIGTERM] = UNIT_RELOADING,
53 [MOUNT_REMOUNTING_SIGKILL] = UNIT_RELOADING,
54 [MOUNT_UNMOUNTING_SIGTERM] = UNIT_DEACTIVATING,
55 [MOUNT_UNMOUNTING_SIGKILL] = UNIT_DEACTIVATING,
56 [MOUNT_FAILED] = UNIT_FAILED
59 static void mount_init(Unit *u) {
63 assert(u->load_state == UNIT_STUB);
65 m->timeout_usec = DEFAULT_TIMEOUT_USEC;
66 m->directory_mode = 0755;
68 exec_context_init(&m->exec_context);
70 /* The stdio/kmsg bridge socket is on /, in order to avoid a
71 * dep loop, don't use kmsg logging for -.mount */
72 if (!unit_has_name(u, "-.mount")) {
73 m->exec_context.std_output = u->manager->default_std_output;
74 m->exec_context.std_error = u->manager->default_std_error;
77 /* We need to make sure that /bin/mount is always called in
78 * the same process group as us, so that the autofs kernel
79 * side doesn't send us another mount request while we are
80 * already trying to comply its last one. */
81 m->exec_context.same_pgrp = true;
83 m->timer_watch.type = WATCH_INVALID;
85 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
87 UNIT(m)->ignore_on_isolate = true;
90 static void mount_unwatch_control_pid(Mount *m) {
93 if (m->control_pid <= 0)
96 unit_unwatch_pid(UNIT(m), m->control_pid);
100 static void mount_parameters_done(MountParameters *p) {
107 p->what = p->options = p->fstype = NULL;
110 static void mount_done(Unit *u) {
118 mount_parameters_done(&m->parameters_etc_fstab);
119 mount_parameters_done(&m->parameters_proc_self_mountinfo);
120 mount_parameters_done(&m->parameters_fragment);
122 exec_context_done(&m->exec_context);
123 exec_command_done_array(m->exec_command, _MOUNT_EXEC_COMMAND_MAX);
124 m->control_command = NULL;
126 mount_unwatch_control_pid(m);
128 unit_unwatch_timer(u, &m->timer_watch);
131 static MountParameters* get_mount_parameters_configured(Mount *m) {
134 if (m->from_fragment)
135 return &m->parameters_fragment;
136 else if (m->from_etc_fstab)
137 return &m->parameters_etc_fstab;
142 static MountParameters* get_mount_parameters(Mount *m) {
145 if (m->from_proc_self_mountinfo)
146 return &m->parameters_proc_self_mountinfo;
148 return get_mount_parameters_configured(m);
151 static int mount_add_mount_links(Mount *m) {
158 pm = get_mount_parameters_configured(m);
160 /* Adds in links to other mount points that might lie below or
161 * above us in the hierarchy */
163 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_MOUNT]) {
164 Mount *n = MOUNT(other);
170 if (UNIT(n)->load_state != UNIT_LOADED)
173 pn = get_mount_parameters_configured(n);
175 if (path_startswith(m->where, n->where)) {
177 if ((r = unit_add_dependency(UNIT(m), UNIT_AFTER, UNIT(n), true)) < 0)
181 if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0)
184 } else if (path_startswith(n->where, m->where)) {
186 if ((r = unit_add_dependency(UNIT(n), UNIT_AFTER, UNIT(m), true)) < 0)
190 if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0)
193 } else if (pm && pm->what && path_startswith(pm->what, n->where)) {
195 if ((r = unit_add_dependency(UNIT(m), UNIT_AFTER, UNIT(n), true)) < 0)
198 if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0)
201 } else if (pn && pn->what && path_startswith(pn->what, m->where)) {
203 if ((r = unit_add_dependency(UNIT(n), UNIT_AFTER, UNIT(m), true)) < 0)
206 if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0)
214 static int mount_add_swap_links(Mount *m) {
220 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_SWAP])
221 if ((r = swap_add_one_mount_link(SWAP(other), m)) < 0)
227 static int mount_add_path_links(Mount *m) {
233 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_PATH])
234 if ((r = path_add_one_mount_link(PATH(other), m)) < 0)
240 static int mount_add_automount_links(Mount *m) {
246 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_AUTOMOUNT])
247 if ((r = automount_add_one_mount_link(AUTOMOUNT(other), m)) < 0)
253 static int mount_add_socket_links(Mount *m) {
259 LIST_FOREACH(units_by_type, other, UNIT(m)->manager->units_by_type[UNIT_SOCKET])
260 if ((r = socket_add_one_mount_link(SOCKET(other), m)) < 0)
266 static char* mount_test_option(const char *haystack, const char *needle) {
271 /* Like glibc's hasmntopt(), but works on a string, not a
278 me.mnt_opts = (char*) haystack;
280 return hasmntopt(&me, needle);
283 static bool mount_is_network(MountParameters *p) {
286 if (mount_test_option(p->options, "_netdev"))
289 if (p->fstype && fstype_is_network(p->fstype))
295 static bool mount_is_bind(MountParameters *p) {
298 if (mount_test_option(p->options, "bind"))
301 if (p->fstype && streq(p->fstype, "bind"))
307 static bool needs_quota(MountParameters *p) {
310 if (mount_is_network(p))
313 if (mount_is_bind(p))
316 return mount_test_option(p->options, "usrquota") ||
317 mount_test_option(p->options, "grpquota") ||
318 mount_test_option(p->options, "quota") ||
319 mount_test_option(p->options, "usrjquota") ||
320 mount_test_option(p->options, "grpjquota");
323 static int mount_add_fstab_links(Mount *m) {
324 const char *target, *after, *tu_wants = NULL;
328 bool noauto, nofail, automount;
332 if (UNIT(m)->manager->running_as != MANAGER_SYSTEM)
335 if (!(p = get_mount_parameters_configured(m)))
338 if (p != &m->parameters_etc_fstab)
341 noauto = !!mount_test_option(p->options, "noauto");
342 nofail = !!mount_test_option(p->options, "nofail");
344 mount_test_option(p->options, "comment=systemd.automount") ||
345 mount_test_option(p->options, "x-systemd-automount");
347 if (mount_is_network(p)) {
348 target = SPECIAL_REMOTE_FS_TARGET;
349 after = tu_wants = SPECIAL_REMOTE_FS_PRE_TARGET;
351 target = SPECIAL_LOCAL_FS_TARGET;
352 after = SPECIAL_LOCAL_FS_PRE_TARGET;
355 r = manager_load_unit(UNIT(m)->manager, target, NULL, NULL, &tu);
360 r = unit_add_dependency_by_name(tu, UNIT_WANTS, tu_wants, NULL, true);
366 r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, after, NULL, true);
374 if ((r = unit_load_related_unit(UNIT(m), ".automount", &am)) < 0)
377 /* If auto is configured as well also pull in the
378 * mount right-away, but don't rely on it. */
379 if (!noauto) /* automount + auto */
380 if ((r = unit_add_dependency(tu, UNIT_WANTS, UNIT(m), true)) < 0)
383 /* Install automount unit */
384 if (!nofail) /* automount + fail */
385 return unit_add_two_dependencies(tu, UNIT_AFTER, UNIT_REQUIRES, am, true);
386 else /* automount + nofail */
387 return unit_add_two_dependencies(tu, UNIT_AFTER, UNIT_WANTS, am, true);
389 } else if (!noauto) {
391 /* Automatically add mount points that aren't natively
392 * configured to local-fs.target */
394 if (!nofail) /* auto + fail */
395 return unit_add_two_dependencies(tu, UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
396 else /* auto + nofail */
397 return unit_add_dependency(tu, UNIT_WANTS, UNIT(m), true);
403 static int mount_add_device_links(Mount *m) {
409 if (!(p = get_mount_parameters_configured(m)))
415 if (!mount_is_bind(p) &&
416 !path_equal(m->where, "/") &&
417 p == &m->parameters_etc_fstab) {
420 noauto = !!mount_test_option(p->options, "noauto");
421 nofail = !!mount_test_option(p->options, "nofail");
423 if ((r = unit_add_node_link(UNIT(m), p->what,
425 UNIT(m)->manager->running_as == MANAGER_SYSTEM)) < 0)
431 UNIT(m)->manager->running_as == MANAGER_SYSTEM &&
432 !path_equal(m->where, "/")) {
435 /* Let's add in the fsck service */
437 /* aka SPECIAL_FSCK_SERVICE */
438 if (!(name = unit_name_from_path_instance("fsck", p->what, ".service")))
441 if ((r = manager_load_unit_prepare(UNIT(m)->manager, name, NULL, NULL, &fsck)) < 0) {
442 log_warning("Failed to prepare unit %s: %s", name, strerror(-r));
449 SERVICE(fsck)->fsck_passno = p->passno;
451 if ((r = unit_add_two_dependencies(UNIT(m), UNIT_AFTER, UNIT_REQUIRES, fsck, true)) < 0)
458 static int mount_add_default_dependencies(Mount *m) {
464 if (UNIT(m)->manager->running_as != MANAGER_SYSTEM)
467 p = get_mount_parameters_configured(m);
468 if (p && needs_quota(p)) {
469 if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTACHECK_SERVICE, NULL, true)) < 0 ||
470 (r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTAON_SERVICE, NULL, true)) < 0)
474 if (!path_equal(m->where, "/"))
475 if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true)) < 0)
481 static int mount_fix_timeouts(Mount *m) {
483 const char *timeout = NULL;
492 if (!(p = get_mount_parameters_configured(m)))
495 /* Allow configuration how long we wait for a device that
496 * backs a mount point to show up. This is useful to support
497 * endless device timeouts for devices that show up only after
498 * user input, like crypto devices. */
500 if ((timeout = mount_test_option(p->options, "comment=systemd.device-timeout")))
502 else if ((timeout = mount_test_option(p->options, "x-systemd-device-timeout")))
507 t = strndup(timeout, strcspn(timeout, ",;" WHITESPACE));
511 r = parse_usec(t, &u);
515 log_warning("Failed to parse timeout for %s, ignoring: %s", m->where, timeout);
519 SET_FOREACH(other, UNIT(m)->dependencies[UNIT_AFTER], i) {
520 if (other->type != UNIT_DEVICE)
523 other->job_timeout = u;
529 static int mount_verify(Mount *m) {
534 if (UNIT(m)->load_state != UNIT_LOADED)
537 if (!m->from_etc_fstab && !m->from_fragment && !m->from_proc_self_mountinfo)
540 if (!(e = unit_name_from_path(m->where, ".mount")))
543 b = unit_has_name(UNIT(m), e);
547 log_error("%s's Where setting doesn't match unit name. Refusing.", UNIT(m)->id);
551 if (mount_point_is_api(m->where) || mount_point_ignore(m->where)) {
552 log_error("Cannot create mount unit for API file system %s. Refusing.", m->where);
556 if (UNIT(m)->fragment_path && !m->parameters_fragment.what) {
557 log_error("%s's What setting is missing. Refusing.", UNIT(m)->id);
561 if (m->exec_context.pam_name && m->exec_context.kill_mode != KILL_CONTROL_GROUP) {
562 log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(m)->id);
569 static int mount_load(Unit *u) {
574 assert(u->load_state == UNIT_STUB);
576 if ((r = unit_load_fragment_and_dropin_optional(u)) < 0)
579 /* This is a new unit? Then let's add in some extras */
580 if (u->load_state == UNIT_LOADED) {
581 if ((r = unit_add_exec_dependencies(u, &m->exec_context)) < 0)
584 if (UNIT(m)->fragment_path)
585 m->from_fragment = true;
586 else if (m->from_etc_fstab)
587 /* We always add several default dependencies to fstab mounts,
588 * but we do not want the implicit complementing of Wants= with After=
589 * in the target unit that this mount unit will be hooked into. */
590 UNIT(m)->default_dependencies = false;
593 if (!(m->where = unit_name_to_path(u->id)))
596 path_kill_slashes(m->where);
598 if (!UNIT(m)->description)
599 if ((r = unit_set_description(u, m->where)) < 0)
602 if ((r = mount_add_device_links(m)) < 0)
605 if ((r = mount_add_mount_links(m)) < 0)
608 if ((r = mount_add_socket_links(m)) < 0)
611 if ((r = mount_add_swap_links(m)) < 0)
614 if ((r = mount_add_path_links(m)) < 0)
617 if ((r = mount_add_automount_links(m)) < 0)
620 if ((r = mount_add_fstab_links(m)) < 0)
623 if (UNIT(m)->default_dependencies || m->from_etc_fstab)
624 if ((r = mount_add_default_dependencies(m)) < 0)
627 if ((r = unit_add_default_cgroups(u)) < 0)
630 mount_fix_timeouts(m);
633 return mount_verify(m);
636 static int mount_notify_automount(Mount *m, int status) {
643 SET_FOREACH(p, UNIT(m)->dependencies[UNIT_TRIGGERED_BY], i)
644 if (p->type == UNIT_AUTOMOUNT) {
645 r = automount_send_ready(AUTOMOUNT(p), status);
653 static void mount_set_state(Mount *m, MountState state) {
654 MountState old_state;
657 old_state = m->state;
660 if (state != MOUNT_MOUNTING &&
661 state != MOUNT_MOUNTING_DONE &&
662 state != MOUNT_REMOUNTING &&
663 state != MOUNT_UNMOUNTING &&
664 state != MOUNT_MOUNTING_SIGTERM &&
665 state != MOUNT_MOUNTING_SIGKILL &&
666 state != MOUNT_UNMOUNTING_SIGTERM &&
667 state != MOUNT_UNMOUNTING_SIGKILL &&
668 state != MOUNT_REMOUNTING_SIGTERM &&
669 state != MOUNT_REMOUNTING_SIGKILL) {
670 unit_unwatch_timer(UNIT(m), &m->timer_watch);
671 mount_unwatch_control_pid(m);
672 m->control_command = NULL;
673 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
676 if (state == MOUNT_MOUNTED ||
677 state == MOUNT_REMOUNTING)
678 mount_notify_automount(m, 0);
679 else if (state == MOUNT_DEAD ||
680 state == MOUNT_UNMOUNTING ||
681 state == MOUNT_MOUNTING_SIGTERM ||
682 state == MOUNT_MOUNTING_SIGKILL ||
683 state == MOUNT_REMOUNTING_SIGTERM ||
684 state == MOUNT_REMOUNTING_SIGKILL ||
685 state == MOUNT_UNMOUNTING_SIGTERM ||
686 state == MOUNT_UNMOUNTING_SIGKILL ||
687 state == MOUNT_FAILED)
688 mount_notify_automount(m, -ENODEV);
690 if (state != old_state)
691 log_debug("%s changed %s -> %s",
693 mount_state_to_string(old_state),
694 mount_state_to_string(state));
696 unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state], m->reload_result == MOUNT_SUCCESS);
697 m->reload_result = MOUNT_SUCCESS;
700 static int mount_coldplug(Unit *u) {
702 MountState new_state = MOUNT_DEAD;
706 assert(m->state == MOUNT_DEAD);
708 if (m->deserialized_state != m->state)
709 new_state = m->deserialized_state;
710 else if (m->from_proc_self_mountinfo)
711 new_state = MOUNT_MOUNTED;
713 if (new_state != m->state) {
715 if (new_state == MOUNT_MOUNTING ||
716 new_state == MOUNT_MOUNTING_DONE ||
717 new_state == MOUNT_REMOUNTING ||
718 new_state == MOUNT_UNMOUNTING ||
719 new_state == MOUNT_MOUNTING_SIGTERM ||
720 new_state == MOUNT_MOUNTING_SIGKILL ||
721 new_state == MOUNT_UNMOUNTING_SIGTERM ||
722 new_state == MOUNT_UNMOUNTING_SIGKILL ||
723 new_state == MOUNT_REMOUNTING_SIGTERM ||
724 new_state == MOUNT_REMOUNTING_SIGKILL) {
726 if (m->control_pid <= 0)
729 if ((r = unit_watch_pid(UNIT(m), m->control_pid)) < 0)
732 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
736 mount_set_state(m, new_state);
742 static void mount_dump(Unit *u, FILE *f, const char *prefix) {
749 p = get_mount_parameters(m);
752 "%sMount State: %s\n"
756 "%sFile System Type: %s\n"
758 "%sFrom /etc/fstab: %s\n"
759 "%sFrom /proc/self/mountinfo: %s\n"
760 "%sFrom fragment: %s\n"
761 "%sDirectoryMode: %04o\n",
762 prefix, mount_state_to_string(m->state),
763 prefix, mount_result_to_string(m->result),
765 prefix, strna(p->what),
766 prefix, strna(p->fstype),
767 prefix, strna(p->options),
768 prefix, yes_no(m->from_etc_fstab),
769 prefix, yes_no(m->from_proc_self_mountinfo),
770 prefix, yes_no(m->from_fragment),
771 prefix, m->directory_mode);
773 if (m->control_pid > 0)
775 "%sControl PID: %lu\n",
776 prefix, (unsigned long) m->control_pid);
778 exec_context_dump(&m->exec_context, f, prefix);
781 static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
789 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
792 if ((r = exec_spawn(c,
796 UNIT(m)->manager->environment,
800 UNIT(m)->manager->confirm_spawn,
801 UNIT(m)->cgroup_bondings,
802 UNIT(m)->cgroup_attributes,
807 if ((r = unit_watch_pid(UNIT(m), pid)) < 0)
808 /* FIXME: we need to do something here */
816 unit_unwatch_timer(UNIT(m), &m->timer_watch);
821 static void mount_enter_dead(Mount *m, MountResult f) {
824 if (f != MOUNT_SUCCESS)
827 mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD);
830 static void mount_enter_mounted(Mount *m, MountResult f) {
833 if (f != MOUNT_SUCCESS)
836 mount_set_state(m, MOUNT_MOUNTED);
839 static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
842 bool wait_for_exit = false;
846 if (f != MOUNT_SUCCESS)
849 if (m->exec_context.kill_mode != KILL_NONE) {
850 int sig = (state == MOUNT_MOUNTING_SIGTERM ||
851 state == MOUNT_UNMOUNTING_SIGTERM ||
852 state == MOUNT_REMOUNTING_SIGTERM) ? m->exec_context.kill_signal : SIGKILL;
854 if (m->control_pid > 0) {
855 if (kill_and_sigcont(m->control_pid, sig) < 0 && errno != ESRCH)
857 log_warning("Failed to kill control process %li: %m", (long) m->control_pid);
859 wait_for_exit = true;
862 if (m->exec_context.kill_mode == KILL_CONTROL_GROUP) {
864 if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
869 /* Exclude the control pid from being killed via the cgroup */
870 if (m->control_pid > 0)
871 if ((r = set_put(pid_set, LONG_TO_PTR(m->control_pid))) < 0)
874 r = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, sig, true, pid_set, NULL);
876 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
877 log_warning("Failed to kill control group: %s", strerror(-r));
879 wait_for_exit = true;
887 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
890 mount_set_state(m, state);
891 } else if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
892 mount_enter_mounted(m, MOUNT_SUCCESS);
894 mount_enter_dead(m, MOUNT_SUCCESS);
899 log_warning("%s failed to kill processes: %s", UNIT(m)->id, strerror(-r));
901 if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
902 mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
904 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
910 static void mount_enter_unmounting(Mount *m) {
915 m->control_command_id = MOUNT_EXEC_UNMOUNT;
916 m->control_command = m->exec_command + MOUNT_EXEC_UNMOUNT;
918 if ((r = exec_command_set(
925 mount_unwatch_control_pid(m);
927 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
930 mount_set_state(m, MOUNT_UNMOUNTING);
935 log_warning("%s failed to run 'umount' task: %s", UNIT(m)->id, strerror(-r));
936 mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
939 static void mount_enter_mounting(Mount *m) {
945 m->control_command_id = MOUNT_EXEC_MOUNT;
946 m->control_command = m->exec_command + MOUNT_EXEC_MOUNT;
948 mkdir_p(m->where, m->directory_mode);
950 /* Create the source directory for bind-mounts if needed */
951 p = get_mount_parameters_configured(m);
952 if (p && mount_is_bind(p))
953 mkdir_p(p->what, m->directory_mode);
955 if (m->from_fragment)
956 r = exec_command_set(
959 m->parameters_fragment.what,
961 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
962 m->parameters_fragment.options ? "-o" : NULL, m->parameters_fragment.options,
964 else if (m->from_etc_fstab)
965 r = exec_command_set(
976 mount_unwatch_control_pid(m);
978 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
981 mount_set_state(m, MOUNT_MOUNTING);
986 log_warning("%s failed to run 'mount' task: %s", UNIT(m)->id, strerror(-r));
987 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
990 static void mount_enter_mounting_done(Mount *m) {
993 mount_set_state(m, MOUNT_MOUNTING_DONE);
996 static void mount_enter_remounting(Mount *m) {
1001 m->control_command_id = MOUNT_EXEC_REMOUNT;
1002 m->control_command = m->exec_command + MOUNT_EXEC_REMOUNT;
1004 if (m->from_fragment) {
1008 if (m->parameters_fragment.options) {
1009 if (!(buf = strappend("remount,", m->parameters_fragment.options))) {
1018 r = exec_command_set(
1021 m->parameters_fragment.what,
1023 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
1028 } else if (m->from_etc_fstab)
1029 r = exec_command_set(
1041 mount_unwatch_control_pid(m);
1043 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
1046 mount_set_state(m, MOUNT_REMOUNTING);
1051 log_warning("%s failed to run 'remount' task: %s", UNIT(m)->id, strerror(-r));
1052 m->reload_result = MOUNT_FAILURE_RESOURCES;
1053 mount_enter_mounted(m, MOUNT_SUCCESS);
1056 static int mount_start(Unit *u) {
1057 Mount *m = MOUNT(u);
1061 /* We cannot fulfill this request right now, try again later
1063 if (m->state == MOUNT_UNMOUNTING ||
1064 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1065 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1066 m->state == MOUNT_MOUNTING_SIGTERM ||
1067 m->state == MOUNT_MOUNTING_SIGKILL)
1070 /* Already on it! */
1071 if (m->state == MOUNT_MOUNTING)
1074 assert(m->state == MOUNT_DEAD || m->state == MOUNT_FAILED);
1076 m->result = MOUNT_SUCCESS;
1077 m->reload_result = MOUNT_SUCCESS;
1079 mount_enter_mounting(m);
1083 static int mount_stop(Unit *u) {
1084 Mount *m = MOUNT(u);
1089 if (m->state == MOUNT_UNMOUNTING ||
1090 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1091 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1092 m->state == MOUNT_MOUNTING_SIGTERM ||
1093 m->state == MOUNT_MOUNTING_SIGKILL)
1096 assert(m->state == MOUNT_MOUNTING ||
1097 m->state == MOUNT_MOUNTING_DONE ||
1098 m->state == MOUNT_MOUNTED ||
1099 m->state == MOUNT_REMOUNTING ||
1100 m->state == MOUNT_REMOUNTING_SIGTERM ||
1101 m->state == MOUNT_REMOUNTING_SIGKILL);
1103 mount_enter_unmounting(m);
1107 static int mount_reload(Unit *u) {
1108 Mount *m = MOUNT(u);
1112 if (m->state == MOUNT_MOUNTING_DONE)
1115 assert(m->state == MOUNT_MOUNTED);
1117 mount_enter_remounting(m);
1121 static int mount_serialize(Unit *u, FILE *f, FDSet *fds) {
1122 Mount *m = MOUNT(u);
1128 unit_serialize_item(u, f, "state", mount_state_to_string(m->state));
1129 unit_serialize_item(u, f, "result", mount_result_to_string(m->result));
1130 unit_serialize_item(u, f, "reload-result", mount_result_to_string(m->reload_result));
1132 if (m->control_pid > 0)
1133 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) m->control_pid);
1135 if (m->control_command_id >= 0)
1136 unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(m->control_command_id));
1141 static int mount_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1142 Mount *m = MOUNT(u);
1149 if (streq(key, "state")) {
1152 if ((state = mount_state_from_string(value)) < 0)
1153 log_debug("Failed to parse state value %s", value);
1155 m->deserialized_state = state;
1156 } else if (streq(key, "result")) {
1159 f = mount_result_from_string(value);
1161 log_debug("Failed to parse result value %s", value);
1162 else if (f != MOUNT_SUCCESS)
1165 } else if (streq(key, "reload-result")) {
1168 f = mount_result_from_string(value);
1170 log_debug("Failed to parse reload result value %s", value);
1171 else if (f != MOUNT_SUCCESS)
1172 m->reload_result = f;
1174 } else if (streq(key, "control-pid")) {
1177 if (parse_pid(value, &pid) < 0)
1178 log_debug("Failed to parse control-pid value %s", value);
1180 m->control_pid = pid;
1181 } else if (streq(key, "control-command")) {
1182 MountExecCommand id;
1184 if ((id = mount_exec_command_from_string(value)) < 0)
1185 log_debug("Failed to parse exec-command value %s", value);
1187 m->control_command_id = id;
1188 m->control_command = m->exec_command + id;
1192 log_debug("Unknown serialization key '%s'", key);
1197 static UnitActiveState mount_active_state(Unit *u) {
1200 return state_translation_table[MOUNT(u)->state];
1203 static const char *mount_sub_state_to_string(Unit *u) {
1206 return mount_state_to_string(MOUNT(u)->state);
1209 static bool mount_check_gc(Unit *u) {
1210 Mount *m = MOUNT(u);
1214 return m->from_etc_fstab || m->from_proc_self_mountinfo;
1217 static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1218 Mount *m = MOUNT(u);
1224 if (pid != m->control_pid)
1229 if (is_clean_exit(code, status))
1231 else if (code == CLD_EXITED)
1232 f = MOUNT_FAILURE_EXIT_CODE;
1233 else if (code == CLD_KILLED)
1234 f = MOUNT_FAILURE_SIGNAL;
1235 else if (code == CLD_DUMPED)
1236 f = MOUNT_FAILURE_CORE_DUMP;
1238 assert_not_reached("Unknown code");
1240 if (f != MOUNT_SUCCESS)
1243 if (m->control_command) {
1244 exec_status_exit(&m->control_command->exec_status, &m->exec_context, pid, code, status);
1246 m->control_command = NULL;
1247 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
1250 log_full(f == MOUNT_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
1251 "%s mount process exited, code=%s status=%i", u->id, sigchld_code_to_string(code), status);
1253 /* Note that mount(8) returning and the kernel sending us a
1254 * mount table change event might happen out-of-order. If an
1255 * operation succeed we assume the kernel will follow soon too
1256 * and already change into the resulting state. If it fails
1257 * we check if the kernel still knows about the mount. and
1258 * change state accordingly. */
1262 case MOUNT_MOUNTING:
1263 case MOUNT_MOUNTING_DONE:
1264 case MOUNT_MOUNTING_SIGKILL:
1265 case MOUNT_MOUNTING_SIGTERM:
1267 if (f == MOUNT_SUCCESS)
1268 mount_enter_mounted(m, f);
1269 else if (m->from_proc_self_mountinfo)
1270 mount_enter_mounted(m, f);
1272 mount_enter_dead(m, f);
1275 case MOUNT_REMOUNTING:
1276 case MOUNT_REMOUNTING_SIGKILL:
1277 case MOUNT_REMOUNTING_SIGTERM:
1279 m->reload_result = f;
1280 if (m->from_proc_self_mountinfo)
1281 mount_enter_mounted(m, MOUNT_SUCCESS);
1283 mount_enter_dead(m, MOUNT_SUCCESS);
1287 case MOUNT_UNMOUNTING:
1288 case MOUNT_UNMOUNTING_SIGKILL:
1289 case MOUNT_UNMOUNTING_SIGTERM:
1291 if (f == MOUNT_SUCCESS)
1292 mount_enter_dead(m, f);
1293 else if (m->from_proc_self_mountinfo)
1294 mount_enter_mounted(m, f);
1296 mount_enter_dead(m, f);
1300 assert_not_reached("Uh, control process died at wrong time.");
1303 /* Notify clients about changed exit status */
1304 unit_add_to_dbus_queue(u);
1307 static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
1308 Mount *m = MOUNT(u);
1311 assert(elapsed == 1);
1312 assert(w == &m->timer_watch);
1316 case MOUNT_MOUNTING:
1317 case MOUNT_MOUNTING_DONE:
1318 log_warning("%s mounting timed out. Stopping.", u->id);
1319 mount_enter_signal(m, MOUNT_MOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1322 case MOUNT_REMOUNTING:
1323 log_warning("%s remounting timed out. Stopping.", u->id);
1324 m->reload_result = MOUNT_FAILURE_TIMEOUT;
1325 mount_enter_mounted(m, MOUNT_SUCCESS);
1328 case MOUNT_UNMOUNTING:
1329 log_warning("%s unmounting timed out. Stopping.", u->id);
1330 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1333 case MOUNT_MOUNTING_SIGTERM:
1334 if (m->exec_context.send_sigkill) {
1335 log_warning("%s mounting timed out. Killing.", u->id);
1336 mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1338 log_warning("%s mounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1340 if (m->from_proc_self_mountinfo)
1341 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1343 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1347 case MOUNT_REMOUNTING_SIGTERM:
1348 if (m->exec_context.send_sigkill) {
1349 log_warning("%s remounting timed out. Killing.", u->id);
1350 mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1352 log_warning("%s remounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1354 if (m->from_proc_self_mountinfo)
1355 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1357 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1361 case MOUNT_UNMOUNTING_SIGTERM:
1362 if (m->exec_context.send_sigkill) {
1363 log_warning("%s unmounting timed out. Killing.", u->id);
1364 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1366 log_warning("%s unmounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1368 if (m->from_proc_self_mountinfo)
1369 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1371 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1375 case MOUNT_MOUNTING_SIGKILL:
1376 case MOUNT_REMOUNTING_SIGKILL:
1377 case MOUNT_UNMOUNTING_SIGKILL:
1378 log_warning("%s mount process still around after SIGKILL. Ignoring.", u->id);
1380 if (m->from_proc_self_mountinfo)
1381 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1383 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1387 assert_not_reached("Timeout at wrong time.");
1391 static int mount_add_one(
1395 const char *options,
1398 bool from_proc_self_mountinfo,
1403 char *e, *w = NULL, *o = NULL, *f = NULL;
1412 assert(!set_flags || from_proc_self_mountinfo);
1414 /* Ignore API mount points. They should never be referenced in
1415 * dependencies ever. */
1416 if (mount_point_is_api(where) || mount_point_ignore(where))
1419 if (streq(fstype, "autofs"))
1422 /* probably some kind of swap, ignore */
1423 if (!is_path(where))
1426 e = unit_name_from_path(where, ".mount");
1430 u = manager_get_unit(m, e);
1434 u = unit_new(m, sizeof(Mount));
1440 r = unit_add_name(u, e);
1446 MOUNT(u)->where = strdup(where);
1447 if (!MOUNT(u)->where) {
1452 unit_add_to_load_queue(u);
1458 if (!(w = strdup(what)) ||
1459 !(o = strdup(options)) ||
1460 !(f = strdup(fstype))) {
1465 if (from_proc_self_mountinfo) {
1466 p = &MOUNT(u)->parameters_proc_self_mountinfo;
1469 MOUNT(u)->is_mounted = true;
1470 MOUNT(u)->just_mounted = !MOUNT(u)->from_proc_self_mountinfo;
1471 MOUNT(u)->just_changed = !streq_ptr(p->options, o);
1474 MOUNT(u)->from_proc_self_mountinfo = true;
1476 p = &MOUNT(u)->parameters_etc_fstab;
1477 MOUNT(u)->from_etc_fstab = true;
1491 unit_add_to_dbus_queue(u);
1506 static int mount_find_pri(char *options) {
1510 if (!(pri = mount_test_option(options, "pri")))
1516 r = strtoul(pri, &end, 10);
1521 if (end == pri || (*end != ',' && *end != 0))
1527 static int mount_load_etc_fstab(Manager *m) {
1535 f = setmntent("/etc/fstab", "r");
1537 return errno == ENOENT ? 0 : -errno;
1539 while ((me = getmntent(f))) {
1543 if (!(what = fstab_node_to_udev_node(me->mnt_fsname))) {
1548 if (!(where = strdup(me->mnt_dir))) {
1555 path_kill_slashes(what);
1557 if (where[0] == '/')
1558 path_kill_slashes(where);
1560 if (streq(me->mnt_type, "swap")) {
1563 if ((pri = mount_find_pri(me->mnt_opts)) < 0)
1570 !!mount_test_option(me->mnt_opts, "noauto"),
1571 !!mount_test_option(me->mnt_opts, "nofail"),
1574 k = mount_add_one(m, what, where, me->mnt_opts, me->mnt_type, me->mnt_passno, false, false);
1589 static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
1592 char *device, *path, *options, *options2, *fstype, *d, *p, *o;
1596 rewind(m->proc_self_mountinfo);
1601 device = path = options = options2 = fstype = d = p = o = NULL;
1603 if ((k = fscanf(m->proc_self_mountinfo,
1604 "%*s " /* (1) mount id */
1605 "%*s " /* (2) parent id */
1606 "%*s " /* (3) major:minor */
1607 "%*s " /* (4) root */
1608 "%ms " /* (5) mount point */
1609 "%ms" /* (6) mount options */
1610 "%*[^-]" /* (7) optional fields */
1611 "- " /* (8) separator */
1612 "%ms " /* (9) file system type */
1613 "%ms" /* (10) mount source */
1614 "%ms" /* (11) mount options 2 */
1615 "%*[^\n]", /* some rubbish at the end */
1625 log_warning("Failed to parse /proc/self/mountinfo:%u.", i);
1629 if (asprintf(&o, "%s,%s", options, options2) < 0) {
1634 if (!(d = cunescape(device)) ||
1635 !(p = cunescape(path))) {
1640 if ((k = mount_add_one(m, d, p, o, fstype, 0, true, set_flags)) < 0)
1667 static void mount_shutdown(Manager *m) {
1670 if (m->proc_self_mountinfo) {
1671 fclose(m->proc_self_mountinfo);
1672 m->proc_self_mountinfo = NULL;
1676 static int mount_enumerate(Manager *m) {
1678 struct epoll_event ev;
1681 if (!m->proc_self_mountinfo) {
1682 if (!(m->proc_self_mountinfo = fopen("/proc/self/mountinfo", "re")))
1685 m->mount_watch.type = WATCH_MOUNT;
1686 m->mount_watch.fd = fileno(m->proc_self_mountinfo);
1689 ev.events = EPOLLPRI;
1690 ev.data.ptr = &m->mount_watch;
1692 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->mount_watch.fd, &ev) < 0)
1696 if ((r = mount_load_etc_fstab(m)) < 0)
1699 if ((r = mount_load_proc_self_mountinfo(m, false)) < 0)
1709 void mount_fd_event(Manager *m, int events) {
1714 assert(events & EPOLLPRI);
1716 /* The manager calls this for every fd event happening on the
1717 * /proc/self/mountinfo file, which informs us about mounting
1720 if ((r = mount_load_proc_self_mountinfo(m, true)) < 0) {
1721 log_error("Failed to reread /proc/self/mountinfo: %s", strerror(-r));
1723 /* Reset flags, just in case, for later calls */
1724 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1725 Mount *mount = MOUNT(u);
1727 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1733 manager_dispatch_load_queue(m);
1735 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1736 Mount *mount = MOUNT(u);
1738 if (!mount->is_mounted) {
1739 /* This has just been unmounted. */
1741 mount->from_proc_self_mountinfo = false;
1743 switch (mount->state) {
1746 mount_enter_dead(mount, MOUNT_SUCCESS);
1750 mount_set_state(mount, mount->state);
1755 } else if (mount->just_mounted || mount->just_changed) {
1757 /* New or changed mount entry */
1759 switch (mount->state) {
1763 mount_enter_mounted(mount, MOUNT_SUCCESS);
1766 case MOUNT_MOUNTING:
1767 mount_enter_mounting_done(mount);
1771 /* Nothing really changed, but let's
1772 * issue an notification call
1773 * nonetheless, in case somebody is
1774 * waiting for this. (e.g. file system
1775 * ro/rw remounts.) */
1776 mount_set_state(mount, mount->state);
1781 /* Reset the flags for later calls */
1782 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1786 static void mount_reset_failed(Unit *u) {
1787 Mount *m = MOUNT(u);
1791 if (m->state == MOUNT_FAILED)
1792 mount_set_state(m, MOUNT_DEAD);
1794 m->result = MOUNT_SUCCESS;
1795 m->reload_result = MOUNT_SUCCESS;
1798 static int mount_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError *error) {
1799 Mount *m = MOUNT(u);
1801 Set *pid_set = NULL;
1805 if (who == KILL_MAIN) {
1806 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "Mount units have no main processes");
1810 if (m->control_pid <= 0 && who == KILL_CONTROL) {
1811 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
1815 if (who == KILL_CONTROL || who == KILL_ALL)
1816 if (m->control_pid > 0)
1817 if (kill(m->control_pid, signo) < 0)
1820 if (who == KILL_ALL && mode == KILL_CONTROL_GROUP) {
1823 if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func)))
1826 /* Exclude the control pid from being killed via the cgroup */
1827 if (m->control_pid > 0)
1828 if ((q = set_put(pid_set, LONG_TO_PTR(m->control_pid))) < 0) {
1833 q = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, signo, false, pid_set, NULL);
1835 if (q != -EAGAIN && q != -ESRCH && q != -ENOENT)
1846 static const char* const mount_state_table[_MOUNT_STATE_MAX] = {
1847 [MOUNT_DEAD] = "dead",
1848 [MOUNT_MOUNTING] = "mounting",
1849 [MOUNT_MOUNTING_DONE] = "mounting-done",
1850 [MOUNT_MOUNTED] = "mounted",
1851 [MOUNT_REMOUNTING] = "remounting",
1852 [MOUNT_UNMOUNTING] = "unmounting",
1853 [MOUNT_MOUNTING_SIGTERM] = "mounting-sigterm",
1854 [MOUNT_MOUNTING_SIGKILL] = "mounting-sigkill",
1855 [MOUNT_REMOUNTING_SIGTERM] = "remounting-sigterm",
1856 [MOUNT_REMOUNTING_SIGKILL] = "remounting-sigkill",
1857 [MOUNT_UNMOUNTING_SIGTERM] = "unmounting-sigterm",
1858 [MOUNT_UNMOUNTING_SIGKILL] = "unmounting-sigkill",
1859 [MOUNT_FAILED] = "failed"
1862 DEFINE_STRING_TABLE_LOOKUP(mount_state, MountState);
1864 static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = {
1865 [MOUNT_EXEC_MOUNT] = "ExecMount",
1866 [MOUNT_EXEC_UNMOUNT] = "ExecUnmount",
1867 [MOUNT_EXEC_REMOUNT] = "ExecRemount",
1870 DEFINE_STRING_TABLE_LOOKUP(mount_exec_command, MountExecCommand);
1872 static const char* const mount_result_table[_MOUNT_RESULT_MAX] = {
1873 [MOUNT_SUCCESS] = "success",
1874 [MOUNT_FAILURE_RESOURCES] = "resources",
1875 [MOUNT_FAILURE_TIMEOUT] = "timeout",
1876 [MOUNT_FAILURE_EXIT_CODE] = "exit-code",
1877 [MOUNT_FAILURE_SIGNAL] = "signal",
1878 [MOUNT_FAILURE_CORE_DUMP] = "core-dump"
1881 DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult);
1883 const UnitVTable mount_vtable = {
1885 .object_size = sizeof(Mount),
1892 .no_instances = true,
1893 .show_status = true,
1899 .coldplug = mount_coldplug,
1903 .start = mount_start,
1905 .reload = mount_reload,
1909 .serialize = mount_serialize,
1910 .deserialize_item = mount_deserialize_item,
1912 .active_state = mount_active_state,
1913 .sub_state_to_string = mount_sub_state_to_string,
1915 .check_gc = mount_check_gc,
1917 .sigchld_event = mount_sigchld_event,
1918 .timer_event = mount_timer_event,
1920 .reset_failed = mount_reset_failed,
1922 .bus_interface = "org.freedesktop.systemd1.Mount",
1923 .bus_message_handler = bus_mount_message_handler,
1924 .bus_invalidating_properties = bus_mount_invalidating_properties,
1926 .enumerate = mount_enumerate,
1927 .shutdown = mount_shutdown