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>
28 #include "sd-messages.h"
30 #include "alloc-util.h"
31 #include "dbus-mount.h"
33 #include "exit-status.h"
34 #include "format-util.h"
35 #include "fstab-util.h"
39 #include "mount-setup.h"
40 #include "mount-util.h"
42 #include "parse-util.h"
43 #include "path-util.h"
44 #include "process-util.h"
46 #include "string-table.h"
47 #include "string-util.h"
49 #include "unit-name.h"
52 #define RETRY_UMOUNT_MAX 32
54 DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_table
*, mnt_free_table
);
55 DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_iter
*, mnt_free_iter
);
57 static const UnitActiveState state_translation_table
[_MOUNT_STATE_MAX
] = {
58 [MOUNT_DEAD
] = UNIT_INACTIVE
,
59 [MOUNT_MOUNTING
] = UNIT_ACTIVATING
,
60 [MOUNT_MOUNTING_DONE
] = UNIT_ACTIVATING
,
61 [MOUNT_MOUNTED
] = UNIT_ACTIVE
,
62 [MOUNT_REMOUNTING
] = UNIT_RELOADING
,
63 [MOUNT_UNMOUNTING
] = UNIT_DEACTIVATING
,
64 [MOUNT_REMOUNTING_SIGTERM
] = UNIT_RELOADING
,
65 [MOUNT_REMOUNTING_SIGKILL
] = UNIT_RELOADING
,
66 [MOUNT_UNMOUNTING_SIGTERM
] = UNIT_DEACTIVATING
,
67 [MOUNT_UNMOUNTING_SIGKILL
] = UNIT_DEACTIVATING
,
68 [MOUNT_FAILED
] = UNIT_FAILED
71 static int mount_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
72 static int mount_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
74 static bool MOUNT_STATE_WITH_PROCESS(MountState state
) {
79 MOUNT_REMOUNTING_SIGTERM
,
80 MOUNT_REMOUNTING_SIGKILL
,
82 MOUNT_UNMOUNTING_SIGTERM
,
83 MOUNT_UNMOUNTING_SIGKILL
);
86 static bool mount_needs_network(const char *options
, const char *fstype
) {
87 if (fstab_test_option(options
, "_netdev\0"))
90 if (fstype
&& fstype_is_network(fstype
))
96 static bool mount_is_network(const MountParameters
*p
) {
99 return mount_needs_network(p
->options
, p
->fstype
);
102 static bool mount_is_loop(const MountParameters
*p
) {
105 if (fstab_test_option(p
->options
, "loop\0"))
111 static bool mount_is_bind(const MountParameters
*p
) {
114 if (fstab_test_option(p
->options
, "bind\0" "rbind\0"))
117 if (p
->fstype
&& STR_IN_SET(p
->fstype
, "bind", "rbind"))
123 static bool mount_is_auto(const MountParameters
*p
) {
126 return !fstab_test_option(p
->options
, "noauto\0");
129 static bool mount_is_automount(const MountParameters
*p
) {
132 return fstab_test_option(p
->options
,
133 "comment=systemd.automount\0"
134 "x-systemd.automount\0");
137 static bool mount_is_bound_to_device(const Mount
*m
) {
138 const MountParameters
*p
;
140 if (m
->from_fragment
)
143 p
= &m
->parameters_proc_self_mountinfo
;
144 return fstab_test_option(p
->options
, "x-systemd.device-bound\0");
147 static bool needs_quota(const MountParameters
*p
) {
150 /* Quotas are not enabled on network filesystems,
151 * but we want them, for example, on storage connected via iscsi */
152 if (p
->fstype
&& fstype_is_network(p
->fstype
))
155 if (mount_is_bind(p
))
158 return fstab_test_option(p
->options
,
159 "usrquota\0" "grpquota\0" "quota\0" "usrjquota\0" "grpjquota\0");
162 static void mount_init(Unit
*u
) {
166 assert(u
->load_state
== UNIT_STUB
);
168 m
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
170 m
->exec_context
.std_output
= u
->manager
->default_std_output
;
171 m
->exec_context
.std_error
= u
->manager
->default_std_error
;
173 m
->directory_mode
= 0755;
175 /* We need to make sure that /usr/bin/mount is always called
176 * in the same process group as us, so that the autofs kernel
177 * side doesn't send us another mount request while we are
178 * already trying to comply its last one. */
179 m
->exec_context
.same_pgrp
= true;
181 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
183 u
->ignore_on_isolate
= true;
186 static int mount_arm_timer(Mount
*m
, usec_t usec
) {
191 if (m
->timer_event_source
) {
192 r
= sd_event_source_set_time(m
->timer_event_source
, usec
);
196 return sd_event_source_set_enabled(m
->timer_event_source
, SD_EVENT_ONESHOT
);
199 if (usec
== USEC_INFINITY
)
202 r
= sd_event_add_time(
203 UNIT(m
)->manager
->event
,
204 &m
->timer_event_source
,
207 mount_dispatch_timer
, m
);
211 (void) sd_event_source_set_description(m
->timer_event_source
, "mount-timer");
216 static void mount_unwatch_control_pid(Mount
*m
) {
219 if (m
->control_pid
<= 0)
222 unit_unwatch_pid(UNIT(m
), m
->control_pid
);
226 static void mount_parameters_done(MountParameters
*p
) {
233 p
->what
= p
->options
= p
->fstype
= NULL
;
236 static void mount_done(Unit
*u
) {
241 m
->where
= mfree(m
->where
);
243 mount_parameters_done(&m
->parameters_proc_self_mountinfo
);
244 mount_parameters_done(&m
->parameters_fragment
);
246 m
->exec_runtime
= exec_runtime_unref(m
->exec_runtime
, false);
247 exec_command_done_array(m
->exec_command
, _MOUNT_EXEC_COMMAND_MAX
);
248 m
->control_command
= NULL
;
250 dynamic_creds_unref(&m
->dynamic_creds
);
252 mount_unwatch_control_pid(m
);
254 m
->timer_event_source
= sd_event_source_unref(m
->timer_event_source
);
257 _pure_
static MountParameters
* get_mount_parameters_fragment(Mount
*m
) {
260 if (m
->from_fragment
)
261 return &m
->parameters_fragment
;
266 _pure_
static MountParameters
* get_mount_parameters(Mount
*m
) {
269 if (m
->from_proc_self_mountinfo
)
270 return &m
->parameters_proc_self_mountinfo
;
272 return get_mount_parameters_fragment(m
);
275 static int mount_add_mount_dependencies(Mount
*m
) {
284 if (!path_equal(m
->where
, "/")) {
285 _cleanup_free_
char *parent
= NULL
;
287 /* Adds in links to other mount points that might lie further up in the hierarchy */
289 parent
= dirname_malloc(m
->where
);
293 r
= unit_require_mounts_for(UNIT(m
), parent
, UNIT_DEPENDENCY_IMPLICIT
);
298 /* Adds in dependencies to other mount points that might be needed for the source path (if this is a bind mount
299 * or a loop mount) to be available. */
300 pm
= get_mount_parameters_fragment(m
);
301 if (pm
&& pm
->what
&&
302 path_is_absolute(pm
->what
) &&
303 (mount_is_bind(pm
) || mount_is_loop(pm
) || !mount_is_network(pm
))) {
305 r
= unit_require_mounts_for(UNIT(m
), pm
->what
, UNIT_DEPENDENCY_FILE
);
310 /* Adds in dependencies to other units that use this path or paths further down in the hierarchy */
311 s
= manager_get_units_requiring_mounts_for(UNIT(m
)->manager
, m
->where
);
312 SET_FOREACH(other
, s
, i
) {
314 if (other
->load_state
!= UNIT_LOADED
)
317 if (other
== UNIT(m
))
320 r
= unit_add_dependency(other
, UNIT_AFTER
, UNIT(m
), true, UNIT_DEPENDENCY_PATH
);
324 if (UNIT(m
)->fragment_path
) {
325 /* If we have fragment configuration, then make this dependency required */
326 r
= unit_add_dependency(other
, UNIT_REQUIRES
, UNIT(m
), true, UNIT_DEPENDENCY_PATH
);
335 static int mount_add_device_dependencies(Mount
*m
) {
336 bool device_wants_mount
= false;
337 UnitDependencyMask mask
;
344 p
= get_mount_parameters(m
);
351 if (mount_is_bind(p
))
354 if (!is_device_path(p
->what
))
357 /* /dev/root is a really weird thing, it's not a real device,
358 * but just a path the kernel exports for the root file system
359 * specified on the kernel command line. Ignore it here. */
360 if (path_equal(p
->what
, "/dev/root"))
363 if (path_equal(m
->where
, "/"))
366 if (mount_is_auto(p
) && !mount_is_automount(p
) && MANAGER_IS_SYSTEM(UNIT(m
)->manager
))
367 device_wants_mount
= true;
369 /* Mount units from /proc/self/mountinfo are not bound to devices
370 * by default since they're subject to races when devices are
371 * unplugged. But the user can still force this dep with an
372 * appropriate option (or udev property) so the mount units are
373 * automatically stopped when the device disappears suddenly. */
374 dep
= mount_is_bound_to_device(m
) ? UNIT_BINDS_TO
: UNIT_REQUIRES
;
376 mask
= m
->from_fragment
? UNIT_DEPENDENCY_FILE
: UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT
;
378 r
= unit_add_node_dependency(UNIT(m
), p
->what
, device_wants_mount
, dep
, mask
);
385 static int mount_add_quota_dependencies(Mount
*m
) {
386 UnitDependencyMask mask
;
392 if (!MANAGER_IS_SYSTEM(UNIT(m
)->manager
))
395 p
= get_mount_parameters_fragment(m
);
402 mask
= m
->from_fragment
? UNIT_DEPENDENCY_FILE
: UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT
;
404 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_WANTS
, SPECIAL_QUOTACHECK_SERVICE
, NULL
, true, mask
);
408 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_WANTS
, SPECIAL_QUOTAON_SERVICE
, NULL
, true, mask
);
415 static bool mount_is_extrinsic(Mount
*m
) {
419 /* Returns true for all units that are "magic" and should be excluded from the usual start-up and shutdown
420 * dependencies. We call them "extrinsic" here, as they are generally mounted outside of the systemd dependency
421 * logic. We shouldn't attempt to manage them ourselves but it's fine if the user operates on them with us. */
423 if (!MANAGER_IS_SYSTEM(UNIT(m
)->manager
)) /* We only automatically manage mounts if we are in system mode */
426 if (PATH_IN_SET(m
->where
, /* Don't bother with the OS data itself */
431 if (PATH_STARTSWITH_SET(m
->where
,
432 "/run/initramfs", /* This should stay around from before we boot until after we shutdown */
433 "/proc", /* All of this is API VFS */
434 "/sys", /* … dito … */
435 "/dev")) /* … dito … */
438 /* If this is an initrd mount, and we are not in the initrd, then leave this around forever, too. */
439 p
= get_mount_parameters(m
);
440 if (p
&& fstab_test_option(p
->options
, "x-initrd.mount\0") && !in_initrd())
446 static int mount_add_default_dependencies(Mount
*m
) {
447 UnitDependencyMask mask
;
454 if (!UNIT(m
)->default_dependencies
)
457 /* We do not add any default dependencies to /, /usr or /run/initramfs/, since they are guaranteed to stay
458 * mounted the whole time, since our system is on it. Also, don't bother with anything mounted below virtual
459 * file systems, it's also going to be virtual, and hence not worth the effort. */
460 if (mount_is_extrinsic(m
))
463 p
= get_mount_parameters(m
);
467 mask
= m
->from_fragment
? UNIT_DEPENDENCY_FILE
: UNIT_DEPENDENCY_MOUNTINFO_DEFAULT
;
469 if (mount_is_network(p
)) {
470 /* We order ourselves after network.target. This is
471 * primarily useful at shutdown: services that take
472 * down the network should order themselves before
473 * network.target, so that they are shut down only
474 * after this mount unit is stopped. */
476 r
= unit_add_dependency_by_name(UNIT(m
), UNIT_AFTER
, SPECIAL_NETWORK_TARGET
, NULL
, true, mask
);
480 /* We pull in network-online.target, and order
481 * ourselves after it. This is useful at start-up to
482 * actively pull in tools that want to be started
483 * before we start mounting network file systems, and
484 * whose purpose it is to delay this until the network
487 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_WANTS
, UNIT_AFTER
, SPECIAL_NETWORK_ONLINE_TARGET
, NULL
, true, mask
);
491 after
= SPECIAL_REMOTE_FS_PRE_TARGET
;
493 after
= SPECIAL_LOCAL_FS_PRE_TARGET
;
495 r
= unit_add_dependency_by_name(UNIT(m
), UNIT_AFTER
, after
, NULL
, true, mask
);
499 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true, mask
);
503 /* If this is a tmpfs mount then we have to unmount it before we try to deactivate swaps */
504 if (streq_ptr(p
->fstype
, "tmpfs")) {
505 r
= unit_add_dependency_by_name(UNIT(m
), UNIT_AFTER
, SPECIAL_SWAP_TARGET
, NULL
, true, mask
);
513 static int mount_verify(Mount
*m
) {
514 _cleanup_free_
char *e
= NULL
;
520 if (UNIT(m
)->load_state
!= UNIT_LOADED
)
523 if (!m
->from_fragment
&& !m
->from_proc_self_mountinfo
&& !UNIT(m
)->perpetual
)
526 r
= unit_name_from_path(m
->where
, ".mount", &e
);
528 return log_unit_error_errno(UNIT(m
), r
, "Failed to generate unit name from mount path: %m");
530 if (!unit_has_name(UNIT(m
), e
)) {
531 log_unit_error(UNIT(m
), "Where= setting doesn't match unit name. Refusing.");
535 if (mount_point_is_api(m
->where
) || mount_point_ignore(m
->where
)) {
536 log_unit_error(UNIT(m
), "Cannot create mount unit for API file system %s. Refusing.", m
->where
);
540 p
= get_mount_parameters_fragment(m
);
542 log_unit_error(UNIT(m
), "What= setting is missing. Refusing.");
546 if (m
->exec_context
.pam_name
&& m
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
547 log_unit_error(UNIT(m
), "Unit has PAM enabled. Kill mode must be set to control-group'. Refusing.");
554 static int mount_add_extras(Mount
*m
) {
560 if (u
->fragment_path
)
561 m
->from_fragment
= true;
564 r
= unit_name_to_path(u
->id
, &m
->where
);
569 path_kill_slashes(m
->where
);
571 if (!u
->description
) {
572 r
= unit_set_description(u
, m
->where
);
577 r
= mount_add_device_dependencies(m
);
581 r
= mount_add_mount_dependencies(m
);
585 r
= mount_add_quota_dependencies(m
);
589 r
= unit_patch_contexts(u
);
593 r
= unit_add_exec_dependencies(u
, &m
->exec_context
);
597 r
= unit_set_default_slice(u
);
601 r
= mount_add_default_dependencies(m
);
608 static int mount_load_root_mount(Unit
*u
) {
611 if (!unit_has_name(u
, SPECIAL_ROOT_MOUNT
))
615 u
->default_dependencies
= false;
617 /* The stdio/kmsg bridge socket is on /, in order to avoid a dep loop, don't use kmsg logging for -.mount */
618 MOUNT(u
)->exec_context
.std_output
= EXEC_OUTPUT_NULL
;
619 MOUNT(u
)->exec_context
.std_input
= EXEC_INPUT_NULL
;
622 u
->description
= strdup("Root Mount");
627 static int mount_load(Unit
*u
) {
632 assert(u
->load_state
== UNIT_STUB
);
634 r
= mount_load_root_mount(u
);
638 if (m
->from_proc_self_mountinfo
|| u
->perpetual
)
639 r
= unit_load_fragment_and_dropin_optional(u
);
641 r
= unit_load_fragment_and_dropin(u
);
645 /* This is a new unit? Then let's add in some extras */
646 if (u
->load_state
== UNIT_LOADED
) {
647 r
= mount_add_extras(m
);
652 return mount_verify(m
);
655 static void mount_set_state(Mount
*m
, MountState state
) {
656 MountState old_state
;
659 old_state
= m
->state
;
662 if (!MOUNT_STATE_WITH_PROCESS(state
)) {
663 m
->timer_event_source
= sd_event_source_unref(m
->timer_event_source
);
664 mount_unwatch_control_pid(m
);
665 m
->control_command
= NULL
;
666 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
669 if (state
!= old_state
)
670 log_unit_debug(UNIT(m
), "Changed %s -> %s", mount_state_to_string(old_state
), mount_state_to_string(state
));
672 unit_notify(UNIT(m
), state_translation_table
[old_state
], state_translation_table
[state
], m
->reload_result
== MOUNT_SUCCESS
);
675 static int mount_coldplug(Unit
*u
) {
677 MountState new_state
= MOUNT_DEAD
;
681 assert(m
->state
== MOUNT_DEAD
);
683 if (m
->deserialized_state
!= m
->state
)
684 new_state
= m
->deserialized_state
;
685 else if (m
->from_proc_self_mountinfo
)
686 new_state
= MOUNT_MOUNTED
;
688 if (new_state
== m
->state
)
691 if (m
->control_pid
> 0 &&
692 pid_is_unwaited(m
->control_pid
) &&
693 MOUNT_STATE_WITH_PROCESS(new_state
)) {
695 r
= unit_watch_pid(UNIT(m
), m
->control_pid
);
699 r
= mount_arm_timer(m
, usec_add(u
->state_change_timestamp
.monotonic
, m
->timeout_usec
));
704 if (!IN_SET(new_state
, MOUNT_DEAD
, MOUNT_FAILED
)) {
705 (void) unit_setup_dynamic_creds(u
);
706 (void) unit_setup_exec_runtime(u
);
709 mount_set_state(m
, new_state
);
713 static void mount_dump(Unit
*u
, FILE *f
, const char *prefix
) {
714 char buf
[FORMAT_TIMESPAN_MAX
];
721 p
= get_mount_parameters(m
);
724 "%sMount State: %s\n"
728 "%sFile System Type: %s\n"
730 "%sFrom /proc/self/mountinfo: %s\n"
731 "%sFrom fragment: %s\n"
733 "%sDirectoryMode: %04o\n"
734 "%sSloppyOptions: %s\n"
735 "%sLazyUnmount: %s\n"
736 "%sForceUnmount: %s\n"
738 prefix
, mount_state_to_string(m
->state
),
739 prefix
, mount_result_to_string(m
->result
),
741 prefix
, p
? strna(p
->what
) : "n/a",
742 prefix
, p
? strna(p
->fstype
) : "n/a",
743 prefix
, p
? strna(p
->options
) : "n/a",
744 prefix
, yes_no(m
->from_proc_self_mountinfo
),
745 prefix
, yes_no(m
->from_fragment
),
746 prefix
, yes_no(mount_is_extrinsic(m
)),
747 prefix
, m
->directory_mode
,
748 prefix
, yes_no(m
->sloppy_options
),
749 prefix
, yes_no(m
->lazy_unmount
),
750 prefix
, yes_no(m
->force_unmount
),
751 prefix
, format_timespan(buf
, sizeof(buf
), m
->timeout_usec
, USEC_PER_SEC
));
753 if (m
->control_pid
> 0)
755 "%sControl PID: "PID_FMT
"\n",
756 prefix
, m
->control_pid
);
758 exec_context_dump(&m
->exec_context
, f
, prefix
);
759 kill_context_dump(&m
->kill_context
, f
, prefix
);
760 cgroup_context_dump(&m
->cgroup_context
, f
, prefix
);
763 static int mount_spawn(Mount
*m
, ExecCommand
*c
, pid_t
*_pid
) {
765 ExecParameters exec_params
= {
766 .flags
= EXEC_APPLY_SANDBOXING
|EXEC_APPLY_CHROOT
|EXEC_APPLY_TTY_STDIN
,
778 r
= unit_prepare_exec(UNIT(m
));
782 r
= mount_arm_timer(m
, usec_add(now(CLOCK_MONOTONIC
), m
->timeout_usec
));
786 unit_set_exec_params(UNIT(m
), &exec_params
);
788 r
= exec_spawn(UNIT(m
),
798 r
= unit_watch_pid(UNIT(m
), pid
);
800 /* FIXME: we need to do something here */
808 static void mount_enter_dead(Mount
*m
, MountResult f
) {
811 if (m
->result
== MOUNT_SUCCESS
)
814 if (m
->result
!= MOUNT_SUCCESS
)
815 log_unit_warning(UNIT(m
), "Failed with result '%s'.", mount_result_to_string(m
->result
));
817 mount_set_state(m
, m
->result
!= MOUNT_SUCCESS
? MOUNT_FAILED
: MOUNT_DEAD
);
819 m
->exec_runtime
= exec_runtime_unref(m
->exec_runtime
, true);
821 exec_context_destroy_runtime_directory(&m
->exec_context
, UNIT(m
)->manager
->prefix
[EXEC_DIRECTORY_RUNTIME
]);
823 unit_unref_uid_gid(UNIT(m
), true);
825 dynamic_creds_destroy(&m
->dynamic_creds
);
828 static void mount_enter_mounted(Mount
*m
, MountResult f
) {
831 if (m
->result
== MOUNT_SUCCESS
)
834 mount_set_state(m
, MOUNT_MOUNTED
);
837 static void mount_enter_dead_or_mounted(Mount
*m
, MountResult f
) {
840 /* Enter DEAD or MOUNTED state, depending on what the kernel currently says about the mount point. We use this
841 * whenever we executed an operation, so that our internal state reflects what the kernel says again, after all
842 * ultimately we just mirror the kernel's internal state on this. */
844 if (m
->from_proc_self_mountinfo
)
845 mount_enter_mounted(m
, f
);
847 mount_enter_dead(m
, f
);
850 static int state_to_kill_operation(MountState state
) {
853 case MOUNT_REMOUNTING_SIGTERM
:
854 case MOUNT_UNMOUNTING_SIGTERM
:
855 return KILL_TERMINATE
;
857 case MOUNT_REMOUNTING_SIGKILL
:
858 case MOUNT_UNMOUNTING_SIGKILL
:
862 return _KILL_OPERATION_INVALID
;
866 static void mount_enter_signal(Mount
*m
, MountState state
, MountResult f
) {
871 if (m
->result
== MOUNT_SUCCESS
)
874 r
= unit_kill_context(
877 state_to_kill_operation(state
),
885 r
= mount_arm_timer(m
, usec_add(now(CLOCK_MONOTONIC
), m
->timeout_usec
));
889 mount_set_state(m
, state
);
890 } else if (state
== MOUNT_REMOUNTING_SIGTERM
&& m
->kill_context
.send_sigkill
)
891 mount_enter_signal(m
, MOUNT_REMOUNTING_SIGKILL
, MOUNT_SUCCESS
);
892 else if (IN_SET(state
, MOUNT_REMOUNTING_SIGTERM
, MOUNT_REMOUNTING_SIGKILL
))
893 mount_enter_mounted(m
, MOUNT_SUCCESS
);
894 else if (state
== MOUNT_UNMOUNTING_SIGTERM
&& m
->kill_context
.send_sigkill
)
895 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGKILL
, MOUNT_SUCCESS
);
897 mount_enter_dead_or_mounted(m
, MOUNT_SUCCESS
);
902 log_unit_warning_errno(UNIT(m
), r
, "Failed to kill processes: %m");
903 mount_enter_dead_or_mounted(m
, MOUNT_FAILURE_RESOURCES
);
906 static void mount_enter_unmounting(Mount
*m
) {
911 /* Start counting our attempts */
912 if (!IN_SET(m
->state
,
914 MOUNT_UNMOUNTING_SIGTERM
,
915 MOUNT_UNMOUNTING_SIGKILL
))
916 m
->n_retry_umount
= 0;
918 m
->control_command_id
= MOUNT_EXEC_UNMOUNT
;
919 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_UNMOUNT
;
921 r
= exec_command_set(m
->control_command
, UMOUNT_PATH
, m
->where
, "-c", NULL
);
922 if (r
>= 0 && m
->lazy_unmount
)
923 r
= exec_command_append(m
->control_command
, "-l", NULL
);
924 if (r
>= 0 && m
->force_unmount
)
925 r
= exec_command_append(m
->control_command
, "-f", NULL
);
929 mount_unwatch_control_pid(m
);
931 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
935 mount_set_state(m
, MOUNT_UNMOUNTING
);
940 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'umount' task: %m");
941 mount_enter_dead_or_mounted(m
, MOUNT_FAILURE_RESOURCES
);
944 static void mount_enter_mounting(Mount
*m
) {
950 r
= unit_fail_if_noncanonical(UNIT(m
), m
->where
);
954 (void) mkdir_p_label(m
->where
, m
->directory_mode
);
956 unit_warn_if_dir_nonempty(UNIT(m
), m
->where
);
958 unit_warn_leftover_processes(UNIT(m
));
960 m
->control_command_id
= MOUNT_EXEC_MOUNT
;
961 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_MOUNT
;
963 /* Create the source directory for bind-mounts if needed */
964 p
= get_mount_parameters_fragment(m
);
965 if (p
&& mount_is_bind(p
))
966 (void) mkdir_p_label(p
->what
, m
->directory_mode
);
969 _cleanup_free_
char *opts
= NULL
;
971 r
= fstab_filter_options(p
->options
, "nofail\0" "noauto\0" "auto\0", NULL
, NULL
, &opts
);
975 r
= exec_command_set(m
->control_command
, MOUNT_PATH
, p
->what
, m
->where
, NULL
);
976 if (r
>= 0 && m
->sloppy_options
)
977 r
= exec_command_append(m
->control_command
, "-s", NULL
);
978 if (r
>= 0 && p
->fstype
)
979 r
= exec_command_append(m
->control_command
, "-t", p
->fstype
, NULL
);
980 if (r
>= 0 && !isempty(opts
))
981 r
= exec_command_append(m
->control_command
, "-o", opts
, NULL
);
987 mount_unwatch_control_pid(m
);
989 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
993 mount_set_state(m
, MOUNT_MOUNTING
);
998 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'mount' task: %m");
999 mount_enter_dead_or_mounted(m
, MOUNT_FAILURE_RESOURCES
);
1002 static void mount_set_reload_result(Mount
*m
, MountResult result
) {
1005 /* Only store the first error we encounter */
1006 if (m
->reload_result
!= MOUNT_SUCCESS
)
1009 m
->reload_result
= result
;
1012 static void mount_enter_remounting(Mount
*m
) {
1018 /* Reset reload result when we are about to start a new remount operation */
1019 m
->reload_result
= MOUNT_SUCCESS
;
1021 m
->control_command_id
= MOUNT_EXEC_REMOUNT
;
1022 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_REMOUNT
;
1024 p
= get_mount_parameters_fragment(m
);
1029 o
= strjoina("remount,", p
->options
);
1033 r
= exec_command_set(m
->control_command
, MOUNT_PATH
,
1036 if (r
>= 0 && m
->sloppy_options
)
1037 r
= exec_command_append(m
->control_command
, "-s", NULL
);
1038 if (r
>= 0 && p
->fstype
)
1039 r
= exec_command_append(m
->control_command
, "-t", p
->fstype
, NULL
);
1045 mount_unwatch_control_pid(m
);
1047 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
1051 mount_set_state(m
, MOUNT_REMOUNTING
);
1056 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'remount' task: %m");
1057 mount_set_reload_result(m
, MOUNT_FAILURE_RESOURCES
);
1058 mount_enter_dead_or_mounted(m
, MOUNT_SUCCESS
);
1061 static int mount_start(Unit
*u
) {
1062 Mount
*m
= MOUNT(u
);
1067 /* We cannot fulfill this request right now, try again later
1069 if (IN_SET(m
->state
,
1071 MOUNT_UNMOUNTING_SIGTERM
,
1072 MOUNT_UNMOUNTING_SIGKILL
))
1075 /* Already on it! */
1076 if (m
->state
== MOUNT_MOUNTING
)
1079 assert(IN_SET(m
->state
, MOUNT_DEAD
, MOUNT_FAILED
));
1081 r
= unit_start_limit_test(u
);
1083 mount_enter_dead(m
, MOUNT_FAILURE_START_LIMIT_HIT
);
1087 r
= unit_acquire_invocation_id(u
);
1091 m
->result
= MOUNT_SUCCESS
;
1092 m
->reload_result
= MOUNT_SUCCESS
;
1094 u
->reset_accounting
= true;
1096 mount_enter_mounting(m
);
1100 static int mount_stop(Unit
*u
) {
1101 Mount
*m
= MOUNT(u
);
1107 case MOUNT_UNMOUNTING
:
1108 case MOUNT_UNMOUNTING_SIGKILL
:
1109 case MOUNT_UNMOUNTING_SIGTERM
:
1113 case MOUNT_MOUNTING
:
1114 case MOUNT_MOUNTING_DONE
:
1115 case MOUNT_REMOUNTING
:
1116 /* If we are still waiting for /bin/mount, we go directly into kill mode. */
1117 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGTERM
, MOUNT_SUCCESS
);
1120 case MOUNT_REMOUNTING_SIGTERM
:
1121 /* If we are already waiting for a hung remount, convert this to the matching unmounting state */
1122 mount_set_state(m
, MOUNT_UNMOUNTING_SIGTERM
);
1125 case MOUNT_REMOUNTING_SIGKILL
:
1127 mount_set_state(m
, MOUNT_UNMOUNTING_SIGKILL
);
1131 mount_enter_unmounting(m
);
1135 assert_not_reached("Unexpected state.");
1139 static int mount_reload(Unit
*u
) {
1140 Mount
*m
= MOUNT(u
);
1143 assert(m
->state
== MOUNT_MOUNTED
);
1145 mount_enter_remounting(m
);
1150 static int mount_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
1151 Mount
*m
= MOUNT(u
);
1157 unit_serialize_item(u
, f
, "state", mount_state_to_string(m
->state
));
1158 unit_serialize_item(u
, f
, "result", mount_result_to_string(m
->result
));
1159 unit_serialize_item(u
, f
, "reload-result", mount_result_to_string(m
->reload_result
));
1161 if (m
->control_pid
> 0)
1162 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, m
->control_pid
);
1164 if (m
->control_command_id
>= 0)
1165 unit_serialize_item(u
, f
, "control-command", mount_exec_command_to_string(m
->control_command_id
));
1170 static int mount_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
1171 Mount
*m
= MOUNT(u
);
1178 if (streq(key
, "state")) {
1181 if ((state
= mount_state_from_string(value
)) < 0)
1182 log_unit_debug(u
, "Failed to parse state value: %s", value
);
1184 m
->deserialized_state
= state
;
1185 } else if (streq(key
, "result")) {
1188 f
= mount_result_from_string(value
);
1190 log_unit_debug(u
, "Failed to parse result value: %s", value
);
1191 else if (f
!= MOUNT_SUCCESS
)
1194 } else if (streq(key
, "reload-result")) {
1197 f
= mount_result_from_string(value
);
1199 log_unit_debug(u
, "Failed to parse reload result value: %s", value
);
1200 else if (f
!= MOUNT_SUCCESS
)
1201 m
->reload_result
= f
;
1203 } else if (streq(key
, "control-pid")) {
1206 if (parse_pid(value
, &pid
) < 0)
1207 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
1209 m
->control_pid
= pid
;
1210 } else if (streq(key
, "control-command")) {
1211 MountExecCommand id
;
1213 id
= mount_exec_command_from_string(value
);
1215 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
1217 m
->control_command_id
= id
;
1218 m
->control_command
= m
->exec_command
+ id
;
1221 log_unit_debug(u
, "Unknown serialization key: %s", key
);
1226 _pure_
static UnitActiveState
mount_active_state(Unit
*u
) {
1229 return state_translation_table
[MOUNT(u
)->state
];
1232 _pure_
static const char *mount_sub_state_to_string(Unit
*u
) {
1235 return mount_state_to_string(MOUNT(u
)->state
);
1238 _pure_
static bool mount_may_gc(Unit
*u
) {
1239 Mount
*m
= MOUNT(u
);
1243 if (m
->from_proc_self_mountinfo
)
1249 static void mount_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
1250 Mount
*m
= MOUNT(u
);
1256 if (pid
!= m
->control_pid
)
1261 if (is_clean_exit(code
, status
, EXIT_CLEAN_COMMAND
, NULL
))
1263 else if (code
== CLD_EXITED
)
1264 f
= MOUNT_FAILURE_EXIT_CODE
;
1265 else if (code
== CLD_KILLED
)
1266 f
= MOUNT_FAILURE_SIGNAL
;
1267 else if (code
== CLD_DUMPED
)
1268 f
= MOUNT_FAILURE_CORE_DUMP
;
1270 assert_not_reached("Unknown code");
1272 if (IN_SET(m
->state
, MOUNT_REMOUNTING
, MOUNT_REMOUNTING_SIGKILL
, MOUNT_REMOUNTING_SIGTERM
))
1273 mount_set_reload_result(m
, f
);
1274 else if (m
->result
== MOUNT_SUCCESS
)
1277 if (m
->control_command
) {
1278 exec_status_exit(&m
->control_command
->exec_status
, &m
->exec_context
, pid
, code
, status
);
1280 m
->control_command
= NULL
;
1281 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
1284 log_unit_full(u
, f
== MOUNT_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
1285 "Mount process exited, code=%s status=%i", sigchld_code_to_string(code
), status
);
1287 /* Note that due to the io event priority logic, we can be sure the new mountinfo is loaded
1288 * before we process the SIGCHLD for the mount command. */
1292 case MOUNT_MOUNTING
:
1293 /* Our mount point has not appeared in mountinfo. Something went wrong. */
1295 if (f
== MOUNT_SUCCESS
) {
1296 /* Either /bin/mount has an unexpected definition of success,
1297 * or someone raced us and we lost. */
1298 log_unit_warning(UNIT(m
), "Mount process finished, but there is no mount.");
1299 f
= MOUNT_FAILURE_PROTOCOL
;
1301 mount_enter_dead(m
, f
);
1304 case MOUNT_MOUNTING_DONE
:
1305 mount_enter_mounted(m
, f
);
1308 case MOUNT_REMOUNTING
:
1309 case MOUNT_REMOUNTING_SIGTERM
:
1310 case MOUNT_REMOUNTING_SIGKILL
:
1311 mount_enter_dead_or_mounted(m
, MOUNT_SUCCESS
);
1314 case MOUNT_UNMOUNTING
:
1316 if (f
== MOUNT_SUCCESS
&& m
->from_proc_self_mountinfo
) {
1318 /* Still a mount point? If so, let's try again. Most likely there were multiple mount points
1319 * stacked on top of each other. We might exceed the timeout specified by the user overall,
1320 * but we will stop as soon as any one umount times out. */
1322 if (m
->n_retry_umount
< RETRY_UMOUNT_MAX
) {
1323 log_unit_debug(u
, "Mount still present, trying again.");
1324 m
->n_retry_umount
++;
1325 mount_enter_unmounting(m
);
1327 log_unit_warning(u
, "Mount still present after %u attempts to unmount, giving up.", m
->n_retry_umount
);
1328 mount_enter_mounted(m
, f
);
1331 mount_enter_dead_or_mounted(m
, f
);
1335 case MOUNT_UNMOUNTING_SIGKILL
:
1336 case MOUNT_UNMOUNTING_SIGTERM
:
1337 mount_enter_dead_or_mounted(m
, f
);
1341 assert_not_reached("Uh, control process died at wrong time.");
1344 /* Notify clients about changed exit status */
1345 unit_add_to_dbus_queue(u
);
1348 static int mount_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
1349 Mount
*m
= MOUNT(userdata
);
1352 assert(m
->timer_event_source
== source
);
1356 case MOUNT_MOUNTING
:
1357 case MOUNT_MOUNTING_DONE
:
1358 log_unit_warning(UNIT(m
), "Mounting timed out. Terminating.");
1359 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGTERM
, MOUNT_FAILURE_TIMEOUT
);
1362 case MOUNT_REMOUNTING
:
1363 log_unit_warning(UNIT(m
), "Remounting timed out. Terminating remount process.");
1364 mount_set_reload_result(m
, MOUNT_FAILURE_TIMEOUT
);
1365 mount_enter_signal(m
, MOUNT_REMOUNTING_SIGTERM
, MOUNT_SUCCESS
);
1368 case MOUNT_REMOUNTING_SIGTERM
:
1369 mount_set_reload_result(m
, MOUNT_FAILURE_TIMEOUT
);
1371 if (m
->kill_context
.send_sigkill
) {
1372 log_unit_warning(UNIT(m
), "Remounting timed out. Killing.");
1373 mount_enter_signal(m
, MOUNT_REMOUNTING_SIGKILL
, MOUNT_SUCCESS
);
1375 log_unit_warning(UNIT(m
), "Remounting timed out. Skipping SIGKILL. Ignoring.");
1376 mount_enter_dead_or_mounted(m
, MOUNT_SUCCESS
);
1380 case MOUNT_REMOUNTING_SIGKILL
:
1381 mount_set_reload_result(m
, MOUNT_FAILURE_TIMEOUT
);
1383 log_unit_warning(UNIT(m
), "Mount process still around after SIGKILL. Ignoring.");
1384 mount_enter_dead_or_mounted(m
, MOUNT_SUCCESS
);
1387 case MOUNT_UNMOUNTING
:
1388 log_unit_warning(UNIT(m
), "Unmounting timed out. Terminating.");
1389 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGTERM
, MOUNT_FAILURE_TIMEOUT
);
1392 case MOUNT_UNMOUNTING_SIGTERM
:
1393 if (m
->kill_context
.send_sigkill
) {
1394 log_unit_warning(UNIT(m
), "Mount process timed out. Killing.");
1395 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGKILL
, MOUNT_FAILURE_TIMEOUT
);
1397 log_unit_warning(UNIT(m
), "Mount process timed out. Skipping SIGKILL. Ignoring.");
1398 mount_enter_dead_or_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1402 case MOUNT_UNMOUNTING_SIGKILL
:
1403 log_unit_warning(UNIT(m
), "Mount process still around after SIGKILL. Ignoring.");
1404 mount_enter_dead_or_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1408 assert_not_reached("Timeout at wrong time.");
1420 static int mount_setup_new_unit(
1424 const char *options
,
1426 MountSetupFlags
*flags
) {
1433 u
->source_path
= strdup("/proc/self/mountinfo");
1434 MOUNT(u
)->where
= strdup(where
);
1435 if (!u
->source_path
|| !MOUNT(u
)->where
)
1438 /* Make sure to initialize those fields before mount_is_extrinsic(). */
1439 MOUNT(u
)->from_proc_self_mountinfo
= true;
1440 p
= &MOUNT(u
)->parameters_proc_self_mountinfo
;
1442 p
->what
= strdup(what
);
1443 p
->options
= strdup(options
);
1444 p
->fstype
= strdup(fstype
);
1445 if (!p
->what
|| !p
->options
|| !p
->fstype
)
1448 if (!mount_is_extrinsic(MOUNT(u
))) {
1452 target
= mount_is_network(p
) ? SPECIAL_REMOTE_FS_TARGET
: SPECIAL_LOCAL_FS_TARGET
;
1453 r
= unit_add_dependency_by_name(u
, UNIT_BEFORE
, target
, NULL
, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT
);
1457 r
= unit_add_dependency_by_name(u
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT
);
1462 unit_add_to_load_queue(u
);
1463 flags
->is_mounted
= true;
1464 flags
->just_mounted
= true;
1465 flags
->just_changed
= true;
1470 static int mount_setup_existing_unit(
1474 const char *options
,
1476 MountSetupFlags
*flags
) {
1479 bool load_extras
= false;
1485 if (!MOUNT(u
)->where
) {
1486 MOUNT(u
)->where
= strdup(where
);
1487 if (!MOUNT(u
)->where
)
1491 /* Make sure to initialize those fields before mount_is_extrinsic(). */
1492 p
= &MOUNT(u
)->parameters_proc_self_mountinfo
;
1494 r1
= free_and_strdup(&p
->what
, what
);
1495 r2
= free_and_strdup(&p
->options
, options
);
1496 r3
= free_and_strdup(&p
->fstype
, fstype
);
1497 if (r1
< 0 || r2
< 0 || r3
< 0)
1500 flags
->just_changed
= r1
> 0 || r2
> 0 || r3
> 0;
1501 flags
->is_mounted
= true;
1502 flags
->just_mounted
= !MOUNT(u
)->from_proc_self_mountinfo
|| MOUNT(u
)->just_mounted
;
1504 MOUNT(u
)->from_proc_self_mountinfo
= true;
1506 if (!mount_is_extrinsic(MOUNT(u
)) && mount_is_network(p
)) {
1507 /* _netdev option may have shown up late, or on a
1508 * remount. Add remote-fs dependencies, even though
1509 * local-fs ones may already be there.
1511 * Note: due to a current limitation (we don't track
1512 * in the dependency "Set*" objects who created a
1513 * dependency), we can only add deps, never lose them,
1514 * until the next full daemon-reload. */
1515 unit_add_dependency_by_name(u
, UNIT_BEFORE
, SPECIAL_REMOTE_FS_TARGET
, NULL
, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT
);
1519 if (u
->load_state
== UNIT_NOT_FOUND
) {
1520 u
->load_state
= UNIT_LOADED
;
1523 /* Load in the extras later on, after we
1524 * finished initialization of the unit */
1526 /* FIXME: since we're going to load the unit later on, why setting load_extras=true ? */
1528 flags
->just_changed
= true;
1532 return mount_add_extras(MOUNT(u
));
1537 static int mount_setup_unit(
1541 const char *options
,
1545 _cleanup_free_
char *e
= NULL
;
1546 MountSetupFlags flags
;
1556 /* Ignore API mount points. They should never be referenced in
1557 * dependencies ever. */
1558 if (mount_point_is_api(where
) || mount_point_ignore(where
))
1561 if (streq(fstype
, "autofs"))
1564 /* probably some kind of swap, ignore */
1565 if (!is_path(where
))
1568 r
= unit_name_from_path(where
, ".mount", &e
);
1572 u
= manager_get_unit(m
, e
);
1574 /* First time we see this mount point meaning that it's
1575 * not been initiated by a mount unit but rather by the
1576 * sysadmin having called mount(8) directly. */
1577 r
= unit_new_for_name(m
, sizeof(Mount
), e
, &u
);
1581 r
= mount_setup_new_unit(u
, what
, where
, options
, fstype
, &flags
);
1585 r
= mount_setup_existing_unit(u
, what
, where
, options
, fstype
, &flags
);
1591 MOUNT(u
)->is_mounted
= flags
.is_mounted
;
1592 MOUNT(u
)->just_mounted
= flags
.just_mounted
;
1593 MOUNT(u
)->just_changed
= flags
.just_changed
;
1596 if (flags
.just_changed
)
1597 unit_add_to_dbus_queue(u
);
1601 log_warning_errno(r
, "Failed to set up mount unit: %m");
1605 static int mount_load_proc_self_mountinfo(Manager
*m
, bool set_flags
) {
1606 _cleanup_(mnt_free_tablep
) struct libmnt_table
*t
= NULL
;
1607 _cleanup_(mnt_free_iterp
) struct libmnt_iter
*i
= NULL
;
1612 t
= mnt_new_table();
1613 i
= mnt_new_iter(MNT_ITER_FORWARD
);
1617 r
= mnt_table_parse_mtab(t
, NULL
);
1619 return log_error_errno(r
, "Failed to parse /proc/self/mountinfo: %m");
1623 struct libmnt_fs
*fs
;
1624 const char *device
, *path
, *options
, *fstype
;
1625 _cleanup_free_
char *d
= NULL
, *p
= NULL
;
1628 k
= mnt_table_next_fs(t
, i
, &fs
);
1632 return log_error_errno(k
, "Failed to get next entry from /proc/self/mountinfo: %m");
1634 device
= mnt_fs_get_source(fs
);
1635 path
= mnt_fs_get_target(fs
);
1636 options
= mnt_fs_get_options(fs
);
1637 fstype
= mnt_fs_get_fstype(fs
);
1639 if (!device
|| !path
)
1642 if (cunescape(device
, UNESCAPE_RELAX
, &d
) < 0)
1645 if (cunescape(path
, UNESCAPE_RELAX
, &p
) < 0)
1648 (void) device_found_node(m
, d
, true, DEVICE_FOUND_MOUNT
, set_flags
);
1650 k
= mount_setup_unit(m
, d
, p
, options
, fstype
, set_flags
);
1651 if (r
== 0 && k
< 0)
1658 static void mount_shutdown(Manager
*m
) {
1661 m
->mount_event_source
= sd_event_source_unref(m
->mount_event_source
);
1663 mnt_unref_monitor(m
->mount_monitor
);
1664 m
->mount_monitor
= NULL
;
1667 static int mount_get_timeout(Unit
*u
, usec_t
*timeout
) {
1668 Mount
*m
= MOUNT(u
);
1672 if (!m
->timer_event_source
)
1675 r
= sd_event_source_get_time(m
->timer_event_source
, &t
);
1678 if (t
== USEC_INFINITY
)
1685 static int synthesize_root_mount(Manager
*m
) {
1691 /* Whatever happens, we know for sure that the root directory is around, and cannot go away. Let's
1692 * unconditionally synthesize it here and mark it as perpetual. */
1694 u
= manager_get_unit(m
, SPECIAL_ROOT_MOUNT
);
1696 r
= unit_new_for_name(m
, sizeof(Mount
), SPECIAL_ROOT_MOUNT
, &u
);
1698 return log_error_errno(r
, "Failed to allocate the special " SPECIAL_ROOT_MOUNT
" unit: %m");
1701 u
->perpetual
= true;
1702 MOUNT(u
)->deserialized_state
= MOUNT_MOUNTED
;
1704 unit_add_to_load_queue(u
);
1705 unit_add_to_dbus_queue(u
);
1710 static bool mount_is_mounted(Mount
*m
) {
1713 return UNIT(m
)->perpetual
|| m
->is_mounted
;
1716 static void mount_enumerate(Manager
*m
) {
1721 r
= synthesize_root_mount(m
);
1727 if (!m
->mount_monitor
) {
1730 m
->mount_monitor
= mnt_new_monitor();
1731 if (!m
->mount_monitor
) {
1736 r
= mnt_monitor_enable_kernel(m
->mount_monitor
, 1);
1738 log_error_errno(r
, "Failed to enable watching of kernel mount events: %m");
1742 r
= mnt_monitor_enable_userspace(m
->mount_monitor
, 1, NULL
);
1744 log_error_errno(r
, "Failed to enable watching of userspace mount events: %m");
1748 /* mnt_unref_monitor() will close the fd */
1749 fd
= r
= mnt_monitor_get_fd(m
->mount_monitor
);
1751 log_error_errno(r
, "Failed to acquire watch file descriptor: %m");
1755 r
= sd_event_add_io(m
->event
, &m
->mount_event_source
, fd
, EPOLLIN
, mount_dispatch_io
, m
);
1757 log_error_errno(r
, "Failed to watch mount file descriptor: %m");
1761 r
= sd_event_source_set_priority(m
->mount_event_source
, SD_EVENT_PRIORITY_NORMAL
-10);
1763 log_error_errno(r
, "Failed to adjust mount watch priority: %m");
1767 (void) sd_event_source_set_description(m
->mount_event_source
, "mount-monitor-dispatch");
1770 r
= mount_load_proc_self_mountinfo(m
, false);
1780 static int mount_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1781 _cleanup_set_free_ Set
*around
= NULL
, *gone
= NULL
;
1782 Manager
*m
= userdata
;
1789 assert(revents
& EPOLLIN
);
1791 if (fd
== mnt_monitor_get_fd(m
->mount_monitor
)) {
1792 bool rescan
= false;
1794 /* Drain all events and verify that the event is valid.
1796 * Note that libmount also monitors /run/mount mkdir if the
1797 * directory does not exist yet. The mkdir may generate event
1798 * which is irrelevant for us.
1800 * error: r < 0; valid: r == 0, false positive: rc == 1 */
1802 r
= mnt_monitor_next_change(m
->mount_monitor
, NULL
, NULL
);
1806 return log_error_errno(r
, "Failed to drain libmount events");
1809 log_debug("libmount event [rescan: %s]", yes_no(rescan
));
1814 r
= mount_load_proc_self_mountinfo(m
, true);
1816 /* Reset flags, just in case, for later calls */
1817 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_MOUNT
]) {
1818 Mount
*mount
= MOUNT(u
);
1820 mount
->is_mounted
= mount
->just_mounted
= mount
->just_changed
= false;
1826 manager_dispatch_load_queue(m
);
1828 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_MOUNT
]) {
1829 Mount
*mount
= MOUNT(u
);
1831 if (!mount_is_mounted(mount
)) {
1833 /* A mount point is not around right now. It
1834 * might be gone, or might never have
1837 if (mount
->from_proc_self_mountinfo
&&
1838 mount
->parameters_proc_self_mountinfo
.what
) {
1840 /* Remember that this device might just have disappeared */
1841 if (set_ensure_allocated(&gone
, &path_hash_ops
) < 0 ||
1842 set_put(gone
, mount
->parameters_proc_self_mountinfo
.what
) < 0)
1843 log_oom(); /* we don't care too much about OOM here... */
1846 mount
->from_proc_self_mountinfo
= false;
1848 switch (mount
->state
) {
1851 /* This has just been unmounted by
1852 * somebody else, follow the state
1854 mount
->result
= MOUNT_SUCCESS
; /* make sure we forget any earlier umount failures */
1855 mount_enter_dead(mount
, MOUNT_SUCCESS
);
1862 } else if (mount
->just_mounted
|| mount
->just_changed
) {
1864 /* A mount point was added or changed */
1866 switch (mount
->state
) {
1871 /* This has just been mounted by somebody else, follow the state change, but let's
1872 * generate a new invocation ID for this implicitly and automatically. */
1873 (void) unit_acquire_invocation_id(UNIT(mount
));
1874 mount_enter_mounted(mount
, MOUNT_SUCCESS
);
1877 case MOUNT_MOUNTING
:
1878 mount_set_state(mount
, MOUNT_MOUNTING_DONE
);
1882 /* Nothing really changed, but let's
1883 * issue an notification call
1884 * nonetheless, in case somebody is
1885 * waiting for this. (e.g. file system
1886 * ro/rw remounts.) */
1887 mount_set_state(mount
, mount
->state
);
1892 if (mount_is_mounted(mount
) &&
1893 mount
->from_proc_self_mountinfo
&&
1894 mount
->parameters_proc_self_mountinfo
.what
) {
1896 if (set_ensure_allocated(&around
, &path_hash_ops
) < 0 ||
1897 set_put(around
, mount
->parameters_proc_self_mountinfo
.what
) < 0)
1901 /* Reset the flags for later calls */
1902 mount
->is_mounted
= mount
->just_mounted
= mount
->just_changed
= false;
1905 SET_FOREACH(what
, gone
, i
) {
1906 if (set_contains(around
, what
))
1909 /* Let the device units know that the device is no longer mounted */
1910 (void) device_found_node(m
, what
, false, DEVICE_FOUND_MOUNT
, true);
1916 static void mount_reset_failed(Unit
*u
) {
1917 Mount
*m
= MOUNT(u
);
1921 if (m
->state
== MOUNT_FAILED
)
1922 mount_set_state(m
, MOUNT_DEAD
);
1924 m
->result
= MOUNT_SUCCESS
;
1925 m
->reload_result
= MOUNT_SUCCESS
;
1928 static int mount_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
1929 Mount
*m
= MOUNT(u
);
1933 return unit_kill_common(u
, who
, signo
, -1, MOUNT(u
)->control_pid
, error
);
1936 static int mount_control_pid(Unit
*u
) {
1937 Mount
*m
= MOUNT(u
);
1941 return m
->control_pid
;
1944 static const char* const mount_exec_command_table
[_MOUNT_EXEC_COMMAND_MAX
] = {
1945 [MOUNT_EXEC_MOUNT
] = "ExecMount",
1946 [MOUNT_EXEC_UNMOUNT
] = "ExecUnmount",
1947 [MOUNT_EXEC_REMOUNT
] = "ExecRemount",
1950 DEFINE_STRING_TABLE_LOOKUP(mount_exec_command
, MountExecCommand
);
1952 static const char* const mount_result_table
[_MOUNT_RESULT_MAX
] = {
1953 [MOUNT_SUCCESS
] = "success",
1954 [MOUNT_FAILURE_RESOURCES
] = "resources",
1955 [MOUNT_FAILURE_TIMEOUT
] = "timeout",
1956 [MOUNT_FAILURE_EXIT_CODE
] = "exit-code",
1957 [MOUNT_FAILURE_SIGNAL
] = "signal",
1958 [MOUNT_FAILURE_CORE_DUMP
] = "core-dump",
1959 [MOUNT_FAILURE_START_LIMIT_HIT
] = "start-limit-hit",
1960 [MOUNT_FAILURE_PROTOCOL
] = "protocol",
1963 DEFINE_STRING_TABLE_LOOKUP(mount_result
, MountResult
);
1965 const UnitVTable mount_vtable
= {
1966 .object_size
= sizeof(Mount
),
1967 .exec_context_offset
= offsetof(Mount
, exec_context
),
1968 .cgroup_context_offset
= offsetof(Mount
, cgroup_context
),
1969 .kill_context_offset
= offsetof(Mount
, kill_context
),
1970 .exec_runtime_offset
= offsetof(Mount
, exec_runtime
),
1971 .dynamic_creds_offset
= offsetof(Mount
, dynamic_creds
),
1977 .private_section
= "Mount",
1983 .coldplug
= mount_coldplug
,
1987 .start
= mount_start
,
1989 .reload
= mount_reload
,
1993 .serialize
= mount_serialize
,
1994 .deserialize_item
= mount_deserialize_item
,
1996 .active_state
= mount_active_state
,
1997 .sub_state_to_string
= mount_sub_state_to_string
,
1999 .may_gc
= mount_may_gc
,
2001 .sigchld_event
= mount_sigchld_event
,
2003 .reset_failed
= mount_reset_failed
,
2005 .control_pid
= mount_control_pid
,
2007 .bus_vtable
= bus_mount_vtable
,
2008 .bus_set_property
= bus_mount_set_property
,
2009 .bus_commit_properties
= bus_mount_commit_properties
,
2011 .get_timeout
= mount_get_timeout
,
2013 .can_transient
= true,
2015 .enumerate
= mount_enumerate
,
2016 .shutdown
= mount_shutdown
,
2018 .status_message_formats
= {
2019 .starting_stopping
= {
2020 [0] = "Mounting %s...",
2021 [1] = "Unmounting %s...",
2023 .finished_start_job
= {
2024 [JOB_DONE
] = "Mounted %s.",
2025 [JOB_FAILED
] = "Failed to mount %s.",
2026 [JOB_TIMEOUT
] = "Timed out mounting %s.",
2028 .finished_stop_job
= {
2029 [JOB_DONE
] = "Unmounted %s.",
2030 [JOB_FAILED
] = "Failed unmounting %s.",
2031 [JOB_TIMEOUT
] = "Timed out unmounting %s.",