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,
808 if ((r = unit_watch_pid(UNIT(m), pid)) < 0)
809 /* FIXME: we need to do something here */
817 unit_unwatch_timer(UNIT(m), &m->timer_watch);
822 static void mount_enter_dead(Mount *m, MountResult f) {
825 if (f != MOUNT_SUCCESS)
828 mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD);
831 static void mount_enter_mounted(Mount *m, MountResult f) {
834 if (f != MOUNT_SUCCESS)
837 mount_set_state(m, MOUNT_MOUNTED);
840 static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
843 bool wait_for_exit = false;
847 if (f != MOUNT_SUCCESS)
850 if (m->exec_context.kill_mode != KILL_NONE) {
851 int sig = (state == MOUNT_MOUNTING_SIGTERM ||
852 state == MOUNT_UNMOUNTING_SIGTERM ||
853 state == MOUNT_REMOUNTING_SIGTERM) ? m->exec_context.kill_signal : SIGKILL;
855 if (m->control_pid > 0) {
856 if (kill_and_sigcont(m->control_pid, sig) < 0 && errno != ESRCH)
858 log_warning("Failed to kill control process %li: %m", (long) m->control_pid);
860 wait_for_exit = true;
863 if (m->exec_context.kill_mode == KILL_CONTROL_GROUP) {
865 if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
870 /* Exclude the control pid from being killed via the cgroup */
871 if (m->control_pid > 0)
872 if ((r = set_put(pid_set, LONG_TO_PTR(m->control_pid))) < 0)
875 r = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, sig, true, pid_set, NULL);
877 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
878 log_warning("Failed to kill control group: %s", strerror(-r));
880 wait_for_exit = true;
888 if ((r = unit_watch_timer(UNIT(m), m->timeout_usec, &m->timer_watch)) < 0)
891 mount_set_state(m, state);
892 } else if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
893 mount_enter_mounted(m, MOUNT_SUCCESS);
895 mount_enter_dead(m, MOUNT_SUCCESS);
900 log_warning("%s failed to kill processes: %s", UNIT(m)->id, strerror(-r));
902 if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
903 mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
905 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
911 static void mount_enter_unmounting(Mount *m) {
916 m->control_command_id = MOUNT_EXEC_UNMOUNT;
917 m->control_command = m->exec_command + MOUNT_EXEC_UNMOUNT;
919 if ((r = exec_command_set(
926 mount_unwatch_control_pid(m);
928 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
931 mount_set_state(m, MOUNT_UNMOUNTING);
936 log_warning("%s failed to run 'umount' task: %s", UNIT(m)->id, strerror(-r));
937 mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
940 static void mount_enter_mounting(Mount *m) {
946 m->control_command_id = MOUNT_EXEC_MOUNT;
947 m->control_command = m->exec_command + MOUNT_EXEC_MOUNT;
949 mkdir_p(m->where, m->directory_mode);
951 /* Create the source directory for bind-mounts if needed */
952 p = get_mount_parameters_configured(m);
953 if (p && mount_is_bind(p))
954 mkdir_p(p->what, m->directory_mode);
956 if (m->from_fragment)
957 r = exec_command_set(
960 m->parameters_fragment.what,
962 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
963 m->parameters_fragment.options ? "-o" : NULL, m->parameters_fragment.options,
965 else if (m->from_etc_fstab)
966 r = exec_command_set(
977 mount_unwatch_control_pid(m);
979 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
982 mount_set_state(m, MOUNT_MOUNTING);
987 log_warning("%s failed to run 'mount' task: %s", UNIT(m)->id, strerror(-r));
988 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
991 static void mount_enter_mounting_done(Mount *m) {
994 mount_set_state(m, MOUNT_MOUNTING_DONE);
997 static void mount_enter_remounting(Mount *m) {
1002 m->control_command_id = MOUNT_EXEC_REMOUNT;
1003 m->control_command = m->exec_command + MOUNT_EXEC_REMOUNT;
1005 if (m->from_fragment) {
1009 if (m->parameters_fragment.options) {
1010 if (!(buf = strappend("remount,", m->parameters_fragment.options))) {
1019 r = exec_command_set(
1022 m->parameters_fragment.what,
1024 "-t", m->parameters_fragment.fstype ? m->parameters_fragment.fstype : "auto",
1029 } else if (m->from_etc_fstab)
1030 r = exec_command_set(
1042 mount_unwatch_control_pid(m);
1044 if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
1047 mount_set_state(m, MOUNT_REMOUNTING);
1052 log_warning("%s failed to run 'remount' task: %s", UNIT(m)->id, strerror(-r));
1053 m->reload_result = MOUNT_FAILURE_RESOURCES;
1054 mount_enter_mounted(m, MOUNT_SUCCESS);
1057 static int mount_start(Unit *u) {
1058 Mount *m = MOUNT(u);
1062 /* We cannot fulfill this request right now, try again later
1064 if (m->state == MOUNT_UNMOUNTING ||
1065 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1066 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1067 m->state == MOUNT_MOUNTING_SIGTERM ||
1068 m->state == MOUNT_MOUNTING_SIGKILL)
1071 /* Already on it! */
1072 if (m->state == MOUNT_MOUNTING)
1075 assert(m->state == MOUNT_DEAD || m->state == MOUNT_FAILED);
1077 m->result = MOUNT_SUCCESS;
1078 m->reload_result = MOUNT_SUCCESS;
1080 mount_enter_mounting(m);
1084 static int mount_stop(Unit *u) {
1085 Mount *m = MOUNT(u);
1090 if (m->state == MOUNT_UNMOUNTING ||
1091 m->state == MOUNT_UNMOUNTING_SIGKILL ||
1092 m->state == MOUNT_UNMOUNTING_SIGTERM ||
1093 m->state == MOUNT_MOUNTING_SIGTERM ||
1094 m->state == MOUNT_MOUNTING_SIGKILL)
1097 assert(m->state == MOUNT_MOUNTING ||
1098 m->state == MOUNT_MOUNTING_DONE ||
1099 m->state == MOUNT_MOUNTED ||
1100 m->state == MOUNT_REMOUNTING ||
1101 m->state == MOUNT_REMOUNTING_SIGTERM ||
1102 m->state == MOUNT_REMOUNTING_SIGKILL);
1104 mount_enter_unmounting(m);
1108 static int mount_reload(Unit *u) {
1109 Mount *m = MOUNT(u);
1113 if (m->state == MOUNT_MOUNTING_DONE)
1116 assert(m->state == MOUNT_MOUNTED);
1118 mount_enter_remounting(m);
1122 static int mount_serialize(Unit *u, FILE *f, FDSet *fds) {
1123 Mount *m = MOUNT(u);
1129 unit_serialize_item(u, f, "state", mount_state_to_string(m->state));
1130 unit_serialize_item(u, f, "result", mount_result_to_string(m->result));
1131 unit_serialize_item(u, f, "reload-result", mount_result_to_string(m->reload_result));
1133 if (m->control_pid > 0)
1134 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) m->control_pid);
1136 if (m->control_command_id >= 0)
1137 unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(m->control_command_id));
1142 static int mount_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
1143 Mount *m = MOUNT(u);
1150 if (streq(key, "state")) {
1153 if ((state = mount_state_from_string(value)) < 0)
1154 log_debug("Failed to parse state value %s", value);
1156 m->deserialized_state = state;
1157 } else if (streq(key, "result")) {
1160 f = mount_result_from_string(value);
1162 log_debug("Failed to parse result value %s", value);
1163 else if (f != MOUNT_SUCCESS)
1166 } else if (streq(key, "reload-result")) {
1169 f = mount_result_from_string(value);
1171 log_debug("Failed to parse reload result value %s", value);
1172 else if (f != MOUNT_SUCCESS)
1173 m->reload_result = f;
1175 } else if (streq(key, "control-pid")) {
1178 if (parse_pid(value, &pid) < 0)
1179 log_debug("Failed to parse control-pid value %s", value);
1181 m->control_pid = pid;
1182 } else if (streq(key, "control-command")) {
1183 MountExecCommand id;
1185 if ((id = mount_exec_command_from_string(value)) < 0)
1186 log_debug("Failed to parse exec-command value %s", value);
1188 m->control_command_id = id;
1189 m->control_command = m->exec_command + id;
1193 log_debug("Unknown serialization key '%s'", key);
1198 static UnitActiveState mount_active_state(Unit *u) {
1201 return state_translation_table[MOUNT(u)->state];
1204 static const char *mount_sub_state_to_string(Unit *u) {
1207 return mount_state_to_string(MOUNT(u)->state);
1210 static bool mount_check_gc(Unit *u) {
1211 Mount *m = MOUNT(u);
1215 return m->from_etc_fstab || m->from_proc_self_mountinfo;
1218 static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1219 Mount *m = MOUNT(u);
1225 if (pid != m->control_pid)
1230 if (is_clean_exit(code, status))
1232 else if (code == CLD_EXITED)
1233 f = MOUNT_FAILURE_EXIT_CODE;
1234 else if (code == CLD_KILLED)
1235 f = MOUNT_FAILURE_SIGNAL;
1236 else if (code == CLD_DUMPED)
1237 f = MOUNT_FAILURE_CORE_DUMP;
1239 assert_not_reached("Unknown code");
1241 if (f != MOUNT_SUCCESS)
1244 if (m->control_command) {
1245 exec_status_exit(&m->control_command->exec_status, &m->exec_context, pid, code, status);
1247 m->control_command = NULL;
1248 m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
1251 log_full(f == MOUNT_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
1252 "%s mount process exited, code=%s status=%i", u->id, sigchld_code_to_string(code), status);
1254 /* Note that mount(8) returning and the kernel sending us a
1255 * mount table change event might happen out-of-order. If an
1256 * operation succeed we assume the kernel will follow soon too
1257 * and already change into the resulting state. If it fails
1258 * we check if the kernel still knows about the mount. and
1259 * change state accordingly. */
1263 case MOUNT_MOUNTING:
1264 case MOUNT_MOUNTING_DONE:
1265 case MOUNT_MOUNTING_SIGKILL:
1266 case MOUNT_MOUNTING_SIGTERM:
1268 if (f == MOUNT_SUCCESS)
1269 mount_enter_mounted(m, f);
1270 else if (m->from_proc_self_mountinfo)
1271 mount_enter_mounted(m, f);
1273 mount_enter_dead(m, f);
1276 case MOUNT_REMOUNTING:
1277 case MOUNT_REMOUNTING_SIGKILL:
1278 case MOUNT_REMOUNTING_SIGTERM:
1280 m->reload_result = f;
1281 if (m->from_proc_self_mountinfo)
1282 mount_enter_mounted(m, MOUNT_SUCCESS);
1284 mount_enter_dead(m, MOUNT_SUCCESS);
1288 case MOUNT_UNMOUNTING:
1289 case MOUNT_UNMOUNTING_SIGKILL:
1290 case MOUNT_UNMOUNTING_SIGTERM:
1292 if (f == MOUNT_SUCCESS)
1293 mount_enter_dead(m, f);
1294 else if (m->from_proc_self_mountinfo)
1295 mount_enter_mounted(m, f);
1297 mount_enter_dead(m, f);
1301 assert_not_reached("Uh, control process died at wrong time.");
1304 /* Notify clients about changed exit status */
1305 unit_add_to_dbus_queue(u);
1308 static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
1309 Mount *m = MOUNT(u);
1312 assert(elapsed == 1);
1313 assert(w == &m->timer_watch);
1317 case MOUNT_MOUNTING:
1318 case MOUNT_MOUNTING_DONE:
1319 log_warning("%s mounting timed out. Stopping.", u->id);
1320 mount_enter_signal(m, MOUNT_MOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1323 case MOUNT_REMOUNTING:
1324 log_warning("%s remounting timed out. Stopping.", u->id);
1325 m->reload_result = MOUNT_FAILURE_TIMEOUT;
1326 mount_enter_mounted(m, MOUNT_SUCCESS);
1329 case MOUNT_UNMOUNTING:
1330 log_warning("%s unmounting timed out. Stopping.", u->id);
1331 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_FAILURE_TIMEOUT);
1334 case MOUNT_MOUNTING_SIGTERM:
1335 if (m->exec_context.send_sigkill) {
1336 log_warning("%s mounting timed out. Killing.", u->id);
1337 mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1339 log_warning("%s mounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1341 if (m->from_proc_self_mountinfo)
1342 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1344 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1348 case MOUNT_REMOUNTING_SIGTERM:
1349 if (m->exec_context.send_sigkill) {
1350 log_warning("%s remounting timed out. Killing.", u->id);
1351 mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1353 log_warning("%s remounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1355 if (m->from_proc_self_mountinfo)
1356 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1358 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1362 case MOUNT_UNMOUNTING_SIGTERM:
1363 if (m->exec_context.send_sigkill) {
1364 log_warning("%s unmounting timed out. Killing.", u->id);
1365 mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
1367 log_warning("%s unmounting timed out. Skipping SIGKILL. Ignoring.", u->id);
1369 if (m->from_proc_self_mountinfo)
1370 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1372 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1376 case MOUNT_MOUNTING_SIGKILL:
1377 case MOUNT_REMOUNTING_SIGKILL:
1378 case MOUNT_UNMOUNTING_SIGKILL:
1379 log_warning("%s mount process still around after SIGKILL. Ignoring.", u->id);
1381 if (m->from_proc_self_mountinfo)
1382 mount_enter_mounted(m, MOUNT_FAILURE_TIMEOUT);
1384 mount_enter_dead(m, MOUNT_FAILURE_TIMEOUT);
1388 assert_not_reached("Timeout at wrong time.");
1392 static int mount_add_one(
1396 const char *options,
1399 bool from_proc_self_mountinfo,
1404 char *e, *w = NULL, *o = NULL, *f = NULL;
1413 assert(!set_flags || from_proc_self_mountinfo);
1415 /* Ignore API mount points. They should never be referenced in
1416 * dependencies ever. */
1417 if (mount_point_is_api(where) || mount_point_ignore(where))
1420 if (streq(fstype, "autofs"))
1423 /* probably some kind of swap, ignore */
1424 if (!is_path(where))
1427 e = unit_name_from_path(where, ".mount");
1431 u = manager_get_unit(m, e);
1435 u = unit_new(m, sizeof(Mount));
1441 r = unit_add_name(u, e);
1447 MOUNT(u)->where = strdup(where);
1448 if (!MOUNT(u)->where) {
1453 unit_add_to_load_queue(u);
1459 if (!(w = strdup(what)) ||
1460 !(o = strdup(options)) ||
1461 !(f = strdup(fstype))) {
1466 if (from_proc_self_mountinfo) {
1467 p = &MOUNT(u)->parameters_proc_self_mountinfo;
1470 MOUNT(u)->is_mounted = true;
1471 MOUNT(u)->just_mounted = !MOUNT(u)->from_proc_self_mountinfo;
1472 MOUNT(u)->just_changed = !streq_ptr(p->options, o);
1475 MOUNT(u)->from_proc_self_mountinfo = true;
1477 p = &MOUNT(u)->parameters_etc_fstab;
1478 MOUNT(u)->from_etc_fstab = true;
1492 unit_add_to_dbus_queue(u);
1507 static int mount_find_pri(char *options) {
1511 if (!(pri = mount_test_option(options, "pri")))
1517 r = strtoul(pri, &end, 10);
1522 if (end == pri || (*end != ',' && *end != 0))
1528 static int mount_load_etc_fstab(Manager *m) {
1536 f = setmntent("/etc/fstab", "r");
1538 return errno == ENOENT ? 0 : -errno;
1540 while ((me = getmntent(f))) {
1544 if (!(what = fstab_node_to_udev_node(me->mnt_fsname))) {
1549 if (!(where = strdup(me->mnt_dir))) {
1556 path_kill_slashes(what);
1558 if (where[0] == '/')
1559 path_kill_slashes(where);
1561 if (streq(me->mnt_type, "swap")) {
1564 if ((pri = mount_find_pri(me->mnt_opts)) < 0)
1571 !!mount_test_option(me->mnt_opts, "noauto"),
1572 !!mount_test_option(me->mnt_opts, "nofail"),
1575 k = mount_add_one(m, what, where, me->mnt_opts, me->mnt_type, me->mnt_passno, false, false);
1590 static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
1593 char *device, *path, *options, *options2, *fstype, *d, *p, *o;
1597 rewind(m->proc_self_mountinfo);
1602 device = path = options = options2 = fstype = d = p = o = NULL;
1604 if ((k = fscanf(m->proc_self_mountinfo,
1605 "%*s " /* (1) mount id */
1606 "%*s " /* (2) parent id */
1607 "%*s " /* (3) major:minor */
1608 "%*s " /* (4) root */
1609 "%ms " /* (5) mount point */
1610 "%ms" /* (6) mount options */
1611 "%*[^-]" /* (7) optional fields */
1612 "- " /* (8) separator */
1613 "%ms " /* (9) file system type */
1614 "%ms" /* (10) mount source */
1615 "%ms" /* (11) mount options 2 */
1616 "%*[^\n]", /* some rubbish at the end */
1626 log_warning("Failed to parse /proc/self/mountinfo:%u.", i);
1630 if (asprintf(&o, "%s,%s", options, options2) < 0) {
1635 if (!(d = cunescape(device)) ||
1636 !(p = cunescape(path))) {
1641 if ((k = mount_add_one(m, d, p, o, fstype, 0, true, set_flags)) < 0)
1668 static void mount_shutdown(Manager *m) {
1671 if (m->proc_self_mountinfo) {
1672 fclose(m->proc_self_mountinfo);
1673 m->proc_self_mountinfo = NULL;
1677 static int mount_enumerate(Manager *m) {
1679 struct epoll_event ev;
1682 if (!m->proc_self_mountinfo) {
1683 if (!(m->proc_self_mountinfo = fopen("/proc/self/mountinfo", "re")))
1686 m->mount_watch.type = WATCH_MOUNT;
1687 m->mount_watch.fd = fileno(m->proc_self_mountinfo);
1690 ev.events = EPOLLPRI;
1691 ev.data.ptr = &m->mount_watch;
1693 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->mount_watch.fd, &ev) < 0)
1697 if ((r = mount_load_etc_fstab(m)) < 0)
1700 if ((r = mount_load_proc_self_mountinfo(m, false)) < 0)
1710 void mount_fd_event(Manager *m, int events) {
1715 assert(events & EPOLLPRI);
1717 /* The manager calls this for every fd event happening on the
1718 * /proc/self/mountinfo file, which informs us about mounting
1721 if ((r = mount_load_proc_self_mountinfo(m, true)) < 0) {
1722 log_error("Failed to reread /proc/self/mountinfo: %s", strerror(-r));
1724 /* Reset flags, just in case, for later calls */
1725 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1726 Mount *mount = MOUNT(u);
1728 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1734 manager_dispatch_load_queue(m);
1736 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
1737 Mount *mount = MOUNT(u);
1739 if (!mount->is_mounted) {
1740 /* This has just been unmounted. */
1742 mount->from_proc_self_mountinfo = false;
1744 switch (mount->state) {
1747 mount_enter_dead(mount, MOUNT_SUCCESS);
1751 mount_set_state(mount, mount->state);
1756 } else if (mount->just_mounted || mount->just_changed) {
1758 /* New or changed mount entry */
1760 switch (mount->state) {
1764 mount_enter_mounted(mount, MOUNT_SUCCESS);
1767 case MOUNT_MOUNTING:
1768 mount_enter_mounting_done(mount);
1772 /* Nothing really changed, but let's
1773 * issue an notification call
1774 * nonetheless, in case somebody is
1775 * waiting for this. (e.g. file system
1776 * ro/rw remounts.) */
1777 mount_set_state(mount, mount->state);
1782 /* Reset the flags for later calls */
1783 mount->is_mounted = mount->just_mounted = mount->just_changed = false;
1787 static void mount_reset_failed(Unit *u) {
1788 Mount *m = MOUNT(u);
1792 if (m->state == MOUNT_FAILED)
1793 mount_set_state(m, MOUNT_DEAD);
1795 m->result = MOUNT_SUCCESS;
1796 m->reload_result = MOUNT_SUCCESS;
1799 static int mount_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError *error) {
1800 Mount *m = MOUNT(u);
1802 Set *pid_set = NULL;
1806 if (who == KILL_MAIN) {
1807 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "Mount units have no main processes");
1811 if (m->control_pid <= 0 && who == KILL_CONTROL) {
1812 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
1816 if (who == KILL_CONTROL || who == KILL_ALL)
1817 if (m->control_pid > 0)
1818 if (kill(m->control_pid, signo) < 0)
1821 if (who == KILL_ALL && mode == KILL_CONTROL_GROUP) {
1824 if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func)))
1827 /* Exclude the control pid from being killed via the cgroup */
1828 if (m->control_pid > 0)
1829 if ((q = set_put(pid_set, LONG_TO_PTR(m->control_pid))) < 0) {
1834 q = cgroup_bonding_kill_list(UNIT(m)->cgroup_bondings, signo, false, pid_set, NULL);
1836 if (q != -EAGAIN && q != -ESRCH && q != -ENOENT)
1847 static const char* const mount_state_table[_MOUNT_STATE_MAX] = {
1848 [MOUNT_DEAD] = "dead",
1849 [MOUNT_MOUNTING] = "mounting",
1850 [MOUNT_MOUNTING_DONE] = "mounting-done",
1851 [MOUNT_MOUNTED] = "mounted",
1852 [MOUNT_REMOUNTING] = "remounting",
1853 [MOUNT_UNMOUNTING] = "unmounting",
1854 [MOUNT_MOUNTING_SIGTERM] = "mounting-sigterm",
1855 [MOUNT_MOUNTING_SIGKILL] = "mounting-sigkill",
1856 [MOUNT_REMOUNTING_SIGTERM] = "remounting-sigterm",
1857 [MOUNT_REMOUNTING_SIGKILL] = "remounting-sigkill",
1858 [MOUNT_UNMOUNTING_SIGTERM] = "unmounting-sigterm",
1859 [MOUNT_UNMOUNTING_SIGKILL] = "unmounting-sigkill",
1860 [MOUNT_FAILED] = "failed"
1863 DEFINE_STRING_TABLE_LOOKUP(mount_state, MountState);
1865 static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = {
1866 [MOUNT_EXEC_MOUNT] = "ExecMount",
1867 [MOUNT_EXEC_UNMOUNT] = "ExecUnmount",
1868 [MOUNT_EXEC_REMOUNT] = "ExecRemount",
1871 DEFINE_STRING_TABLE_LOOKUP(mount_exec_command, MountExecCommand);
1873 static const char* const mount_result_table[_MOUNT_RESULT_MAX] = {
1874 [MOUNT_SUCCESS] = "success",
1875 [MOUNT_FAILURE_RESOURCES] = "resources",
1876 [MOUNT_FAILURE_TIMEOUT] = "timeout",
1877 [MOUNT_FAILURE_EXIT_CODE] = "exit-code",
1878 [MOUNT_FAILURE_SIGNAL] = "signal",
1879 [MOUNT_FAILURE_CORE_DUMP] = "core-dump"
1882 DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult);
1884 const UnitVTable mount_vtable = {
1886 .object_size = sizeof(Mount),
1893 .no_instances = true,
1894 .show_status = true,
1900 .coldplug = mount_coldplug,
1904 .start = mount_start,
1906 .reload = mount_reload,
1910 .serialize = mount_serialize,
1911 .deserialize_item = mount_deserialize_item,
1913 .active_state = mount_active_state,
1914 .sub_state_to_string = mount_sub_state_to_string,
1916 .check_gc = mount_check_gc,
1918 .sigchld_event = mount_sigchld_event,
1919 .timer_event = mount_timer_event,
1921 .reset_failed = mount_reset_failed,
1923 .bus_interface = "org.freedesktop.systemd1.Mount",
1924 .bus_message_handler = bus_mount_message_handler,
1925 .bus_invalidating_properties = bus_mount_invalidating_properties,
1927 .enumerate = mount_enumerate,
1928 .shutdown = mount_shutdown