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 int mount_add_requires_mounts_links(Mount *m) {
272 LIST_FOREACH(has_requires_mounts_for, other, UNIT(m)->manager->has_requires_mounts_for) {
273 r = unit_add_one_mount_link(other, m);
281 static char* mount_test_option(const char *haystack, const char *needle) {
286 /* Like glibc's hasmntopt(), but works on a string, not a
293 me.mnt_opts = (char*) haystack;
295 return hasmntopt(&me, needle);
298 static bool mount_is_network(MountParameters *p) {
301 if (mount_test_option(p->options, "_netdev"))
304 if (p->fstype && fstype_is_network(p->fstype))
310 static bool mount_is_bind(MountParameters *p) {
313 if (mount_test_option(p->options, "bind"))
316 if (p->fstype && streq(p->fstype, "bind"))
322 static bool needs_quota(MountParameters *p) {
325 if (mount_is_network(p))
328 if (mount_is_bind(p))
331 return mount_test_option(p->options, "usrquota") ||
332 mount_test_option(p->options, "grpquota") ||
333 mount_test_option(p->options, "quota") ||
334 mount_test_option(p->options, "usrjquota") ||
335 mount_test_option(p->options, "grpjquota");
338 static int mount_add_fstab_links(Mount *m) {
339 const char *target, *after, *tu_wants = NULL;
343 bool noauto, nofail, automount;
347 if (UNIT(m)->manager->running_as != MANAGER_SYSTEM)
350 if (!(p = get_mount_parameters_configured(m)))
353 if (p != &m->parameters_etc_fstab)
356 noauto = !!mount_test_option(p->options, "noauto");
357 nofail = !!mount_test_option(p->options, "nofail");
359 mount_test_option(p->options, "comment=systemd.automount") ||
360 mount_test_option(p->options, "x-systemd-automount");
362 if (mount_is_network(p)) {
363 target = SPECIAL_REMOTE_FS_TARGET;
364 after = tu_wants = SPECIAL_REMOTE_FS_PRE_TARGET;
366 target = SPECIAL_LOCAL_FS_TARGET;
367 after = SPECIAL_LOCAL_FS_PRE_TARGET;
370 r = manager_load_unit(UNIT(m)->manager, target, NULL, NULL, &tu);
375 r = unit_add_dependency_by_name(tu, UNIT_WANTS, tu_wants, NULL, true);
381 r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, after, NULL, true);
389 if ((r = unit_load_related_unit(UNIT(m), ".automount", &am)) < 0)
392 /* If auto is configured as well also pull in the
393 * mount right-away, but don't rely on it. */
394 if (!noauto) /* automount + auto */
395 if ((r = unit_add_dependency(tu, UNIT_WANTS, UNIT(m), true)) < 0)
398 /* Install automount unit */
399 if (!nofail) /* automount + fail */
400 return unit_add_two_dependencies(tu, UNIT_AFTER, UNIT_REQUIRES, am, true);
401 else /* automount + nofail */
402 return unit_add_two_dependencies(tu, UNIT_AFTER, UNIT_WANTS, am, true);
404 } else if (!noauto) {
406 /* Automatically add mount points that aren't natively
407 * configured to local-fs.target */
409 if (!nofail) /* auto + fail */
410 return unit_add_two_dependencies(tu, UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
411 else /* auto + nofail */
412 return unit_add_dependency(tu, UNIT_WANTS, UNIT(m), true);
418 static int mount_add_device_links(Mount *m) {
424 if (!(p = get_mount_parameters_configured(m)))
430 if (!mount_is_bind(p) &&
431 !path_equal(m->where, "/") &&
432 p == &m->parameters_etc_fstab) {
435 noauto = !!mount_test_option(p->options, "noauto");
436 nofail = !!mount_test_option(p->options, "nofail");
438 if ((r = unit_add_node_link(UNIT(m), p->what,
440 UNIT(m)->manager->running_as == MANAGER_SYSTEM)) < 0)
446 UNIT(m)->manager->running_as == MANAGER_SYSTEM &&
447 !path_equal(m->where, "/")) {
450 /* Let's add in the fsck service */
452 /* aka SPECIAL_FSCK_SERVICE */
453 if (!(name = unit_name_from_path_instance("fsck", p->what, ".service")))
456 if ((r = manager_load_unit_prepare(UNIT(m)->manager, name, NULL, NULL, &fsck)) < 0) {
457 log_warning("Failed to prepare unit %s: %s", name, strerror(-r));
464 SERVICE(fsck)->fsck_passno = p->passno;
466 if ((r = unit_add_two_dependencies(UNIT(m), UNIT_AFTER, UNIT_REQUIRES, fsck, true)) < 0)
473 static int mount_add_default_dependencies(Mount *m) {
479 if (UNIT(m)->manager->running_as != MANAGER_SYSTEM)
482 p = get_mount_parameters_configured(m);
483 if (p && needs_quota(p)) {
484 if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTACHECK_SERVICE, NULL, true)) < 0 ||
485 (r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTAON_SERVICE, NULL, true)) < 0)
489 if (!path_equal(m->where, "/"))
490 if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true)) < 0)
496 static int mount_fix_timeouts(Mount *m) {
498 const char *timeout = NULL;
507 if (!(p = get_mount_parameters_configured(m)))
510 /* Allow configuration how long we wait for a device that
511 * backs a mount point to show up. This is useful to support
512 * endless device timeouts for devices that show up only after
513 * user input, like crypto devices. */
515 if ((timeout = mount_test_option(p->options, "comment=systemd.device-timeout")))
517 else if ((timeout = mount_test_option(p->options, "x-systemd-device-timeout")))
522 t = strndup(timeout, strcspn(timeout, ",;" WHITESPACE));
526 r = parse_usec(t, &u);
530 log_warning("Failed to parse timeout for %s, ignoring: %s", m->where, timeout);
534 SET_FOREACH(other, UNIT(m)->dependencies[UNIT_AFTER], i) {
535 if (other->type != UNIT_DEVICE)
538 other->job_timeout = u;
544 static int mount_verify(Mount *m) {
549 if (UNIT(m)->load_state != UNIT_LOADED)
552 if (!m->from_etc_fstab && !m->from_fragment && !m->from_proc_self_mountinfo)
555 if (!(e = unit_name_from_path(m->where, ".mount")))
558 b = unit_has_name(UNIT(m), e);
562 log_error("%s's Where setting doesn't match unit name. Refusing.", UNIT(m)->id);
566 if (mount_point_is_api(m->where) || mount_point_ignore(m->where)) {
567 log_error("Cannot create mount unit for API file system %s. Refusing.", m->where);
571 if (UNIT(m)->fragment_path && !m->parameters_fragment.what) {
572 log_error("%s's What setting is missing. Refusing.", UNIT(m)->id);
576 if (m->exec_context.pam_name && m->exec_context.kill_mode != KILL_CONTROL_GROUP) {
577 log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(m)->id);
584 static int mount_load(Unit *u) {
589 assert(u->load_state == UNIT_STUB);
591 if ((r = unit_load_fragment_and_dropin_optional(u)) < 0)
594 /* This is a new unit? Then let's add in some extras */
595 if (u->load_state == UNIT_LOADED) {
596 if ((r = unit_add_exec_dependencies(u, &m->exec_context)) < 0)
599 if (UNIT(m)->fragment_path)
600 m->from_fragment = true;
601 else if (m->from_etc_fstab)
602 /* We always add several default dependencies to fstab mounts,
603 * but we do not want the implicit complementing of Wants= with After=
604 * in the target unit that this mount unit will be hooked into. */
605 UNIT(m)->default_dependencies = false;
608 if (!(m->where = unit_name_to_path(u->id)))
611 path_kill_slashes(m->where);
613 if (!UNIT(m)->description)
614 if ((r = unit_set_description(u, m->where)) < 0)
617 if ((r = mount_add_device_links(m)) < 0)
620 if ((r = mount_add_mount_links(m)) < 0)
623 if ((r = mount_add_socket_links(m)) < 0)
626 if ((r = mount_add_swap_links(m)) < 0)
629 if ((r = mount_add_path_links(m)) < 0)
632 r = mount_add_requires_mounts_links(m);
636 if ((r = mount_add_automount_links(m)) < 0)
639 if ((r = mount_add_fstab_links(m)) < 0)
642 if (UNIT(m)->default_dependencies || m->from_etc_fstab)
643 if ((r = mount_add_default_dependencies(m)) < 0)
646 if ((r = unit_add_default_cgroups(u)) < 0)
649 mount_fix_timeouts(m);
652 return mount_verify(m);
655 static int mount_notify_automount(Mount *m, int status) {
662 SET_FOREACH(p, UNIT(m)->dependencies[UNIT_TRIGGERED_BY], i)
663 if (p->type == UNIT_AUTOMOUNT) {
664 r = automount_send_ready(AUTOMOUNT(p), status);
672 static void mount_set_state(Mount *m, MountState state) {
673 MountState old_state;
676 old_state = m->state;
679 if (state != MOUNT_MOUNTING &&
680 state != MOUNT_MOUNTING_DONE &&
681 state != MOUNT_REMOUNTING &&
682 state != MOUNT_UNMOUNTING &&
683 state != MOUNT_MOUNTING_SIGTERM &&
684 state != MOUNT_MOUNTING_SIGKILL &&
685 state != MOUNT_UNMOUNTING_SIGTERM &&
686 state != MOUNT_UNMOUNTING_SIGKILL &&
687 state != MOUNT_REMOUNTING_SIGTERM &&
688 state != MOUNT_REMOUNTING_SIGKILL) {
689 unit_unwatch_timer(UNIT(m), &m->timer_watch);
690 mount_unwatch_control_pid(m);
691 m->control_command = NULL;
692 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
695 if (state == MOUNT_MOUNTED ||
696 state == MOUNT_REMOUNTING)
697 mount_notify_automount(m, 0);
698 else if (state == MOUNT_DEAD ||
699 state == MOUNT_UNMOUNTING ||
700 state == MOUNT_MOUNTING_SIGTERM ||
701 state == MOUNT_MOUNTING_SIGKILL ||
702 state == MOUNT_REMOUNTING_SIGTERM ||
703 state == MOUNT_REMOUNTING_SIGKILL ||
704 state == MOUNT_UNMOUNTING_SIGTERM ||
705 state == MOUNT_UNMOUNTING_SIGKILL ||
706 state == MOUNT_FAILED)
707 mount_notify_automount(m, -ENODEV);
709 if (state != old_state)
710 log_debug("%s changed %s -> %s",
712 mount_state_to_string(old_state),
713 mount_state_to_string(state));
715 unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state], m->reload_result == MOUNT_SUCCESS);
716 m->reload_result = MOUNT_SUCCESS;
719 static int mount_coldplug(Unit *u) {
721 MountState new_state = MOUNT_DEAD;
725 assert(m->state == MOUNT_DEAD);
727 if (m->deserialized_state != m->state)
728 new_state = m->deserialized_state;
729 else if (m->from_proc_self_mountinfo)
730 new_state = MOUNT_MOUNTED;
732 if (new_state != m->state) {
734 if (new_state == MOUNT_MOUNTING ||
735 new_state == MOUNT_MOUNTING_DONE ||
736 new_state == MOUNT_REMOUNTING ||
737 new_state == MOUNT_UNMOUNTING ||
738 new_state == MOUNT_MOUNTING_SIGTERM ||
739 new_state == MOUNT_MOUNTING_SIGKILL ||
740 new_state == MOUNT_UNMOUNTING_SIGTERM ||
741 new_state == MOUNT_UNMOUNTING_SIGKILL ||
742 new_state == MOUNT_REMOUNTING_SIGTERM ||
743 new_state == MOUNT_REMOUNTING_SIGKILL) {
745 if (m->control_pid <= 0)
748 if ((r = unit_watch_pid(UNIT(m), m->control_pid)) < 0)
751 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
755 mount_set_state(m, new_state);
761 static void mount_dump(Unit *u, FILE *f, const char *prefix) {
768 p = get_mount_parameters(m);
771 "%sMount State: %s\n"
775 "%sFile System Type: %s\n"
777 "%sFrom /etc/fstab: %s\n"
778 "%sFrom /proc/self/mountinfo: %s\n"
779 "%sFrom fragment: %s\n"
780 "%sDirectoryMode: %04o\n",
781 prefix, mount_state_to_string(m->state),
782 prefix, mount_result_to_string(m->result),
784 prefix, strna(p->what),
785 prefix, strna(p->fstype),
786 prefix, strna(p->options),
787 prefix, yes_no(m->from_etc_fstab),
788 prefix, yes_no(m->from_proc_self_mountinfo),
789 prefix, yes_no(m->from_fragment),
790 prefix, m->directory_mode);
792 if (m->control_pid > 0)
794 "%sControl PID: %lu\n",
795 prefix, (unsigned long) m->control_pid);
797 exec_context_dump(&m->exec_context, f, prefix);
800 static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
808 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
811 if ((r = exec_spawn(c,
815 UNIT(m)->manager->environment,
819 UNIT(m)->manager->confirm_spawn,
820 UNIT(m)->cgroup_bondings,
821 UNIT(m)->cgroup_attributes,
827 if ((r = unit_watch_pid(UNIT(m), pid)) < 0)
828 /* FIXME: we need to do something here */
836 unit_unwatch_timer(UNIT(m), &m->timer_watch);
841 static void mount_enter_dead(Mount *m, MountResult f) {
844 if (f != MOUNT_SUCCESS)
847 mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD);
850 static void mount_enter_mounted(Mount *m, MountResult f) {
853 if (f != MOUNT_SUCCESS)
856 mount_set_state(m, MOUNT_MOUNTED);
859 static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
862 bool wait_for_exit = false;
866 if (f != MOUNT_SUCCESS)
869 if (m->exec_context.kill_mode != KILL_NONE) {
870 int sig = (state == MOUNT_MOUNTING_SIGTERM ||
871 state == MOUNT_UNMOUNTING_SIGTERM ||
872 state == MOUNT_REMOUNTING_SIGTERM) ? m->exec_context.kill_signal : SIGKILL;
874 if (m->control_pid > 0) {
875 if (kill_and_sigcont(m->control_pid, sig) < 0 && errno != ESRCH)
877 log_warning("Failed to kill control process %li: %m", (long) m->control_pid);
879 wait_for_exit = true;
882 if (m->exec_context.kill_mode == KILL_CONTROL_GROUP) {
884 if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
889 /* Exclude the control pid from being killed via the cgroup */
890 if (m->control_pid > 0)
891 if ((r = set_put(pid_set, LONG_TO_PTR(m->control_pid))) < 0)
894 r = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, sig, true, pid_set, NULL);
896 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
897 log_warning("Failed to kill control group: %s", strerror(-r));
899 wait_for_exit = true;
907 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
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(m->where, m->directory_mode);
970 /* Create the source directory for bind-mounts if needed */
971 p = get_mount_parameters_configured(m);
972 if (p && mount_is_bind(p))
973 mkdir_p(p->what, m->directory_mode);
975 if (m->from_fragment)
976 r = exec_command_set(
979 m->parameters_fragment.what,
981 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
982 m->parameters_fragment.options ? "-o" : NULL, m->parameters_fragment.options,
984 else if (m->from_etc_fstab)
985 r = exec_command_set(
996 mount_unwatch_control_pid(m);
998 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
1001 mount_set_state(m, MOUNT_MOUNTING);
1006 log_warning("%s failed to run 'mount' task: %s", UNIT(m)->id, strerror(-r));
1007 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
1010 static void mount_enter_mounting_done(Mount *m) {
1013 mount_set_state(m, MOUNT_MOUNTING_DONE);
1016 static void mount_enter_remounting(Mount *m) {
1021 m->control_command_id = MOUNT_EXEC_REMOUNT;
1022 m->control_command = m->exec_command + MOUNT_EXEC_REMOUNT;
1024 if (m->from_fragment) {
1028 if (m->parameters_fragment.options) {
1029 if (!(buf = strappend("remount,", m->parameters_fragment.options))) {
1038 r = exec_command_set(
1041 m->parameters_fragment.what,
1043 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
1048 } else if (m->from_etc_fstab)
1049 r = exec_command_set(
1061 mount_unwatch_control_pid(m);
1063 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
1066 mount_set_state(m, MOUNT_REMOUNTING);
1071 log_warning("%s failed to run 'remount' task: %s", UNIT(m)->id, strerror(-r));
1072 m->reload_result = MOUNT_FAILURE_RESOURCES;
1073 mount_enter_mounted(m, MOUNT_SUCCESS);
1076 static int mount_start(Unit *u) {
1077 Mount *m = MOUNT(u);
1081 /* We cannot fulfill this request right now, try again later
1083 if (m->state == MOUNT_UNMOUNTING ||
1084 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1085 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1086 m->state == MOUNT_MOUNTING_SIGTERM ||
1087 m->state == MOUNT_MOUNTING_SIGKILL)
1090 /* Already on it! */
1091 if (m->state == MOUNT_MOUNTING)
1094 assert(m->state == MOUNT_DEAD || m->state == MOUNT_FAILED);
1096 m->result = MOUNT_SUCCESS;
1097 m->reload_result = MOUNT_SUCCESS;
1099 mount_enter_mounting(m);
1103 static int mount_stop(Unit *u) {
1104 Mount *m = MOUNT(u);
1109 if (m->state == MOUNT_UNMOUNTING ||
1110 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1111 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1112 m->state == MOUNT_MOUNTING_SIGTERM ||
1113 m->state == MOUNT_MOUNTING_SIGKILL)
1116 assert(m->state == MOUNT_MOUNTING ||
1117 m->state == MOUNT_MOUNTING_DONE ||
1118 m->state == MOUNT_MOUNTED ||
1119 m->state == MOUNT_REMOUNTING ||
1120 m->state == MOUNT_REMOUNTING_SIGTERM ||
1121 m->state == MOUNT_REMOUNTING_SIGKILL);
1123 mount_enter_unmounting(m);
1127 static int mount_reload(Unit *u) {
1128 Mount *m = MOUNT(u);
1132 if (m->state == MOUNT_MOUNTING_DONE)
1135 assert(m->state == MOUNT_MOUNTED);
1137 mount_enter_remounting(m);
1141 static int mount_serialize(Unit *u, FILE *f, FDSet *fds) {
1142 Mount *m = MOUNT(u);
1148 unit_serialize_item(u, f, "state", mount_state_to_string(m->state));
1149 unit_serialize_item(u, f, "result", mount_result_to_string(m->result));
1150 unit_serialize_item(u, f, "reload-result", mount_result_to_string(m->reload_result));
1152 if (m->control_pid > 0)
1153 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) m->control_pid);
1155 if (m->control_command_id >= 0)
1156 unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(m->control_command_id));
1161 static int mount_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1162 Mount *m = MOUNT(u);
1169 if (streq(key, "state")) {
1172 if ((state = mount_state_from_string(value)) < 0)
1173 log_debug("Failed to parse state value %s", value);
1175 m->deserialized_state = state;
1176 } else if (streq(key, "result")) {
1179 f = mount_result_from_string(value);
1181 log_debug("Failed to parse result value %s", value);
1182 else if (f != MOUNT_SUCCESS)
1185 } else if (streq(key, "reload-result")) {
1188 f = mount_result_from_string(value);
1190 log_debug("Failed to parse reload result value %s", value);
1191 else if (f != MOUNT_SUCCESS)
1192 m->reload_result = f;
1194 } else if (streq(key, "control-pid")) {
1197 if (parse_pid(value, &pid) < 0)
1198 log_debug("Failed to parse control-pid value %s", value);
1200 m->control_pid = pid;
1201 } else if (streq(key, "control-command")) {
1202 MountExecCommand id;
1204 if ((id = mount_exec_command_from_string(value)) < 0)
1205 log_debug("Failed to parse exec-command value %s", value);
1207 m->control_command_id = id;
1208 m->control_command = m->exec_command + id;
1212 log_debug("Unknown serialization key '%s'", key);
1217 static UnitActiveState mount_active_state(Unit *u) {
1220 return state_translation_table[MOUNT(u)->state];
1223 static const char *mount_sub_state_to_string(Unit *u) {
1226 return mount_state_to_string(MOUNT(u)->state);
1229 static bool mount_check_gc(Unit *u) {
1230 Mount *m = MOUNT(u);
1234 return m->from_etc_fstab || m->from_proc_self_mountinfo;
1237 static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1238 Mount *m = MOUNT(u);
1244 if (pid != m->control_pid)
1249 if (is_clean_exit(code, status))
1251 else if (code == CLD_EXITED)
1252 f = MOUNT_FAILURE_EXIT_CODE;
1253 else if (code == CLD_KILLED)
1254 f = MOUNT_FAILURE_SIGNAL;
1255 else if (code == CLD_DUMPED)
1256 f = MOUNT_FAILURE_CORE_DUMP;
1258 assert_not_reached("Unknown code");
1260 if (f != MOUNT_SUCCESS)
1263 if (m->control_command) {
1264 exec_status_exit(&m->control_command->exec_status, &m->exec_context, pid, code, status);
1266 m->control_command = NULL;
1267 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
1270 log_full(f == MOUNT_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
1271 "%s mount process exited, code=%s status=%i", u->id, sigchld_code_to_string(code), status);
1273 /* Note that mount(8) returning and the kernel sending us a
1274 * mount table change event might happen out-of-order. If an
1275 * operation succeed we assume the kernel will follow soon too
1276 * and already change into the resulting state. If it fails
1277 * we check if the kernel still knows about the mount. and
1278 * change state accordingly. */
1282 case MOUNT_MOUNTING:
1283 case MOUNT_MOUNTING_DONE:
1284 case MOUNT_MOUNTING_SIGKILL:
1285 case MOUNT_MOUNTING_SIGTERM:
1287 if (f == MOUNT_SUCCESS)
1288 mount_enter_mounted(m, f);
1289 else if (m->from_proc_self_mountinfo)
1290 mount_enter_mounted(m, f);
1292 mount_enter_dead(m, f);
1295 case MOUNT_REMOUNTING:
1296 case MOUNT_REMOUNTING_SIGKILL:
1297 case MOUNT_REMOUNTING_SIGTERM:
1299 m->reload_result = f;
1300 if (m->from_proc_self_mountinfo)
1301 mount_enter_mounted(m, MOUNT_SUCCESS);
1303 mount_enter_dead(m, MOUNT_SUCCESS);
1307 case MOUNT_UNMOUNTING:
1308 case MOUNT_UNMOUNTING_SIGKILL:
1309 case MOUNT_UNMOUNTING_SIGTERM:
1311 if (f == MOUNT_SUCCESS)
1312 mount_enter_dead(m, f);
1313 else if (m->from_proc_self_mountinfo)
1314 mount_enter_mounted(m, f);
1316 mount_enter_dead(m, f);
1320 assert_not_reached("Uh, control process died at wrong time.");
1323 /* Notify clients about changed exit status */
1324 unit_add_to_dbus_queue(u);
1327 static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
1328 Mount *m = MOUNT(u);
1331 assert(elapsed == 1);
1332 assert(w == &m->timer_watch);
1336 case MOUNT_MOUNTING:
1337 case MOUNT_MOUNTING_DONE:
1338 log_warning("%s mounting timed out. Stopping.", u->id);
1339 mount_enter_signal(m, MOUNT_MOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1342 case MOUNT_REMOUNTING:
1343 log_warning("%s remounting timed out. Stopping.", u->id);
1344 m->reload_result = MOUNT_FAILURE_TIMEOUT;
1345 mount_enter_mounted(m, MOUNT_SUCCESS);
1348 case MOUNT_UNMOUNTING:
1349 log_warning("%s unmounting timed out. Stopping.", u->id);
1350 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1353 case MOUNT_MOUNTING_SIGTERM:
1354 if (m->exec_context.send_sigkill) {
1355 log_warning("%s mounting timed out. Killing.", u->id);
1356 mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1358 log_warning("%s mounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1360 if (m->from_proc_self_mountinfo)
1361 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1363 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1367 case MOUNT_REMOUNTING_SIGTERM:
1368 if (m->exec_context.send_sigkill) {
1369 log_warning("%s remounting timed out. Killing.", u->id);
1370 mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1372 log_warning("%s remounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1374 if (m->from_proc_self_mountinfo)
1375 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1377 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1381 case MOUNT_UNMOUNTING_SIGTERM:
1382 if (m->exec_context.send_sigkill) {
1383 log_warning("%s unmounting timed out. Killing.", u->id);
1384 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1386 log_warning("%s unmounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1388 if (m->from_proc_self_mountinfo)
1389 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1391 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1395 case MOUNT_MOUNTING_SIGKILL:
1396 case MOUNT_REMOUNTING_SIGKILL:
1397 case MOUNT_UNMOUNTING_SIGKILL:
1398 log_warning("%s mount process still around after SIGKILL. Ignoring.", u->id);
1400 if (m->from_proc_self_mountinfo)
1401 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1403 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1407 assert_not_reached("Timeout at wrong time.");
1411 static int mount_add_one(
1415 const char *options,
1418 bool from_proc_self_mountinfo,
1423 char *e, *w = NULL, *o = NULL, *f = NULL;
1432 assert(!set_flags || from_proc_self_mountinfo);
1434 /* Ignore API mount points. They should never be referenced in
1435 * dependencies ever. */
1436 if (mount_point_is_api(where) || mount_point_ignore(where))
1439 if (streq(fstype, "autofs"))
1442 /* probably some kind of swap, ignore */
1443 if (!is_path(where))
1446 e = unit_name_from_path(where, ".mount");
1450 u = manager_get_unit(m, e);
1454 u = unit_new(m, sizeof(Mount));
1460 r = unit_add_name(u, e);
1466 MOUNT(u)->where = strdup(where);
1467 if (!MOUNT(u)->where) {
1472 unit_add_to_load_queue(u);
1478 if (!(w = strdup(what)) ||
1479 !(o = strdup(options)) ||
1480 !(f = strdup(fstype))) {
1485 if (from_proc_self_mountinfo) {
1486 p = &MOUNT(u)->parameters_proc_self_mountinfo;
1489 MOUNT(u)->is_mounted = true;
1490 MOUNT(u)->just_mounted = !MOUNT(u)->from_proc_self_mountinfo;
1491 MOUNT(u)->just_changed = !streq_ptr(p->options, o);
1494 MOUNT(u)->from_proc_self_mountinfo = true;
1496 p = &MOUNT(u)->parameters_etc_fstab;
1497 MOUNT(u)->from_etc_fstab = true;
1511 unit_add_to_dbus_queue(u);
1526 static int mount_find_pri(char *options) {
1530 if (!(pri = mount_test_option(options, "pri")))
1536 r = strtoul(pri, &end, 10);
1541 if (end == pri || (*end != ',' && *end != 0))
1547 static int mount_load_etc_fstab(Manager *m) {
1555 f = setmntent("/etc/fstab", "r");
1557 return errno == ENOENT ? 0 : -errno;
1559 while ((me = getmntent(f))) {
1563 if (!(what = fstab_node_to_udev_node(me->mnt_fsname))) {
1568 if (!(where = strdup(me->mnt_dir))) {
1575 path_kill_slashes(what);
1577 if (where[0] == '/')
1578 path_kill_slashes(where);
1580 if (streq(me->mnt_type, "swap")) {
1583 if ((pri = mount_find_pri(me->mnt_opts)) < 0)
1590 !!mount_test_option(me->mnt_opts, "noauto"),
1591 !!mount_test_option(me->mnt_opts, "nofail"),
1594 k = mount_add_one(m, what, where, me->mnt_opts, me->mnt_type, me->mnt_passno, false, false);
1609 static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
1612 char *device, *path, *options, *options2, *fstype, *d, *p, *o;
1616 rewind(m->proc_self_mountinfo);
1621 device = path = options = options2 = fstype = d = p = o = NULL;
1623 if ((k = fscanf(m->proc_self_mountinfo,
1624 "%*s " /* (1) mount id */
1625 "%*s " /* (2) parent id */
1626 "%*s " /* (3) major:minor */
1627 "%*s " /* (4) root */
1628 "%ms " /* (5) mount point */
1629 "%ms" /* (6) mount options */
1630 "%*[^-]" /* (7) optional fields */
1631 "- " /* (8) separator */
1632 "%ms " /* (9) file system type */
1633 "%ms" /* (10) mount source */
1634 "%ms" /* (11) mount options 2 */
1635 "%*[^\n]", /* some rubbish at the end */
1645 log_warning("Failed to parse /proc/self/mountinfo:%u.", i);
1649 if (asprintf(&o, "%s,%s", options, options2) < 0) {
1654 if (!(d = cunescape(device)) ||
1655 !(p = cunescape(path))) {
1660 if ((k = mount_add_one(m, d, p, o, fstype, 0, true, set_flags)) < 0)
1687 static void mount_shutdown(Manager *m) {
1690 if (m->proc_self_mountinfo) {
1691 fclose(m->proc_self_mountinfo);
1692 m->proc_self_mountinfo = NULL;
1696 static int mount_enumerate(Manager *m) {
1698 struct epoll_event ev;
1701 if (!m->proc_self_mountinfo) {
1702 if (!(m->proc_self_mountinfo = fopen("/proc/self/mountinfo", "re")))
1705 m->mount_watch.type = WATCH_MOUNT;
1706 m->mount_watch.fd = fileno(m->proc_self_mountinfo);
1709 ev.events = EPOLLPRI;
1710 ev.data.ptr = &m->mount_watch;
1712 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->mount_watch.fd, &ev) < 0)
1716 if ((r = mount_load_etc_fstab(m)) < 0)
1719 if ((r = mount_load_proc_self_mountinfo(m, false)) < 0)
1729 void mount_fd_event(Manager *m, int events) {
1734 assert(events & EPOLLPRI);
1736 /* The manager calls this for every fd event happening on the
1737 * /proc/self/mountinfo file, which informs us about mounting
1740 if ((r = mount_load_proc_self_mountinfo(m, true)) < 0) {
1741 log_error("Failed to reread /proc/self/mountinfo: %s", strerror(-r));
1743 /* Reset flags, just in case, for later calls */
1744 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1745 Mount *mount = MOUNT(u);
1747 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1753 manager_dispatch_load_queue(m);
1755 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1756 Mount *mount = MOUNT(u);
1758 if (!mount->is_mounted) {
1759 /* This has just been unmounted. */
1761 mount->from_proc_self_mountinfo = false;
1763 switch (mount->state) {
1766 mount_enter_dead(mount, MOUNT_SUCCESS);
1770 mount_set_state(mount, mount->state);
1775 } else if (mount->just_mounted || mount->just_changed) {
1777 /* New or changed mount entry */
1779 switch (mount->state) {
1783 mount_enter_mounted(mount, MOUNT_SUCCESS);
1786 case MOUNT_MOUNTING:
1787 mount_enter_mounting_done(mount);
1791 /* Nothing really changed, but let's
1792 * issue an notification call
1793 * nonetheless, in case somebody is
1794 * waiting for this. (e.g. file system
1795 * ro/rw remounts.) */
1796 mount_set_state(mount, mount->state);
1801 /* Reset the flags for later calls */
1802 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1806 static void mount_reset_failed(Unit *u) {
1807 Mount *m = MOUNT(u);
1811 if (m->state == MOUNT_FAILED)
1812 mount_set_state(m, MOUNT_DEAD);
1814 m->result = MOUNT_SUCCESS;
1815 m->reload_result = MOUNT_SUCCESS;
1818 static int mount_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError *error) {
1819 Mount *m = MOUNT(u);
1821 Set *pid_set = NULL;
1825 if (who == KILL_MAIN) {
1826 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "Mount units have no main processes");
1830 if (m->control_pid <= 0 && who == KILL_CONTROL) {
1831 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
1835 if (who == KILL_CONTROL || who == KILL_ALL)
1836 if (m->control_pid > 0)
1837 if (kill(m->control_pid, signo) < 0)
1840 if (who == KILL_ALL && mode == KILL_CONTROL_GROUP) {
1843 if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func)))
1846 /* Exclude the control pid from being killed via the cgroup */
1847 if (m->control_pid > 0)
1848 if ((q = set_put(pid_set, LONG_TO_PTR(m->control_pid))) < 0) {
1853 q = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, signo, false, pid_set, NULL);
1855 if (q != -EAGAIN && q != -ESRCH && q != -ENOENT)
1866 static const char* const mount_state_table[_MOUNT_STATE_MAX] = {
1867 [MOUNT_DEAD] = "dead",
1868 [MOUNT_MOUNTING] = "mounting",
1869 [MOUNT_MOUNTING_DONE] = "mounting-done",
1870 [MOUNT_MOUNTED] = "mounted",
1871 [MOUNT_REMOUNTING] = "remounting",
1872 [MOUNT_UNMOUNTING] = "unmounting",
1873 [MOUNT_MOUNTING_SIGTERM] = "mounting-sigterm",
1874 [MOUNT_MOUNTING_SIGKILL] = "mounting-sigkill",
1875 [MOUNT_REMOUNTING_SIGTERM] = "remounting-sigterm",
1876 [MOUNT_REMOUNTING_SIGKILL] = "remounting-sigkill",
1877 [MOUNT_UNMOUNTING_SIGTERM] = "unmounting-sigterm",
1878 [MOUNT_UNMOUNTING_SIGKILL] = "unmounting-sigkill",
1879 [MOUNT_FAILED] = "failed"
1882 DEFINE_STRING_TABLE_LOOKUP(mount_state, MountState);
1884 static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = {
1885 [MOUNT_EXEC_MOUNT] = "ExecMount",
1886 [MOUNT_EXEC_UNMOUNT] = "ExecUnmount",
1887 [MOUNT_EXEC_REMOUNT] = "ExecRemount",
1890 DEFINE_STRING_TABLE_LOOKUP(mount_exec_command, MountExecCommand);
1892 static const char* const mount_result_table[_MOUNT_RESULT_MAX] = {
1893 [MOUNT_SUCCESS] = "success",
1894 [MOUNT_FAILURE_RESOURCES] = "resources",
1895 [MOUNT_FAILURE_TIMEOUT] = "timeout",
1896 [MOUNT_FAILURE_EXIT_CODE] = "exit-code",
1897 [MOUNT_FAILURE_SIGNAL] = "signal",
1898 [MOUNT_FAILURE_CORE_DUMP] = "core-dump"
1901 DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult);
1903 const UnitVTable mount_vtable = {
1905 .object_size = sizeof(Mount),
1912 .no_instances = true,
1913 .show_status = true,
1919 .coldplug = mount_coldplug,
1923 .start = mount_start,
1925 .reload = mount_reload,
1929 .serialize = mount_serialize,
1930 .deserialize_item = mount_deserialize_item,
1932 .active_state = mount_active_state,
1933 .sub_state_to_string = mount_sub_state_to_string,
1935 .check_gc = mount_check_gc,
1937 .sigchld_event = mount_sigchld_event,
1938 .timer_event = mount_timer_event,
1940 .reset_failed = mount_reset_failed,
1942 .bus_interface = "org.freedesktop.systemd1.Mount",
1943 .bus_message_handler = bus_mount_message_handler,
1944 .bus_invalidating_properties = bus_mount_invalidating_properties,
1946 .enumerate = mount_enumerate,
1947 .shutdown = mount_shutdown