1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2010 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
24 #include <sys/epoll.h>
26 #include "sd-messages.h"
28 #include "alloc-util.h"
29 #include "dbus-mount.h"
31 #include "exit-status.h"
32 #include "format-util.h"
33 #include "fstab-util.h"
37 #include "mount-setup.h"
38 #include "mount-util.h"
40 #include "parse-util.h"
41 #include "path-util.h"
42 #include "process-util.h"
44 #include "string-table.h"
45 #include "string-util.h"
47 #include "unit-name.h"
50 #define RETRY_UMOUNT_MAX 32
52 DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_table
*, mnt_free_table
);
53 DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_iter
*, mnt_free_iter
);
55 static const UnitActiveState state_translation_table
[_MOUNT_STATE_MAX
] = {
56 [MOUNT_DEAD
] = UNIT_INACTIVE
,
57 [MOUNT_MOUNTING
] = UNIT_ACTIVATING
,
58 [MOUNT_MOUNTING_DONE
] = UNIT_ACTIVE
,
59 [MOUNT_MOUNTED
] = UNIT_ACTIVE
,
60 [MOUNT_REMOUNTING
] = UNIT_RELOADING
,
61 [MOUNT_UNMOUNTING
] = UNIT_DEACTIVATING
,
62 [MOUNT_REMOUNTING_SIGTERM
] = UNIT_RELOADING
,
63 [MOUNT_REMOUNTING_SIGKILL
] = UNIT_RELOADING
,
64 [MOUNT_UNMOUNTING_SIGTERM
] = UNIT_DEACTIVATING
,
65 [MOUNT_UNMOUNTING_SIGKILL
] = UNIT_DEACTIVATING
,
66 [MOUNT_FAILED
] = UNIT_FAILED
69 static int mount_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
70 static int mount_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
72 static bool MOUNT_STATE_WITH_PROCESS(MountState state
) {
77 MOUNT_REMOUNTING_SIGTERM
,
78 MOUNT_REMOUNTING_SIGKILL
,
80 MOUNT_UNMOUNTING_SIGTERM
,
81 MOUNT_UNMOUNTING_SIGKILL
);
84 static bool mount_needs_network(const char *options
, const char *fstype
) {
85 if (fstab_test_option(options
, "_netdev\0"))
88 if (fstype
&& fstype_is_network(fstype
))
94 static bool mount_is_network(const MountParameters
*p
) {
97 return mount_needs_network(p
->options
, p
->fstype
);
100 static bool mount_is_loop(const MountParameters
*p
) {
103 if (fstab_test_option(p
->options
, "loop\0"))
109 static bool mount_is_bind(const MountParameters
*p
) {
112 if (fstab_test_option(p
->options
, "bind\0" "rbind\0"))
115 if (p
->fstype
&& STR_IN_SET(p
->fstype
, "bind", "rbind"))
121 static bool mount_is_auto(const MountParameters
*p
) {
124 return !fstab_test_option(p
->options
, "noauto\0");
127 static bool mount_is_automount(const MountParameters
*p
) {
130 return fstab_test_option(p
->options
,
131 "comment=systemd.automount\0"
132 "x-systemd.automount\0");
135 static bool mount_is_bound_to_device(const Mount
*m
) {
136 const MountParameters
*p
;
138 if (m
->from_fragment
)
141 p
= &m
->parameters_proc_self_mountinfo
;
142 return fstab_test_option(p
->options
, "x-systemd.device-bound\0");
145 static bool needs_quota(const MountParameters
*p
) {
148 /* Quotas are not enabled on network filesystems,
149 * but we want them, for example, on storage connected via iscsi */
150 if (p
->fstype
&& fstype_is_network(p
->fstype
))
153 if (mount_is_bind(p
))
156 return fstab_test_option(p
->options
,
157 "usrquota\0" "grpquota\0" "quota\0" "usrjquota\0" "grpjquota\0");
160 static void mount_init(Unit
*u
) {
164 assert(u
->load_state
== UNIT_STUB
);
166 m
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
167 m
->directory_mode
= 0755;
169 /* We need to make sure that /usr/bin/mount is always called
170 * in the same process group as us, so that the autofs kernel
171 * side doesn't send us another mount request while we are
172 * already trying to comply its last one. */
173 m
->exec_context
.same_pgrp
= true;
175 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
177 u
->ignore_on_isolate
= true;
180 static int mount_arm_timer(Mount
*m
, usec_t usec
) {
185 if (m
->timer_event_source
) {
186 r
= sd_event_source_set_time(m
->timer_event_source
, usec
);
190 return sd_event_source_set_enabled(m
->timer_event_source
, SD_EVENT_ONESHOT
);
193 if (usec
== USEC_INFINITY
)
196 r
= sd_event_add_time(
197 UNIT(m
)->manager
->event
,
198 &m
->timer_event_source
,
201 mount_dispatch_timer
, m
);
205 (void) sd_event_source_set_description(m
->timer_event_source
, "mount-timer");
210 static void mount_unwatch_control_pid(Mount
*m
) {
213 if (m
->control_pid
<= 0)
216 unit_unwatch_pid(UNIT(m
), m
->control_pid
);
220 static void mount_parameters_done(MountParameters
*p
) {
227 p
->what
= p
->options
= p
->fstype
= NULL
;
230 static void mount_done(Unit
*u
) {
235 m
->where
= mfree(m
->where
);
237 mount_parameters_done(&m
->parameters_proc_self_mountinfo
);
238 mount_parameters_done(&m
->parameters_fragment
);
240 m
->exec_runtime
= exec_runtime_unref(m
->exec_runtime
);
241 exec_command_done_array(m
->exec_command
, _MOUNT_EXEC_COMMAND_MAX
);
242 m
->control_command
= NULL
;
244 dynamic_creds_unref(&m
->dynamic_creds
);
246 mount_unwatch_control_pid(m
);
248 m
->timer_event_source
= sd_event_source_unref(m
->timer_event_source
);
251 _pure_
static MountParameters
* get_mount_parameters_fragment(Mount
*m
) {
254 if (m
->from_fragment
)
255 return &m
->parameters_fragment
;
260 _pure_
static MountParameters
* get_mount_parameters(Mount
*m
) {
263 if (m
->from_proc_self_mountinfo
)
264 return &m
->parameters_proc_self_mountinfo
;
266 return get_mount_parameters_fragment(m
);
269 static int mount_add_mount_dependencies(Mount
*m
) {
278 if (!path_equal(m
->where
, "/")) {
279 _cleanup_free_
char *parent
= NULL
;
281 /* Adds in links to other mount points that might lie further up in the hierarchy */
283 parent
= dirname_malloc(m
->where
);
287 r
= unit_require_mounts_for(UNIT(m
), parent
, UNIT_DEPENDENCY_IMPLICIT
);
292 /* Adds in dependencies to other mount points that might be needed for the source path (if this is a bind mount
293 * or a loop mount) to be available. */
294 pm
= get_mount_parameters_fragment(m
);
295 if (pm
&& pm
->what
&&
296 path_is_absolute(pm
->what
) &&
297 (mount_is_bind(pm
) || mount_is_loop(pm
) || !mount_is_network(pm
))) {
299 r
= unit_require_mounts_for(UNIT(m
), pm
->what
, UNIT_DEPENDENCY_FILE
);
304 /* Adds in dependencies to other units that use this path or paths further down in the hierarchy */
305 s
= manager_get_units_requiring_mounts_for(UNIT(m
)->manager
, m
->where
);
306 SET_FOREACH(other
, s
, i
) {
308 if (other
->load_state
!= UNIT_LOADED
)
311 if (other
== UNIT(m
))
314 r
= unit_add_dependency(other
, UNIT_AFTER
, UNIT(m
), true, UNIT_DEPENDENCY_PATH
);
318 if (UNIT(m
)->fragment_path
) {
319 /* If we have fragment configuration, then make this dependency required */
320 r
= unit_add_dependency(other
, UNIT_REQUIRES
, UNIT(m
), true, UNIT_DEPENDENCY_PATH
);
329 static int mount_add_device_dependencies(Mount
*m
) {
330 bool device_wants_mount
= false;
331 UnitDependencyMask mask
;
338 p
= get_mount_parameters(m
);
345 if (mount_is_bind(p
))
348 if (!is_device_path(p
->what
))
351 /* /dev/root is a really weird thing, it's not a real device,
352 * but just a path the kernel exports for the root file system
353 * specified on the kernel command line. Ignore it here. */
354 if (path_equal(p
->what
, "/dev/root"))
357 if (path_equal(m
->where
, "/"))
360 if (mount_is_auto(p
) && !mount_is_automount(p
) && MANAGER_IS_SYSTEM(UNIT(m
)->manager
))
361 device_wants_mount
= true;
363 /* Mount units from /proc/self/mountinfo are not bound to devices
364 * by default since they're subject to races when devices are
365 * unplugged. But the user can still force this dep with an
366 * appropriate option (or udev property) so the mount units are
367 * automatically stopped when the device disappears suddenly. */
368 dep
= mount_is_bound_to_device(m
) ? UNIT_BINDS_TO
: UNIT_REQUIRES
;
370 mask
= m
->from_fragment
? UNIT_DEPENDENCY_FILE
: UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT
;
372 r
= unit_add_node_dependency(UNIT(m
), p
->what
, device_wants_mount
, dep
, mask
);
379 static int mount_add_quota_dependencies(Mount
*m
) {
380 UnitDependencyMask mask
;
386 if (!MANAGER_IS_SYSTEM(UNIT(m
)->manager
))
389 p
= get_mount_parameters_fragment(m
);
396 mask
= m
->from_fragment
? UNIT_DEPENDENCY_FILE
: UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT
;
398 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_WANTS
, SPECIAL_QUOTACHECK_SERVICE
, NULL
, true, mask
);
402 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_WANTS
, SPECIAL_QUOTAON_SERVICE
, NULL
, true, mask
);
409 static bool mount_is_extrinsic(Mount
*m
) {
413 /* Returns true for all units that are "magic" and should be excluded from the usual start-up and shutdown
414 * dependencies. We call them "extrinsic" here, as they are generally mounted outside of the systemd dependency
415 * logic. We shouldn't attempt to manage them ourselves but it's fine if the user operates on them with us. */
417 if (!MANAGER_IS_SYSTEM(UNIT(m
)->manager
)) /* We only automatically manage mounts if we are in system mode */
420 if (PATH_IN_SET(m
->where
, /* Don't bother with the OS data itself */
425 if (PATH_STARTSWITH_SET(m
->where
,
426 "/run/initramfs", /* This should stay around from before we boot until after we shutdown */
427 "/proc", /* All of this is API VFS */
428 "/sys", /* … dito … */
429 "/dev")) /* … dito … */
432 /* If this is an initrd mount, and we are not in the initrd, then leave this around forever, too. */
433 p
= get_mount_parameters(m
);
434 if (p
&& fstab_test_option(p
->options
, "x-initrd.mount\0") && !in_initrd())
440 static int mount_add_default_dependencies(Mount
*m
) {
441 UnitDependencyMask mask
;
448 if (!UNIT(m
)->default_dependencies
)
451 /* We do not add any default dependencies to /, /usr or /run/initramfs/, since they are guaranteed to stay
452 * mounted the whole time, since our system is on it. Also, don't bother with anything mounted below virtual
453 * file systems, it's also going to be virtual, and hence not worth the effort. */
454 if (mount_is_extrinsic(m
))
457 p
= get_mount_parameters(m
);
461 mask
= m
->from_fragment
? UNIT_DEPENDENCY_FILE
: UNIT_DEPENDENCY_MOUNTINFO_DEFAULT
;
463 if (mount_is_network(p
)) {
464 /* We order ourselves after network.target. This is
465 * primarily useful at shutdown: services that take
466 * down the network should order themselves before
467 * network.target, so that they are shut down only
468 * after this mount unit is stopped. */
470 r
= unit_add_dependency_by_name(UNIT(m
), UNIT_AFTER
, SPECIAL_NETWORK_TARGET
, NULL
, true, mask
);
474 /* We pull in network-online.target, and order
475 * ourselves after it. This is useful at start-up to
476 * actively pull in tools that want to be started
477 * before we start mounting network file systems, and
478 * whose purpose it is to delay this until the network
481 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_WANTS
, UNIT_AFTER
, SPECIAL_NETWORK_ONLINE_TARGET
, NULL
, true, mask
);
485 after
= SPECIAL_REMOTE_FS_PRE_TARGET
;
487 after
= SPECIAL_LOCAL_FS_PRE_TARGET
;
489 r
= unit_add_dependency_by_name(UNIT(m
), UNIT_AFTER
, after
, NULL
, true, mask
);
493 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true, mask
);
497 /* If this is a tmpfs mount then we have to unmount it before we try to deactivate swaps */
498 if (streq_ptr(p
->fstype
, "tmpfs")) {
499 r
= unit_add_dependency_by_name(UNIT(m
), UNIT_AFTER
, SPECIAL_SWAP_TARGET
, NULL
, true, mask
);
507 static int mount_verify(Mount
*m
) {
508 _cleanup_free_
char *e
= NULL
;
514 if (UNIT(m
)->load_state
!= UNIT_LOADED
)
517 if (!m
->from_fragment
&& !m
->from_proc_self_mountinfo
&& !UNIT(m
)->perpetual
)
520 r
= unit_name_from_path(m
->where
, ".mount", &e
);
522 return log_unit_error_errno(UNIT(m
), r
, "Failed to generate unit name from mount path: %m");
524 if (!unit_has_name(UNIT(m
), e
)) {
525 log_unit_error(UNIT(m
), "Where= setting doesn't match unit name. Refusing.");
529 if (mount_point_is_api(m
->where
) || mount_point_ignore(m
->where
)) {
530 log_unit_error(UNIT(m
), "Cannot create mount unit for API file system %s. Refusing.", m
->where
);
534 p
= get_mount_parameters_fragment(m
);
536 log_unit_error(UNIT(m
), "What= setting is missing. Refusing.");
540 if (m
->exec_context
.pam_name
&& m
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
541 log_unit_error(UNIT(m
), "Unit has PAM enabled. Kill mode must be set to control-group'. Refusing.");
548 static int mount_add_extras(Mount
*m
) {
554 if (u
->fragment_path
)
555 m
->from_fragment
= true;
558 r
= unit_name_to_path(u
->id
, &m
->where
);
563 path_kill_slashes(m
->where
);
565 if (!u
->description
) {
566 r
= unit_set_description(u
, m
->where
);
571 r
= mount_add_device_dependencies(m
);
575 r
= mount_add_mount_dependencies(m
);
579 r
= mount_add_quota_dependencies(m
);
583 r
= unit_patch_contexts(u
);
587 r
= unit_add_exec_dependencies(u
, &m
->exec_context
);
591 r
= unit_set_default_slice(u
);
595 r
= mount_add_default_dependencies(m
);
602 static int mount_load_root_mount(Unit
*u
) {
605 if (!unit_has_name(u
, SPECIAL_ROOT_MOUNT
))
609 u
->default_dependencies
= false;
611 /* The stdio/kmsg bridge socket is on /, in order to avoid a dep loop, don't use kmsg logging for -.mount */
612 MOUNT(u
)->exec_context
.std_output
= EXEC_OUTPUT_NULL
;
613 MOUNT(u
)->exec_context
.std_input
= EXEC_INPUT_NULL
;
616 u
->description
= strdup("Root Mount");
621 static int mount_load(Unit
*u
) {
626 assert(u
->load_state
== UNIT_STUB
);
628 r
= mount_load_root_mount(u
);
632 if (m
->from_proc_self_mountinfo
|| u
->perpetual
)
633 r
= unit_load_fragment_and_dropin_optional(u
);
635 r
= unit_load_fragment_and_dropin(u
);
639 /* This is a new unit? Then let's add in some extras */
640 if (u
->load_state
== UNIT_LOADED
) {
641 r
= mount_add_extras(m
);
646 return mount_verify(m
);
649 static void mount_set_state(Mount
*m
, MountState state
) {
650 MountState old_state
;
653 old_state
= m
->state
;
656 if (!MOUNT_STATE_WITH_PROCESS(state
)) {
657 m
->timer_event_source
= sd_event_source_unref(m
->timer_event_source
);
658 mount_unwatch_control_pid(m
);
659 m
->control_command
= NULL
;
660 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
663 if (state
!= old_state
)
664 log_unit_debug(UNIT(m
), "Changed %s -> %s", mount_state_to_string(old_state
), mount_state_to_string(state
));
666 unit_notify(UNIT(m
), state_translation_table
[old_state
], state_translation_table
[state
], m
->reload_result
== MOUNT_SUCCESS
);
669 static int mount_coldplug(Unit
*u
) {
671 MountState new_state
= MOUNT_DEAD
;
675 assert(m
->state
== MOUNT_DEAD
);
677 if (m
->deserialized_state
!= m
->state
)
678 new_state
= m
->deserialized_state
;
679 else if (m
->from_proc_self_mountinfo
)
680 new_state
= MOUNT_MOUNTED
;
682 if (new_state
== m
->state
)
685 if (m
->control_pid
> 0 &&
686 pid_is_unwaited(m
->control_pid
) &&
687 MOUNT_STATE_WITH_PROCESS(new_state
)) {
689 r
= unit_watch_pid(UNIT(m
), m
->control_pid
);
693 r
= mount_arm_timer(m
, usec_add(u
->state_change_timestamp
.monotonic
, m
->timeout_usec
));
698 if (!IN_SET(new_state
, MOUNT_DEAD
, MOUNT_FAILED
))
699 (void) unit_setup_dynamic_creds(u
);
701 mount_set_state(m
, new_state
);
705 static void mount_dump(Unit
*u
, FILE *f
, const char *prefix
) {
712 p
= get_mount_parameters(m
);
715 "%sMount State: %s\n"
719 "%sFile System Type: %s\n"
721 "%sFrom /proc/self/mountinfo: %s\n"
722 "%sFrom fragment: %s\n"
724 "%sDirectoryMode: %04o\n"
725 "%sSloppyOptions: %s\n"
726 "%sLazyUnmount: %s\n"
727 "%sForceUnmount: %s\n",
728 prefix
, mount_state_to_string(m
->state
),
729 prefix
, mount_result_to_string(m
->result
),
731 prefix
, p
? strna(p
->what
) : "n/a",
732 prefix
, p
? strna(p
->fstype
) : "n/a",
733 prefix
, p
? strna(p
->options
) : "n/a",
734 prefix
, yes_no(m
->from_proc_self_mountinfo
),
735 prefix
, yes_no(m
->from_fragment
),
736 prefix
, yes_no(mount_is_extrinsic(m
)),
737 prefix
, m
->directory_mode
,
738 prefix
, yes_no(m
->sloppy_options
),
739 prefix
, yes_no(m
->lazy_unmount
),
740 prefix
, yes_no(m
->force_unmount
));
742 if (m
->control_pid
> 0)
744 "%sControl PID: "PID_FMT
"\n",
745 prefix
, m
->control_pid
);
747 exec_context_dump(&m
->exec_context
, f
, prefix
);
748 kill_context_dump(&m
->kill_context
, f
, prefix
);
749 cgroup_context_dump(&m
->cgroup_context
, f
, prefix
);
752 static int mount_spawn(Mount
*m
, ExecCommand
*c
, pid_t
*_pid
) {
754 ExecParameters exec_params
= {
755 .flags
= EXEC_APPLY_SANDBOXING
|EXEC_APPLY_CHROOT
|EXEC_APPLY_TTY_STDIN
,
767 r
= unit_prepare_exec(UNIT(m
));
771 r
= mount_arm_timer(m
, usec_add(now(CLOCK_MONOTONIC
), m
->timeout_usec
));
775 manager_set_exec_params(UNIT(m
)->manager
, &exec_params
);
776 unit_set_exec_params(UNIT(m
), &exec_params
);
778 r
= exec_spawn(UNIT(m
),
788 r
= unit_watch_pid(UNIT(m
), pid
);
790 /* FIXME: we need to do something here */
798 static void mount_enter_dead(Mount
*m
, MountResult f
) {
801 if (m
->result
== MOUNT_SUCCESS
)
804 if (m
->result
!= MOUNT_SUCCESS
)
805 log_unit_warning(UNIT(m
), "Failed with result '%s'.", mount_result_to_string(m
->result
));
807 mount_set_state(m
, m
->result
!= MOUNT_SUCCESS
? MOUNT_FAILED
: MOUNT_DEAD
);
809 exec_runtime_destroy(m
->exec_runtime
);
810 m
->exec_runtime
= exec_runtime_unref(m
->exec_runtime
);
812 exec_context_destroy_runtime_directory(&m
->exec_context
, UNIT(m
)->manager
->prefix
[EXEC_DIRECTORY_RUNTIME
]);
814 unit_unref_uid_gid(UNIT(m
), true);
816 dynamic_creds_destroy(&m
->dynamic_creds
);
819 static void mount_enter_mounted(Mount
*m
, MountResult f
) {
822 if (m
->result
== MOUNT_SUCCESS
)
825 mount_set_state(m
, MOUNT_MOUNTED
);
828 static void mount_enter_dead_or_mounted(Mount
*m
, MountResult f
) {
831 /* Enter DEAD or MOUNTED state, depending on what the kernel currently says about the mount point. We use this
832 * whenever we executed an operation, so that our internal state reflects what the kernel says again, after all
833 * ultimately we just mirror the kernel's internal state on this. */
835 if (m
->from_proc_self_mountinfo
)
836 mount_enter_mounted(m
, f
);
838 mount_enter_dead(m
, f
);
841 static int state_to_kill_operation(MountState state
) {
844 case MOUNT_REMOUNTING_SIGTERM
:
845 case MOUNT_UNMOUNTING_SIGTERM
:
846 return KILL_TERMINATE
;
848 case MOUNT_REMOUNTING_SIGKILL
:
849 case MOUNT_UNMOUNTING_SIGKILL
:
853 return _KILL_OPERATION_INVALID
;
857 static void mount_enter_signal(Mount
*m
, MountState state
, MountResult f
) {
862 if (m
->result
== MOUNT_SUCCESS
)
865 r
= unit_kill_context(
868 state_to_kill_operation(state
),
876 r
= mount_arm_timer(m
, usec_add(now(CLOCK_MONOTONIC
), m
->timeout_usec
));
880 mount_set_state(m
, state
);
881 } else if (state
== MOUNT_REMOUNTING_SIGTERM
&& m
->kill_context
.send_sigkill
)
882 mount_enter_signal(m
, MOUNT_REMOUNTING_SIGKILL
, MOUNT_SUCCESS
);
883 else if (IN_SET(state
, MOUNT_REMOUNTING_SIGTERM
, MOUNT_REMOUNTING_SIGKILL
))
884 mount_enter_mounted(m
, MOUNT_SUCCESS
);
885 else if (state
== MOUNT_UNMOUNTING_SIGTERM
&& m
->kill_context
.send_sigkill
)
886 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGKILL
, MOUNT_SUCCESS
);
888 mount_enter_dead_or_mounted(m
, MOUNT_SUCCESS
);
893 log_unit_warning_errno(UNIT(m
), r
, "Failed to kill processes: %m");
894 mount_enter_dead_or_mounted(m
, MOUNT_FAILURE_RESOURCES
);
897 static void mount_enter_unmounting(Mount
*m
) {
902 /* Start counting our attempts */
903 if (!IN_SET(m
->state
,
905 MOUNT_UNMOUNTING_SIGTERM
,
906 MOUNT_UNMOUNTING_SIGKILL
))
907 m
->n_retry_umount
= 0;
909 m
->control_command_id
= MOUNT_EXEC_UNMOUNT
;
910 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_UNMOUNT
;
912 r
= exec_command_set(m
->control_command
, UMOUNT_PATH
, m
->where
, "-c", NULL
);
913 if (r
>= 0 && m
->lazy_unmount
)
914 r
= exec_command_append(m
->control_command
, "-l", NULL
);
915 if (r
>= 0 && m
->force_unmount
)
916 r
= exec_command_append(m
->control_command
, "-f", NULL
);
920 mount_unwatch_control_pid(m
);
922 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
926 mount_set_state(m
, MOUNT_UNMOUNTING
);
931 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'umount' task: %m");
932 mount_enter_dead_or_mounted(m
, MOUNT_FAILURE_RESOURCES
);
935 static void mount_enter_mounting(Mount
*m
) {
941 r
= unit_fail_if_symlink(UNIT(m
), m
->where
);
945 (void) mkdir_p_label(m
->where
, m
->directory_mode
);
947 unit_warn_if_dir_nonempty(UNIT(m
), m
->where
);
949 unit_warn_leftover_processes(UNIT(m
));
951 m
->control_command_id
= MOUNT_EXEC_MOUNT
;
952 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_MOUNT
;
954 /* Create the source directory for bind-mounts if needed */
955 p
= get_mount_parameters_fragment(m
);
956 if (p
&& mount_is_bind(p
))
957 (void) mkdir_p_label(p
->what
, m
->directory_mode
);
960 _cleanup_free_
char *opts
= NULL
;
962 r
= fstab_filter_options(p
->options
, "nofail\0" "noauto\0" "auto\0", NULL
, NULL
, &opts
);
966 r
= exec_command_set(m
->control_command
, MOUNT_PATH
, p
->what
, m
->where
, NULL
);
967 if (r
>= 0 && m
->sloppy_options
)
968 r
= exec_command_append(m
->control_command
, "-s", NULL
);
969 if (r
>= 0 && p
->fstype
)
970 r
= exec_command_append(m
->control_command
, "-t", p
->fstype
, NULL
);
971 if (r
>= 0 && !isempty(opts
))
972 r
= exec_command_append(m
->control_command
, "-o", opts
, NULL
);
978 mount_unwatch_control_pid(m
);
980 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
984 mount_set_state(m
, MOUNT_MOUNTING
);
989 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'mount' task: %m");
990 mount_enter_dead_or_mounted(m
, MOUNT_FAILURE_RESOURCES
);
993 static void mount_set_reload_result(Mount
*m
, MountResult result
) {
996 /* Only store the first error we encounter */
997 if (m
->reload_result
!= MOUNT_SUCCESS
)
1000 m
->reload_result
= result
;
1003 static void mount_enter_remounting(Mount
*m
) {
1009 /* Reset reload result when we are about to start a new remount operation */
1010 m
->reload_result
= MOUNT_SUCCESS
;
1012 m
->control_command_id
= MOUNT_EXEC_REMOUNT
;
1013 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_REMOUNT
;
1015 p
= get_mount_parameters_fragment(m
);
1020 o
= strjoina("remount,", p
->options
);
1024 r
= exec_command_set(m
->control_command
, MOUNT_PATH
,
1027 if (r
>= 0 && m
->sloppy_options
)
1028 r
= exec_command_append(m
->control_command
, "-s", NULL
);
1029 if (r
>= 0 && p
->fstype
)
1030 r
= exec_command_append(m
->control_command
, "-t", p
->fstype
, NULL
);
1036 mount_unwatch_control_pid(m
);
1038 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
1042 mount_set_state(m
, MOUNT_REMOUNTING
);
1047 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'remount' task: %m");
1048 mount_set_reload_result(m
, MOUNT_FAILURE_RESOURCES
);
1049 mount_enter_dead_or_mounted(m
, MOUNT_SUCCESS
);
1052 static int mount_start(Unit
*u
) {
1053 Mount
*m
= MOUNT(u
);
1058 /* We cannot fulfill this request right now, try again later
1060 if (IN_SET(m
->state
,
1062 MOUNT_UNMOUNTING_SIGTERM
,
1063 MOUNT_UNMOUNTING_SIGKILL
))
1066 /* Already on it! */
1067 if (m
->state
== MOUNT_MOUNTING
)
1070 assert(IN_SET(m
->state
, MOUNT_DEAD
, MOUNT_FAILED
));
1072 r
= unit_start_limit_test(u
);
1074 mount_enter_dead(m
, MOUNT_FAILURE_START_LIMIT_HIT
);
1078 r
= unit_acquire_invocation_id(u
);
1082 m
->result
= MOUNT_SUCCESS
;
1083 m
->reload_result
= MOUNT_SUCCESS
;
1085 u
->reset_accounting
= true;
1087 mount_enter_mounting(m
);
1091 static int mount_stop(Unit
*u
) {
1092 Mount
*m
= MOUNT(u
);
1098 case MOUNT_UNMOUNTING
:
1099 case MOUNT_UNMOUNTING_SIGKILL
:
1100 case MOUNT_UNMOUNTING_SIGTERM
:
1104 case MOUNT_MOUNTING
:
1105 case MOUNT_MOUNTING_DONE
:
1106 case MOUNT_REMOUNTING
:
1107 /* If we are still waiting for /bin/mount, we go directly into kill mode. */
1108 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGTERM
, MOUNT_SUCCESS
);
1111 case MOUNT_REMOUNTING_SIGTERM
:
1112 /* If we are already waiting for a hung remount, convert this to the matching unmounting state */
1113 mount_set_state(m
, MOUNT_UNMOUNTING_SIGTERM
);
1116 case MOUNT_REMOUNTING_SIGKILL
:
1118 mount_set_state(m
, MOUNT_UNMOUNTING_SIGKILL
);
1122 mount_enter_unmounting(m
);
1126 assert_not_reached("Unexpected state.");
1130 static int mount_reload(Unit
*u
) {
1131 Mount
*m
= MOUNT(u
);
1135 if (m
->state
== MOUNT_MOUNTING_DONE
) /* not yet ready to reload, try again */
1138 assert(m
->state
== MOUNT_MOUNTED
);
1140 mount_enter_remounting(m
);
1145 static int mount_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
1146 Mount
*m
= MOUNT(u
);
1152 unit_serialize_item(u
, f
, "state", mount_state_to_string(m
->state
));
1153 unit_serialize_item(u
, f
, "result", mount_result_to_string(m
->result
));
1154 unit_serialize_item(u
, f
, "reload-result", mount_result_to_string(m
->reload_result
));
1156 if (m
->control_pid
> 0)
1157 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, m
->control_pid
);
1159 if (m
->control_command_id
>= 0)
1160 unit_serialize_item(u
, f
, "control-command", mount_exec_command_to_string(m
->control_command_id
));
1165 static int mount_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
1166 Mount
*m
= MOUNT(u
);
1173 if (streq(key
, "state")) {
1176 if ((state
= mount_state_from_string(value
)) < 0)
1177 log_unit_debug(u
, "Failed to parse state value: %s", value
);
1179 m
->deserialized_state
= state
;
1180 } else if (streq(key
, "result")) {
1183 f
= mount_result_from_string(value
);
1185 log_unit_debug(u
, "Failed to parse result value: %s", value
);
1186 else if (f
!= MOUNT_SUCCESS
)
1189 } else if (streq(key
, "reload-result")) {
1192 f
= mount_result_from_string(value
);
1194 log_unit_debug(u
, "Failed to parse reload result value: %s", value
);
1195 else if (f
!= MOUNT_SUCCESS
)
1196 m
->reload_result
= f
;
1198 } else if (streq(key
, "control-pid")) {
1201 if (parse_pid(value
, &pid
) < 0)
1202 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
1204 m
->control_pid
= pid
;
1205 } else if (streq(key
, "control-command")) {
1206 MountExecCommand id
;
1208 id
= mount_exec_command_from_string(value
);
1210 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
1212 m
->control_command_id
= id
;
1213 m
->control_command
= m
->exec_command
+ id
;
1216 log_unit_debug(u
, "Unknown serialization key: %s", key
);
1221 _pure_
static UnitActiveState
mount_active_state(Unit
*u
) {
1224 return state_translation_table
[MOUNT(u
)->state
];
1227 _pure_
static const char *mount_sub_state_to_string(Unit
*u
) {
1230 return mount_state_to_string(MOUNT(u
)->state
);
1233 _pure_
static bool mount_check_gc(Unit
*u
) {
1234 Mount
*m
= MOUNT(u
);
1238 return m
->from_proc_self_mountinfo
;
1241 static void mount_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
1242 Mount
*m
= MOUNT(u
);
1248 if (pid
!= m
->control_pid
)
1253 if (is_clean_exit(code
, status
, EXIT_CLEAN_COMMAND
, NULL
))
1255 else if (code
== CLD_EXITED
)
1256 f
= MOUNT_FAILURE_EXIT_CODE
;
1257 else if (code
== CLD_KILLED
)
1258 f
= MOUNT_FAILURE_SIGNAL
;
1259 else if (code
== CLD_DUMPED
)
1260 f
= MOUNT_FAILURE_CORE_DUMP
;
1262 assert_not_reached("Unknown code");
1264 if (IN_SET(m
->state
, MOUNT_REMOUNTING
, MOUNT_REMOUNTING_SIGKILL
, MOUNT_REMOUNTING_SIGTERM
))
1265 mount_set_reload_result(m
, f
);
1266 else if (m
->result
== MOUNT_SUCCESS
)
1269 if (m
->control_command
) {
1270 exec_status_exit(&m
->control_command
->exec_status
, &m
->exec_context
, pid
, code
, status
);
1272 m
->control_command
= NULL
;
1273 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
1276 log_unit_full(u
, f
== MOUNT_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
1277 "Mount process exited, code=%s status=%i", sigchld_code_to_string(code
), status
);
1279 /* Note that mount(8) returning and the kernel sending us a mount table change event might happen
1280 * out-of-order. If an operation succeed we assume the kernel will follow soon too and already change into the
1281 * resulting state. If it fails we check if the kernel still knows about the mount. and change state
1286 case MOUNT_MOUNTING
:
1287 case MOUNT_MOUNTING_DONE
:
1289 if (f
== MOUNT_SUCCESS
|| m
->from_proc_self_mountinfo
)
1290 /* If /bin/mount returned success, or if we see the mount point in /proc/self/mountinfo we are
1291 * happy. If we see the first condition first, we should see the second condition
1292 * immediately after – or /bin/mount lies to us and is broken. */
1293 mount_enter_mounted(m
, f
);
1295 mount_enter_dead(m
, f
);
1298 case MOUNT_REMOUNTING
:
1299 case MOUNT_REMOUNTING_SIGTERM
:
1300 case MOUNT_REMOUNTING_SIGKILL
:
1301 mount_enter_dead_or_mounted(m
, MOUNT_SUCCESS
);
1304 case MOUNT_UNMOUNTING
:
1305 case MOUNT_UNMOUNTING_SIGKILL
:
1306 case MOUNT_UNMOUNTING_SIGTERM
:
1308 if (m
->from_proc_self_mountinfo
) {
1310 /* Still a mount point? If so, let's try again. Most likely there were multiple mount points
1311 * stacked on top of each other. Note that due to the io event priority logic we can be sure
1312 * the new mountinfo is loaded before we process the SIGCHLD for the mount command. */
1314 if (m
->n_retry_umount
< RETRY_UMOUNT_MAX
) {
1315 log_unit_debug(u
, "Mount still present, trying again.");
1316 m
->n_retry_umount
++;
1317 mount_enter_unmounting(m
);
1319 log_unit_debug(u
, "Mount still present after %u attempts to unmount, giving up.", m
->n_retry_umount
);
1320 mount_enter_mounted(m
, f
);
1323 mount_enter_dead(m
, f
);
1328 assert_not_reached("Uh, control process died at wrong time.");
1331 /* Notify clients about changed exit status */
1332 unit_add_to_dbus_queue(u
);
1335 static int mount_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
1336 Mount
*m
= MOUNT(userdata
);
1339 assert(m
->timer_event_source
== source
);
1343 case MOUNT_MOUNTING
:
1344 case MOUNT_MOUNTING_DONE
:
1345 log_unit_warning(UNIT(m
), "Mounting timed out. Terminating.");
1346 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGTERM
, MOUNT_FAILURE_TIMEOUT
);
1349 case MOUNT_REMOUNTING
:
1350 log_unit_warning(UNIT(m
), "Remounting timed out. Terminating remount process.");
1351 mount_set_reload_result(m
, MOUNT_FAILURE_TIMEOUT
);
1352 mount_enter_signal(m
, MOUNT_REMOUNTING_SIGTERM
, MOUNT_SUCCESS
);
1355 case MOUNT_REMOUNTING_SIGTERM
:
1356 mount_set_reload_result(m
, MOUNT_FAILURE_TIMEOUT
);
1358 if (m
->kill_context
.send_sigkill
) {
1359 log_unit_warning(UNIT(m
), "Remounting timed out. Killing.");
1360 mount_enter_signal(m
, MOUNT_REMOUNTING_SIGKILL
, MOUNT_SUCCESS
);
1362 log_unit_warning(UNIT(m
), "Remounting timed out. Skipping SIGKILL. Ignoring.");
1363 mount_enter_dead_or_mounted(m
, MOUNT_SUCCESS
);
1367 case MOUNT_REMOUNTING_SIGKILL
:
1368 mount_set_reload_result(m
, MOUNT_FAILURE_TIMEOUT
);
1370 log_unit_warning(UNIT(m
), "Mount process still around after SIGKILL. Ignoring.");
1371 mount_enter_dead_or_mounted(m
, MOUNT_SUCCESS
);
1374 case MOUNT_UNMOUNTING
:
1375 log_unit_warning(UNIT(m
), "Unmounting timed out. Terminating.");
1376 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGTERM
, MOUNT_FAILURE_TIMEOUT
);
1379 case MOUNT_UNMOUNTING_SIGTERM
:
1380 if (m
->kill_context
.send_sigkill
) {
1381 log_unit_warning(UNIT(m
), "Mount process timed out. Killing.");
1382 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGKILL
, MOUNT_FAILURE_TIMEOUT
);
1384 log_unit_warning(UNIT(m
), "Mount process timed out. Skipping SIGKILL. Ignoring.");
1385 mount_enter_dead_or_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1389 case MOUNT_UNMOUNTING_SIGKILL
:
1390 log_unit_warning(UNIT(m
), "Mount process still around after SIGKILL. Ignoring.");
1391 mount_enter_dead_or_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1395 assert_not_reached("Timeout at wrong time.");
1407 static int mount_setup_new_unit(
1411 const char *options
,
1413 MountSetupFlags
*flags
) {
1420 u
->source_path
= strdup("/proc/self/mountinfo");
1421 MOUNT(u
)->where
= strdup(where
);
1422 if (!u
->source_path
|| !MOUNT(u
)->where
)
1425 /* Make sure to initialize those fields before mount_is_extrinsic(). */
1426 MOUNT(u
)->from_proc_self_mountinfo
= true;
1427 p
= &MOUNT(u
)->parameters_proc_self_mountinfo
;
1429 p
->what
= strdup(what
);
1430 p
->options
= strdup(options
);
1431 p
->fstype
= strdup(fstype
);
1432 if (!p
->what
|| !p
->options
|| !p
->fstype
)
1435 if (!mount_is_extrinsic(MOUNT(u
))) {
1439 target
= mount_is_network(p
) ? SPECIAL_REMOTE_FS_TARGET
: SPECIAL_LOCAL_FS_TARGET
;
1440 r
= unit_add_dependency_by_name(u
, UNIT_BEFORE
, target
, NULL
, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT
);
1444 r
= unit_add_dependency_by_name(u
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT
);
1449 unit_add_to_load_queue(u
);
1450 flags
->is_mounted
= true;
1451 flags
->just_mounted
= true;
1452 flags
->just_changed
= true;
1457 static int mount_setup_existing_unit(
1461 const char *options
,
1463 MountSetupFlags
*flags
) {
1466 bool load_extras
= false;
1472 if (!MOUNT(u
)->where
) {
1473 MOUNT(u
)->where
= strdup(where
);
1474 if (!MOUNT(u
)->where
)
1478 /* Make sure to initialize those fields before mount_is_extrinsic(). */
1479 p
= &MOUNT(u
)->parameters_proc_self_mountinfo
;
1481 r1
= free_and_strdup(&p
->what
, what
);
1482 r2
= free_and_strdup(&p
->options
, options
);
1483 r3
= free_and_strdup(&p
->fstype
, fstype
);
1484 if (r1
< 0 || r2
< 0 || r3
< 0)
1487 flags
->just_changed
= r1
> 0 || r2
> 0 || r3
> 0;
1488 flags
->is_mounted
= true;
1489 flags
->just_mounted
= !MOUNT(u
)->from_proc_self_mountinfo
;
1491 MOUNT(u
)->from_proc_self_mountinfo
= true;
1493 if (!mount_is_extrinsic(MOUNT(u
)) && mount_is_network(p
)) {
1494 /* _netdev option may have shown up late, or on a
1495 * remount. Add remote-fs dependencies, even though
1496 * local-fs ones may already be there.
1498 * Note: due to a current limitation (we don't track
1499 * in the dependency "Set*" objects who created a
1500 * dependency), we can only add deps, never lose them,
1501 * until the next full daemon-reload. */
1502 unit_add_dependency_by_name(u
, UNIT_BEFORE
, SPECIAL_REMOTE_FS_TARGET
, NULL
, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT
);
1506 if (u
->load_state
== UNIT_NOT_FOUND
) {
1507 u
->load_state
= UNIT_LOADED
;
1510 /* Load in the extras later on, after we
1511 * finished initialization of the unit */
1513 /* FIXME: since we're going to load the unit later on, why setting load_extras=true ? */
1515 flags
->just_changed
= true;
1519 return mount_add_extras(MOUNT(u
));
1524 static int mount_setup_unit(
1528 const char *options
,
1532 _cleanup_free_
char *e
= NULL
;
1533 MountSetupFlags flags
;
1543 /* Ignore API mount points. They should never be referenced in
1544 * dependencies ever. */
1545 if (mount_point_is_api(where
) || mount_point_ignore(where
))
1548 if (streq(fstype
, "autofs"))
1551 /* probably some kind of swap, ignore */
1552 if (!is_path(where
))
1555 r
= unit_name_from_path(where
, ".mount", &e
);
1559 u
= manager_get_unit(m
, e
);
1561 /* First time we see this mount point meaning that it's
1562 * not been initiated by a mount unit but rather by the
1563 * sysadmin having called mount(8) directly. */
1564 r
= unit_new_for_name(m
, sizeof(Mount
), e
, &u
);
1568 r
= mount_setup_new_unit(u
, what
, where
, options
, fstype
, &flags
);
1572 r
= mount_setup_existing_unit(u
, what
, where
, options
, fstype
, &flags
);
1578 MOUNT(u
)->is_mounted
= flags
.is_mounted
;
1579 MOUNT(u
)->just_mounted
= flags
.just_mounted
;
1580 MOUNT(u
)->just_changed
= flags
.just_changed
;
1583 if (flags
.just_changed
)
1584 unit_add_to_dbus_queue(u
);
1588 log_warning_errno(r
, "Failed to set up mount unit: %m");
1592 static int mount_load_proc_self_mountinfo(Manager
*m
, bool set_flags
) {
1593 _cleanup_(mnt_free_tablep
) struct libmnt_table
*t
= NULL
;
1594 _cleanup_(mnt_free_iterp
) struct libmnt_iter
*i
= NULL
;
1599 t
= mnt_new_table();
1603 i
= mnt_new_iter(MNT_ITER_FORWARD
);
1607 r
= mnt_table_parse_mtab(t
, NULL
);
1609 return log_error_errno(r
, "Failed to parse /proc/self/mountinfo: %m");
1613 const char *device
, *path
, *options
, *fstype
;
1614 _cleanup_free_
char *d
= NULL
, *p
= NULL
;
1615 struct libmnt_fs
*fs
;
1618 k
= mnt_table_next_fs(t
, i
, &fs
);
1622 return log_error_errno(k
, "Failed to get next entry from /proc/self/mountinfo: %m");
1624 device
= mnt_fs_get_source(fs
);
1625 path
= mnt_fs_get_target(fs
);
1626 options
= mnt_fs_get_options(fs
);
1627 fstype
= mnt_fs_get_fstype(fs
);
1629 if (!device
|| !path
)
1632 if (cunescape(device
, UNESCAPE_RELAX
, &d
) < 0)
1635 if (cunescape(path
, UNESCAPE_RELAX
, &p
) < 0)
1638 (void) device_found_node(m
, d
, true, DEVICE_FOUND_MOUNT
, set_flags
);
1640 k
= mount_setup_unit(m
, d
, p
, options
, fstype
, set_flags
);
1641 if (r
== 0 && k
< 0)
1648 static void mount_shutdown(Manager
*m
) {
1651 m
->mount_event_source
= sd_event_source_unref(m
->mount_event_source
);
1653 mnt_unref_monitor(m
->mount_monitor
);
1654 m
->mount_monitor
= NULL
;
1657 static int mount_get_timeout(Unit
*u
, usec_t
*timeout
) {
1658 Mount
*m
= MOUNT(u
);
1662 if (!m
->timer_event_source
)
1665 r
= sd_event_source_get_time(m
->timer_event_source
, &t
);
1668 if (t
== USEC_INFINITY
)
1675 static int synthesize_root_mount(Manager
*m
) {
1681 /* Whatever happens, we know for sure that the root directory is around, and cannot go away. Let's
1682 * unconditionally synthesize it here and mark it as perpetual. */
1684 u
= manager_get_unit(m
, SPECIAL_ROOT_MOUNT
);
1686 r
= unit_new_for_name(m
, sizeof(Mount
), SPECIAL_ROOT_MOUNT
, &u
);
1688 return log_error_errno(r
, "Failed to allocate the special " SPECIAL_ROOT_MOUNT
" unit: %m");
1691 u
->perpetual
= true;
1692 MOUNT(u
)->deserialized_state
= MOUNT_MOUNTED
;
1694 unit_add_to_load_queue(u
);
1695 unit_add_to_dbus_queue(u
);
1700 static bool mount_is_mounted(Mount
*m
) {
1703 return UNIT(m
)->perpetual
|| m
->is_mounted
;
1706 static void mount_enumerate(Manager
*m
) {
1711 r
= synthesize_root_mount(m
);
1717 if (!m
->mount_monitor
) {
1720 m
->mount_monitor
= mnt_new_monitor();
1721 if (!m
->mount_monitor
) {
1726 r
= mnt_monitor_enable_kernel(m
->mount_monitor
, 1);
1728 log_error_errno(r
, "Failed to enable watching of kernel mount events: %m");
1732 r
= mnt_monitor_enable_userspace(m
->mount_monitor
, 1, NULL
);
1734 log_error_errno(r
, "Failed to enable watching of userspace mount events: %m");
1738 /* mnt_unref_monitor() will close the fd */
1739 fd
= r
= mnt_monitor_get_fd(m
->mount_monitor
);
1741 log_error_errno(r
, "Failed to acquire watch file descriptor: %m");
1745 r
= sd_event_add_io(m
->event
, &m
->mount_event_source
, fd
, EPOLLIN
, mount_dispatch_io
, m
);
1747 log_error_errno(r
, "Failed to watch mount file descriptor: %m");
1751 r
= sd_event_source_set_priority(m
->mount_event_source
, -10);
1753 log_error_errno(r
, "Failed to adjust mount watch priority: %m");
1757 (void) sd_event_source_set_description(m
->mount_event_source
, "mount-monitor-dispatch");
1760 r
= mount_load_proc_self_mountinfo(m
, false);
1770 static int mount_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1771 _cleanup_set_free_ Set
*around
= NULL
, *gone
= NULL
;
1772 Manager
*m
= userdata
;
1779 assert(revents
& EPOLLIN
);
1781 if (fd
== mnt_monitor_get_fd(m
->mount_monitor
)) {
1782 bool rescan
= false;
1784 /* Drain all events and verify that the event is valid.
1786 * Note that libmount also monitors /run/mount mkdir if the
1787 * directory does not exist yet. The mkdir may generate event
1788 * which is irrelevant for us.
1790 * error: r < 0; valid: r == 0, false positive: rc == 1 */
1792 r
= mnt_monitor_next_change(m
->mount_monitor
, NULL
, NULL
);
1796 return log_error_errno(r
, "Failed to drain libmount events");
1799 log_debug("libmount event [rescan: %s]", yes_no(rescan
));
1804 r
= mount_load_proc_self_mountinfo(m
, true);
1806 /* Reset flags, just in case, for later calls */
1807 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_MOUNT
]) {
1808 Mount
*mount
= MOUNT(u
);
1810 mount
->is_mounted
= mount
->just_mounted
= mount
->just_changed
= false;
1816 manager_dispatch_load_queue(m
);
1818 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_MOUNT
]) {
1819 Mount
*mount
= MOUNT(u
);
1821 if (!mount_is_mounted(mount
)) {
1823 /* A mount point is not around right now. It
1824 * might be gone, or might never have
1827 if (mount
->from_proc_self_mountinfo
&&
1828 mount
->parameters_proc_self_mountinfo
.what
) {
1830 /* Remember that this device might just have disappeared */
1831 if (set_ensure_allocated(&gone
, &string_hash_ops
) < 0 ||
1832 set_put(gone
, mount
->parameters_proc_self_mountinfo
.what
) < 0)
1833 log_oom(); /* we don't care too much about OOM here... */
1836 mount
->from_proc_self_mountinfo
= false;
1838 switch (mount
->state
) {
1841 /* This has just been unmounted by
1842 * somebody else, follow the state
1844 mount
->result
= MOUNT_SUCCESS
; /* make sure we forget any earlier umount failures */
1845 mount_enter_dead(mount
, MOUNT_SUCCESS
);
1852 } else if (mount
->just_mounted
|| mount
->just_changed
) {
1854 /* A mount point was added or changed */
1856 switch (mount
->state
) {
1861 /* This has just been mounted by somebody else, follow the state change, but let's
1862 * generate a new invocation ID for this implicitly and automatically. */
1863 (void) unit_acquire_invocation_id(UNIT(mount
));
1864 mount_enter_mounted(mount
, MOUNT_SUCCESS
);
1867 case MOUNT_MOUNTING
:
1868 mount_set_state(mount
, MOUNT_MOUNTING_DONE
);
1872 /* Nothing really changed, but let's
1873 * issue an notification call
1874 * nonetheless, in case somebody is
1875 * waiting for this. (e.g. file system
1876 * ro/rw remounts.) */
1877 mount_set_state(mount
, mount
->state
);
1882 if (mount_is_mounted(mount
) &&
1883 mount
->from_proc_self_mountinfo
&&
1884 mount
->parameters_proc_self_mountinfo
.what
) {
1886 if (set_ensure_allocated(&around
, &string_hash_ops
) < 0 ||
1887 set_put(around
, mount
->parameters_proc_self_mountinfo
.what
) < 0)
1891 /* Reset the flags for later calls */
1892 mount
->is_mounted
= mount
->just_mounted
= mount
->just_changed
= false;
1895 SET_FOREACH(what
, gone
, i
) {
1896 if (set_contains(around
, what
))
1899 /* Let the device units know that the device is no longer mounted */
1900 (void) device_found_node(m
, what
, false, DEVICE_FOUND_MOUNT
, true);
1906 static void mount_reset_failed(Unit
*u
) {
1907 Mount
*m
= MOUNT(u
);
1911 if (m
->state
== MOUNT_FAILED
)
1912 mount_set_state(m
, MOUNT_DEAD
);
1914 m
->result
= MOUNT_SUCCESS
;
1915 m
->reload_result
= MOUNT_SUCCESS
;
1918 static int mount_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
1919 Mount
*m
= MOUNT(u
);
1923 return unit_kill_common(u
, who
, signo
, -1, MOUNT(u
)->control_pid
, error
);
1926 static int mount_control_pid(Unit
*u
) {
1927 Mount
*m
= MOUNT(u
);
1931 return m
->control_pid
;
1934 static const char* const mount_exec_command_table
[_MOUNT_EXEC_COMMAND_MAX
] = {
1935 [MOUNT_EXEC_MOUNT
] = "ExecMount",
1936 [MOUNT_EXEC_UNMOUNT
] = "ExecUnmount",
1937 [MOUNT_EXEC_REMOUNT
] = "ExecRemount",
1940 DEFINE_STRING_TABLE_LOOKUP(mount_exec_command
, MountExecCommand
);
1942 static const char* const mount_result_table
[_MOUNT_RESULT_MAX
] = {
1943 [MOUNT_SUCCESS
] = "success",
1944 [MOUNT_FAILURE_RESOURCES
] = "resources",
1945 [MOUNT_FAILURE_TIMEOUT
] = "timeout",
1946 [MOUNT_FAILURE_EXIT_CODE
] = "exit-code",
1947 [MOUNT_FAILURE_SIGNAL
] = "signal",
1948 [MOUNT_FAILURE_CORE_DUMP
] = "core-dump",
1949 [MOUNT_FAILURE_START_LIMIT_HIT
] = "start-limit-hit",
1952 DEFINE_STRING_TABLE_LOOKUP(mount_result
, MountResult
);
1954 const UnitVTable mount_vtable
= {
1955 .object_size
= sizeof(Mount
),
1956 .exec_context_offset
= offsetof(Mount
, exec_context
),
1957 .cgroup_context_offset
= offsetof(Mount
, cgroup_context
),
1958 .kill_context_offset
= offsetof(Mount
, kill_context
),
1959 .exec_runtime_offset
= offsetof(Mount
, exec_runtime
),
1960 .dynamic_creds_offset
= offsetof(Mount
, dynamic_creds
),
1966 .private_section
= "Mount",
1972 .coldplug
= mount_coldplug
,
1976 .start
= mount_start
,
1978 .reload
= mount_reload
,
1982 .serialize
= mount_serialize
,
1983 .deserialize_item
= mount_deserialize_item
,
1985 .active_state
= mount_active_state
,
1986 .sub_state_to_string
= mount_sub_state_to_string
,
1988 .check_gc
= mount_check_gc
,
1990 .sigchld_event
= mount_sigchld_event
,
1992 .reset_failed
= mount_reset_failed
,
1994 .control_pid
= mount_control_pid
,
1996 .bus_vtable
= bus_mount_vtable
,
1997 .bus_set_property
= bus_mount_set_property
,
1998 .bus_commit_properties
= bus_mount_commit_properties
,
2000 .get_timeout
= mount_get_timeout
,
2002 .can_transient
= true,
2004 .enumerate
= mount_enumerate
,
2005 .shutdown
= mount_shutdown
,
2007 .status_message_formats
= {
2008 .starting_stopping
= {
2009 [0] = "Mounting %s...",
2010 [1] = "Unmounting %s...",
2012 .finished_start_job
= {
2013 [JOB_DONE
] = "Mounted %s.",
2014 [JOB_FAILED
] = "Failed to mount %s.",
2015 [JOB_TIMEOUT
] = "Timed out mounting %s.",
2017 .finished_stop_job
= {
2018 [JOB_DONE
] = "Unmounted %s.",
2019 [JOB_FAILED
] = "Failed unmounting %s.",
2020 [JOB_TIMEOUT
] = "Timed out unmounting %s.",