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>
27 #include "sd-messages.h"
29 #include "alloc-util.h"
30 #include "dbus-mount.h"
32 #include "exit-status.h"
33 #include "formats-util.h"
34 #include "fstab-util.h"
38 #include "mount-setup.h"
39 #include "mount-util.h"
41 #include "parse-util.h"
42 #include "path-util.h"
43 #include "process-util.h"
45 #include "string-table.h"
46 #include "string-util.h"
48 #include "unit-name.h"
51 #define RETRY_UMOUNT_MAX 32
53 DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_table
*, mnt_free_table
);
54 DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_iter
*, mnt_free_iter
);
56 static const UnitActiveState state_translation_table
[_MOUNT_STATE_MAX
] = {
57 [MOUNT_DEAD
] = UNIT_INACTIVE
,
58 [MOUNT_MOUNTING
] = UNIT_ACTIVATING
,
59 [MOUNT_MOUNTING_DONE
] = UNIT_ACTIVE
,
60 [MOUNT_MOUNTED
] = UNIT_ACTIVE
,
61 [MOUNT_REMOUNTING
] = UNIT_RELOADING
,
62 [MOUNT_UNMOUNTING
] = UNIT_DEACTIVATING
,
63 [MOUNT_MOUNTING_SIGTERM
] = UNIT_DEACTIVATING
,
64 [MOUNT_MOUNTING_SIGKILL
] = UNIT_DEACTIVATING
,
65 [MOUNT_REMOUNTING_SIGTERM
] = UNIT_RELOADING
,
66 [MOUNT_REMOUNTING_SIGKILL
] = UNIT_RELOADING
,
67 [MOUNT_UNMOUNTING_SIGTERM
] = UNIT_DEACTIVATING
,
68 [MOUNT_UNMOUNTING_SIGKILL
] = UNIT_DEACTIVATING
,
69 [MOUNT_FAILED
] = UNIT_FAILED
72 static int mount_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
73 static int mount_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
75 static bool mount_needs_network(const char *options
, const char *fstype
) {
76 if (fstab_test_option(options
, "_netdev\0"))
79 if (fstype
&& fstype_is_network(fstype
))
85 static bool mount_is_network(const MountParameters
*p
) {
88 return mount_needs_network(p
->options
, p
->fstype
);
91 static bool mount_is_bind(const MountParameters
*p
) {
94 if (fstab_test_option(p
->options
, "bind\0" "rbind\0"))
97 if (p
->fstype
&& STR_IN_SET(p
->fstype
, "bind", "rbind"))
103 static bool mount_is_auto(const MountParameters
*p
) {
106 return !fstab_test_option(p
->options
, "noauto\0");
109 static bool needs_quota(const MountParameters
*p
) {
112 /* Quotas are not enabled on network filesystems,
113 * but we want them, for example, on storage connected via iscsi */
114 if (p
->fstype
&& fstype_is_network(p
->fstype
))
117 if (mount_is_bind(p
))
120 return fstab_test_option(p
->options
,
121 "usrquota\0" "grpquota\0" "quota\0" "usrjquota\0" "grpjquota\0");
124 static void mount_init(Unit
*u
) {
128 assert(u
->load_state
== UNIT_STUB
);
130 m
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
131 m
->directory_mode
= 0755;
133 if (unit_has_name(u
, "-.mount")) {
134 /* Don't allow start/stop for root directory */
135 u
->refuse_manual_start
= true;
136 u
->refuse_manual_stop
= true;
138 /* The stdio/kmsg bridge socket is on /, in order to avoid a
139 * dep loop, don't use kmsg logging for -.mount */
140 m
->exec_context
.std_output
= u
->manager
->default_std_output
;
141 m
->exec_context
.std_error
= u
->manager
->default_std_error
;
144 /* We need to make sure that /usr/bin/mount is always called
145 * in the same process group as us, so that the autofs kernel
146 * side doesn't send us another mount request while we are
147 * already trying to comply its last one. */
148 m
->exec_context
.same_pgrp
= true;
150 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
152 u
->ignore_on_isolate
= true;
155 static int mount_arm_timer(Mount
*m
, usec_t usec
) {
160 if (m
->timer_event_source
) {
161 r
= sd_event_source_set_time(m
->timer_event_source
, usec
);
165 return sd_event_source_set_enabled(m
->timer_event_source
, SD_EVENT_ONESHOT
);
168 if (usec
== USEC_INFINITY
)
171 r
= sd_event_add_time(
172 UNIT(m
)->manager
->event
,
173 &m
->timer_event_source
,
176 mount_dispatch_timer
, m
);
180 (void) sd_event_source_set_description(m
->timer_event_source
, "mount-timer");
185 static void mount_unwatch_control_pid(Mount
*m
) {
188 if (m
->control_pid
<= 0)
191 unit_unwatch_pid(UNIT(m
), m
->control_pid
);
195 static void mount_parameters_done(MountParameters
*p
) {
202 p
->what
= p
->options
= p
->fstype
= NULL
;
205 static void mount_done(Unit
*u
) {
210 m
->where
= mfree(m
->where
);
212 mount_parameters_done(&m
->parameters_proc_self_mountinfo
);
213 mount_parameters_done(&m
->parameters_fragment
);
215 m
->exec_runtime
= exec_runtime_unref(m
->exec_runtime
);
216 exec_command_done_array(m
->exec_command
, _MOUNT_EXEC_COMMAND_MAX
);
217 m
->control_command
= NULL
;
219 mount_unwatch_control_pid(m
);
221 m
->timer_event_source
= sd_event_source_unref(m
->timer_event_source
);
224 _pure_
static MountParameters
* get_mount_parameters_fragment(Mount
*m
) {
227 if (m
->from_fragment
)
228 return &m
->parameters_fragment
;
233 _pure_
static MountParameters
* get_mount_parameters(Mount
*m
) {
236 if (m
->from_proc_self_mountinfo
)
237 return &m
->parameters_proc_self_mountinfo
;
239 return get_mount_parameters_fragment(m
);
242 static int mount_add_mount_links(Mount
*m
) {
243 _cleanup_free_
char *parent
= NULL
;
252 if (!path_equal(m
->where
, "/")) {
253 /* Adds in links to other mount points that might lie further
254 * up in the hierarchy */
256 parent
= dirname_malloc(m
->where
);
260 r
= unit_require_mounts_for(UNIT(m
), parent
);
265 /* Adds in links to other mount points that might be needed
266 * for the source path (if this is a bind mount) to be
268 pm
= get_mount_parameters_fragment(m
);
269 if (pm
&& pm
->what
&&
270 path_is_absolute(pm
->what
) &&
271 !mount_is_network(pm
)) {
273 r
= unit_require_mounts_for(UNIT(m
), pm
->what
);
278 /* Adds in links to other units that use this path or paths
279 * further down in the hierarchy */
280 s
= manager_get_units_requiring_mounts_for(UNIT(m
)->manager
, m
->where
);
281 SET_FOREACH(other
, s
, i
) {
283 if (other
->load_state
!= UNIT_LOADED
)
286 if (other
== UNIT(m
))
289 r
= unit_add_dependency(other
, UNIT_AFTER
, UNIT(m
), true);
293 if (UNIT(m
)->fragment_path
) {
294 /* If we have fragment configuration, then make this dependency required */
295 r
= unit_add_dependency(other
, UNIT_REQUIRES
, UNIT(m
), true);
304 static int mount_add_device_links(Mount
*m
) {
306 bool device_wants_mount
= false;
311 p
= get_mount_parameters(m
);
318 if (mount_is_bind(p
))
321 if (!is_device_path(p
->what
))
324 /* /dev/root is a really weird thing, it's not a real device,
325 * but just a path the kernel exports for the root file system
326 * specified on the kernel command line. Ignore it here. */
327 if (path_equal(p
->what
, "/dev/root"))
330 if (path_equal(m
->where
, "/"))
333 if (mount_is_auto(p
) && UNIT(m
)->manager
->running_as
== MANAGER_SYSTEM
)
334 device_wants_mount
= true;
336 r
= unit_add_node_link(UNIT(m
), p
->what
, device_wants_mount
, m
->from_fragment
? UNIT_BINDS_TO
: UNIT_REQUIRES
);
343 static int mount_add_quota_links(Mount
*m
) {
349 if (UNIT(m
)->manager
->running_as
!= MANAGER_SYSTEM
)
352 p
= get_mount_parameters_fragment(m
);
359 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_WANTS
, SPECIAL_QUOTACHECK_SERVICE
, NULL
, true);
363 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_WANTS
, SPECIAL_QUOTAON_SERVICE
, NULL
, true);
370 static bool should_umount(Mount
*m
) {
373 if (path_equal(m
->where
, "/") ||
374 path_equal(m
->where
, "/usr"))
377 p
= get_mount_parameters(m
);
378 if (p
&& fstab_test_option(p
->options
, "x-initrd.mount\0") &&
385 static int mount_add_default_dependencies(Mount
*m
) {
392 if (!UNIT(m
)->default_dependencies
)
395 if (UNIT(m
)->manager
->running_as
!= MANAGER_SYSTEM
)
398 /* We do not add any default dependencies to / and /usr, since
399 * they are guaranteed to stay mounted the whole time, since
400 * our system is on it. Also, don't bother with anything
401 * mounted below virtual file systems, it's also going to be
402 * virtual, and hence not worth the effort. */
403 if (path_equal(m
->where
, "/") ||
404 path_equal(m
->where
, "/usr") ||
405 path_startswith(m
->where
, "/proc") ||
406 path_startswith(m
->where
, "/sys") ||
407 path_startswith(m
->where
, "/dev"))
410 p
= get_mount_parameters(m
);
414 if (mount_is_network(p
)) {
415 /* We order ourselves after network.target. This is
416 * primarily useful at shutdown: services that take
417 * down the network should order themselves before
418 * network.target, so that they are shut down only
419 * after this mount unit is stopped. */
421 r
= unit_add_dependency_by_name(UNIT(m
), UNIT_AFTER
, SPECIAL_NETWORK_TARGET
, NULL
, true);
425 /* We pull in network-online.target, and order
426 * ourselves after it. This is useful at start-up to
427 * actively pull in tools that want to be started
428 * before we start mounting network file systems, and
429 * whose purpose it is to delay this until the network
432 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_WANTS
, UNIT_AFTER
, SPECIAL_NETWORK_ONLINE_TARGET
, NULL
, true);
436 after
= SPECIAL_REMOTE_FS_PRE_TARGET
;
438 after
= SPECIAL_LOCAL_FS_PRE_TARGET
;
440 r
= unit_add_dependency_by_name(UNIT(m
), UNIT_AFTER
, after
, NULL
, true);
444 if (should_umount(m
)) {
445 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
453 static int mount_verify(Mount
*m
) {
454 _cleanup_free_
char *e
= NULL
;
459 if (UNIT(m
)->load_state
!= UNIT_LOADED
)
462 if (!m
->from_fragment
&& !m
->from_proc_self_mountinfo
)
465 r
= unit_name_from_path(m
->where
, ".mount", &e
);
467 return log_unit_error_errno(UNIT(m
), r
, "Failed to generate unit name from mount path: %m");
469 if (!unit_has_name(UNIT(m
), e
)) {
470 log_unit_error(UNIT(m
), "Where= setting doesn't match unit name. Refusing.");
474 if (mount_point_is_api(m
->where
) || mount_point_ignore(m
->where
)) {
475 log_unit_error(UNIT(m
), "Cannot create mount unit for API file system %s. Refusing.", m
->where
);
479 if (UNIT(m
)->fragment_path
&& !m
->parameters_fragment
.what
) {
480 log_unit_error(UNIT(m
), "What= setting is missing. Refusing.");
484 if (m
->exec_context
.pam_name
&& m
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
485 log_unit_error(UNIT(m
), "Unit has PAM enabled. Kill mode must be set to control-group'. Refusing.");
492 static int mount_add_extras(Mount
*m
) {
498 if (u
->fragment_path
)
499 m
->from_fragment
= true;
502 r
= unit_name_to_path(u
->id
, &m
->where
);
507 path_kill_slashes(m
->where
);
509 if (!u
->description
) {
510 r
= unit_set_description(u
, m
->where
);
515 r
= mount_add_device_links(m
);
519 r
= mount_add_mount_links(m
);
523 r
= mount_add_quota_links(m
);
527 r
= unit_patch_contexts(u
);
531 r
= unit_add_exec_dependencies(u
, &m
->exec_context
);
535 r
= unit_set_default_slice(u
);
539 r
= mount_add_default_dependencies(m
);
546 static int mount_load(Unit
*u
) {
551 assert(u
->load_state
== UNIT_STUB
);
553 if (m
->from_proc_self_mountinfo
)
554 r
= unit_load_fragment_and_dropin_optional(u
);
556 r
= unit_load_fragment_and_dropin(u
);
561 /* This is a new unit? Then let's add in some extras */
562 if (u
->load_state
== UNIT_LOADED
) {
563 r
= mount_add_extras(m
);
568 return mount_verify(m
);
571 static int mount_notify_automount(Mount
*m
, MountState old_state
, MountState state
) {
578 SET_FOREACH(p
, UNIT(m
)->dependencies
[UNIT_TRIGGERED_BY
], i
)
579 if (p
->type
== UNIT_AUTOMOUNT
) {
580 r
= automount_update_mount(AUTOMOUNT(p
), old_state
, state
);
588 static void mount_set_state(Mount
*m
, MountState state
) {
589 MountState old_state
;
592 old_state
= m
->state
;
595 if (state
!= MOUNT_MOUNTING
&&
596 state
!= MOUNT_MOUNTING_DONE
&&
597 state
!= MOUNT_REMOUNTING
&&
598 state
!= MOUNT_UNMOUNTING
&&
599 state
!= MOUNT_MOUNTING_SIGTERM
&&
600 state
!= MOUNT_MOUNTING_SIGKILL
&&
601 state
!= MOUNT_UNMOUNTING_SIGTERM
&&
602 state
!= MOUNT_UNMOUNTING_SIGKILL
&&
603 state
!= MOUNT_REMOUNTING_SIGTERM
&&
604 state
!= MOUNT_REMOUNTING_SIGKILL
) {
605 m
->timer_event_source
= sd_event_source_unref(m
->timer_event_source
);
606 mount_unwatch_control_pid(m
);
607 m
->control_command
= NULL
;
608 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
611 mount_notify_automount(m
, old_state
, state
);
613 if (state
!= old_state
)
614 log_unit_debug(UNIT(m
), "Changed %s -> %s", mount_state_to_string(old_state
), mount_state_to_string(state
));
616 unit_notify(UNIT(m
), state_translation_table
[old_state
], state_translation_table
[state
], m
->reload_result
== MOUNT_SUCCESS
);
617 m
->reload_result
= MOUNT_SUCCESS
;
620 static int mount_coldplug(Unit
*u
) {
622 MountState new_state
= MOUNT_DEAD
;
626 assert(m
->state
== MOUNT_DEAD
);
628 if (m
->deserialized_state
!= m
->state
)
629 new_state
= m
->deserialized_state
;
630 else if (m
->from_proc_self_mountinfo
)
631 new_state
= MOUNT_MOUNTED
;
633 if (new_state
== m
->state
)
636 if (m
->control_pid
> 0 &&
637 pid_is_unwaited(m
->control_pid
) &&
643 MOUNT_MOUNTING_SIGTERM
,
644 MOUNT_MOUNTING_SIGKILL
,
645 MOUNT_UNMOUNTING_SIGTERM
,
646 MOUNT_UNMOUNTING_SIGKILL
,
647 MOUNT_REMOUNTING_SIGTERM
,
648 MOUNT_REMOUNTING_SIGKILL
)) {
650 r
= unit_watch_pid(UNIT(m
), m
->control_pid
);
654 r
= mount_arm_timer(m
, usec_add(u
->state_change_timestamp
.monotonic
, m
->timeout_usec
));
659 mount_set_state(m
, new_state
);
663 static void mount_dump(Unit
*u
, FILE *f
, const char *prefix
) {
670 p
= get_mount_parameters(m
);
673 "%sMount State: %s\n"
677 "%sFile System Type: %s\n"
679 "%sFrom /proc/self/mountinfo: %s\n"
680 "%sFrom fragment: %s\n"
681 "%sDirectoryMode: %04o\n",
682 prefix
, mount_state_to_string(m
->state
),
683 prefix
, mount_result_to_string(m
->result
),
685 prefix
, p
? strna(p
->what
) : "n/a",
686 prefix
, p
? strna(p
->fstype
) : "n/a",
687 prefix
, p
? strna(p
->options
) : "n/a",
688 prefix
, yes_no(m
->from_proc_self_mountinfo
),
689 prefix
, yes_no(m
->from_fragment
),
690 prefix
, m
->directory_mode
);
692 if (m
->control_pid
> 0)
694 "%sControl PID: "PID_FMT
"\n",
695 prefix
, m
->control_pid
);
697 exec_context_dump(&m
->exec_context
, f
, prefix
);
698 kill_context_dump(&m
->kill_context
, f
, prefix
);
701 static int mount_spawn(Mount
*m
, ExecCommand
*c
, pid_t
*_pid
) {
704 ExecParameters exec_params
= {
705 .apply_permissions
= true,
706 .apply_chroot
= true,
707 .apply_tty_stdin
= true,
708 .bus_endpoint_fd
= -1,
718 (void) unit_realize_cgroup(UNIT(m
));
719 if (m
->reset_cpu_usage
) {
720 (void) unit_reset_cpu_usage(UNIT(m
));
721 m
->reset_cpu_usage
= false;
724 r
= unit_setup_exec_runtime(UNIT(m
));
728 r
= mount_arm_timer(m
, usec_add(now(CLOCK_MONOTONIC
), m
->timeout_usec
));
732 exec_params
.environment
= UNIT(m
)->manager
->environment
;
733 exec_params
.confirm_spawn
= UNIT(m
)->manager
->confirm_spawn
;
734 exec_params
.cgroup_supported
= UNIT(m
)->manager
->cgroup_supported
;
735 exec_params
.cgroup_path
= UNIT(m
)->cgroup_path
;
736 exec_params
.cgroup_delegate
= m
->cgroup_context
.delegate
;
737 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(m
)->manager
);
739 r
= exec_spawn(UNIT(m
),
748 r
= unit_watch_pid(UNIT(m
), pid
);
750 /* FIXME: we need to do something here */
758 static void mount_enter_dead(Mount
*m
, MountResult f
) {
761 if (f
!= MOUNT_SUCCESS
)
764 exec_runtime_destroy(m
->exec_runtime
);
765 m
->exec_runtime
= exec_runtime_unref(m
->exec_runtime
);
767 exec_context_destroy_runtime_directory(&m
->exec_context
, manager_get_runtime_prefix(UNIT(m
)->manager
));
769 mount_set_state(m
, m
->result
!= MOUNT_SUCCESS
? MOUNT_FAILED
: MOUNT_DEAD
);
772 static void mount_enter_mounted(Mount
*m
, MountResult f
) {
775 if (f
!= MOUNT_SUCCESS
)
778 mount_set_state(m
, MOUNT_MOUNTED
);
781 static void mount_enter_signal(Mount
*m
, MountState state
, MountResult f
) {
786 if (f
!= MOUNT_SUCCESS
)
789 r
= unit_kill_context(
792 (state
!= MOUNT_MOUNTING_SIGTERM
&& state
!= MOUNT_UNMOUNTING_SIGTERM
&& state
!= MOUNT_REMOUNTING_SIGTERM
) ?
793 KILL_KILL
: KILL_TERMINATE
,
801 r
= mount_arm_timer(m
, usec_add(now(CLOCK_MONOTONIC
), m
->timeout_usec
));
805 mount_set_state(m
, state
);
806 } else if (state
== MOUNT_REMOUNTING_SIGTERM
)
807 mount_enter_signal(m
, MOUNT_REMOUNTING_SIGKILL
, MOUNT_SUCCESS
);
808 else if (state
== MOUNT_REMOUNTING_SIGKILL
)
809 mount_enter_mounted(m
, MOUNT_SUCCESS
);
810 else if (state
== MOUNT_MOUNTING_SIGTERM
)
811 mount_enter_signal(m
, MOUNT_MOUNTING_SIGKILL
, MOUNT_SUCCESS
);
812 else if (state
== MOUNT_UNMOUNTING_SIGTERM
)
813 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGKILL
, MOUNT_SUCCESS
);
815 mount_enter_dead(m
, MOUNT_SUCCESS
);
820 log_unit_warning_errno(UNIT(m
), r
, "Failed to kill processes: %m");
822 if (state
== MOUNT_REMOUNTING_SIGTERM
|| state
== MOUNT_REMOUNTING_SIGKILL
)
823 mount_enter_mounted(m
, MOUNT_FAILURE_RESOURCES
);
825 mount_enter_dead(m
, MOUNT_FAILURE_RESOURCES
);
828 static void mount_enter_unmounting(Mount
*m
) {
833 /* Start counting our attempts */
834 if (!IN_SET(m
->state
,
836 MOUNT_UNMOUNTING_SIGTERM
,
837 MOUNT_UNMOUNTING_SIGKILL
))
838 m
->n_retry_umount
= 0;
840 m
->control_command_id
= MOUNT_EXEC_UNMOUNT
;
841 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_UNMOUNT
;
843 r
= exec_command_set(m
->control_command
, UMOUNT_PATH
, m
->where
, NULL
);
847 mount_unwatch_control_pid(m
);
849 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
853 mount_set_state(m
, MOUNT_UNMOUNTING
);
858 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'umount' task: %m");
859 mount_enter_mounted(m
, MOUNT_FAILURE_RESOURCES
);
862 static int mount_get_opts(Mount
*m
, char **ret
) {
863 return fstab_filter_options(m
->parameters_fragment
.options
,
864 "nofail\0" "noauto\0" "auto\0", NULL
, NULL
, ret
);
867 static void mount_enter_mounting(Mount
*m
) {
873 m
->control_command_id
= MOUNT_EXEC_MOUNT
;
874 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_MOUNT
;
876 r
= unit_fail_if_symlink(UNIT(m
), m
->where
);
880 (void) mkdir_p_label(m
->where
, m
->directory_mode
);
882 unit_warn_if_dir_nonempty(UNIT(m
), m
->where
);
884 /* Create the source directory for bind-mounts if needed */
885 p
= get_mount_parameters_fragment(m
);
886 if (p
&& mount_is_bind(p
))
887 (void) mkdir_p_label(p
->what
, m
->directory_mode
);
889 if (m
->from_fragment
) {
890 _cleanup_free_
char *opts
= NULL
;
892 r
= mount_get_opts(m
, &opts
);
896 r
= exec_command_set(m
->control_command
, MOUNT_PATH
,
897 m
->parameters_fragment
.what
, m
->where
, NULL
);
898 if (r
>= 0 && m
->sloppy_options
)
899 r
= exec_command_append(m
->control_command
, "-s", NULL
);
900 if (r
>= 0 && m
->parameters_fragment
.fstype
)
901 r
= exec_command_append(m
->control_command
, "-t", m
->parameters_fragment
.fstype
, NULL
);
902 if (r
>= 0 && !isempty(opts
))
903 r
= exec_command_append(m
->control_command
, "-o", opts
, NULL
);
910 mount_unwatch_control_pid(m
);
912 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
916 mount_set_state(m
, MOUNT_MOUNTING
);
921 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'mount' task: %m");
922 mount_enter_dead(m
, MOUNT_FAILURE_RESOURCES
);
925 static void mount_enter_remounting(Mount
*m
) {
930 m
->control_command_id
= MOUNT_EXEC_REMOUNT
;
931 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_REMOUNT
;
933 if (m
->from_fragment
) {
936 if (m
->parameters_fragment
.options
)
937 o
= strjoina("remount,", m
->parameters_fragment
.options
);
941 r
= exec_command_set(m
->control_command
, MOUNT_PATH
,
942 m
->parameters_fragment
.what
, m
->where
,
944 if (r
>= 0 && m
->sloppy_options
)
945 r
= exec_command_append(m
->control_command
, "-s", NULL
);
946 if (r
>= 0 && m
->parameters_fragment
.fstype
)
947 r
= exec_command_append(m
->control_command
, "-t", m
->parameters_fragment
.fstype
, NULL
);
954 mount_unwatch_control_pid(m
);
956 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
960 mount_set_state(m
, MOUNT_REMOUNTING
);
965 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'remount' task: %m");
966 m
->reload_result
= MOUNT_FAILURE_RESOURCES
;
967 mount_enter_mounted(m
, MOUNT_SUCCESS
);
970 static int mount_start(Unit
*u
) {
975 /* We cannot fulfill this request right now, try again later
977 if (m
->state
== MOUNT_UNMOUNTING
||
978 m
->state
== MOUNT_UNMOUNTING_SIGTERM
||
979 m
->state
== MOUNT_UNMOUNTING_SIGKILL
||
980 m
->state
== MOUNT_MOUNTING_SIGTERM
||
981 m
->state
== MOUNT_MOUNTING_SIGKILL
)
985 if (m
->state
== MOUNT_MOUNTING
)
988 assert(m
->state
== MOUNT_DEAD
|| m
->state
== MOUNT_FAILED
);
990 m
->result
= MOUNT_SUCCESS
;
991 m
->reload_result
= MOUNT_SUCCESS
;
992 m
->reset_cpu_usage
= true;
994 mount_enter_mounting(m
);
998 static int mount_stop(Unit
*u
) {
1004 if (m
->state
== MOUNT_UNMOUNTING
||
1005 m
->state
== MOUNT_UNMOUNTING_SIGKILL
||
1006 m
->state
== MOUNT_UNMOUNTING_SIGTERM
||
1007 m
->state
== MOUNT_MOUNTING_SIGTERM
||
1008 m
->state
== MOUNT_MOUNTING_SIGKILL
)
1011 assert(m
->state
== MOUNT_MOUNTING
||
1012 m
->state
== MOUNT_MOUNTING_DONE
||
1013 m
->state
== MOUNT_MOUNTED
||
1014 m
->state
== MOUNT_REMOUNTING
||
1015 m
->state
== MOUNT_REMOUNTING_SIGTERM
||
1016 m
->state
== MOUNT_REMOUNTING_SIGKILL
);
1018 mount_enter_unmounting(m
);
1022 static int mount_reload(Unit
*u
) {
1023 Mount
*m
= MOUNT(u
);
1027 if (m
->state
== MOUNT_MOUNTING_DONE
)
1030 assert(m
->state
== MOUNT_MOUNTED
);
1032 mount_enter_remounting(m
);
1036 static int mount_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
1037 Mount
*m
= MOUNT(u
);
1043 unit_serialize_item(u
, f
, "state", mount_state_to_string(m
->state
));
1044 unit_serialize_item(u
, f
, "result", mount_result_to_string(m
->result
));
1045 unit_serialize_item(u
, f
, "reload-result", mount_result_to_string(m
->reload_result
));
1047 if (m
->control_pid
> 0)
1048 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, m
->control_pid
);
1050 if (m
->control_command_id
>= 0)
1051 unit_serialize_item(u
, f
, "control-command", mount_exec_command_to_string(m
->control_command_id
));
1056 static int mount_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
1057 Mount
*m
= MOUNT(u
);
1064 if (streq(key
, "state")) {
1067 if ((state
= mount_state_from_string(value
)) < 0)
1068 log_unit_debug(u
, "Failed to parse state value: %s", value
);
1070 m
->deserialized_state
= state
;
1071 } else if (streq(key
, "result")) {
1074 f
= mount_result_from_string(value
);
1076 log_unit_debug(u
, "Failed to parse result value: %s", value
);
1077 else if (f
!= MOUNT_SUCCESS
)
1080 } else if (streq(key
, "reload-result")) {
1083 f
= mount_result_from_string(value
);
1085 log_unit_debug(u
, "Failed to parse reload result value: %s", value
);
1086 else if (f
!= MOUNT_SUCCESS
)
1087 m
->reload_result
= f
;
1089 } else if (streq(key
, "control-pid")) {
1092 if (parse_pid(value
, &pid
) < 0)
1093 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
1095 m
->control_pid
= pid
;
1096 } else if (streq(key
, "control-command")) {
1097 MountExecCommand id
;
1099 id
= mount_exec_command_from_string(value
);
1101 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
1103 m
->control_command_id
= id
;
1104 m
->control_command
= m
->exec_command
+ id
;
1107 log_unit_debug(u
, "Unknown serialization key: %s", key
);
1112 _pure_
static UnitActiveState
mount_active_state(Unit
*u
) {
1115 return state_translation_table
[MOUNT(u
)->state
];
1118 _pure_
static const char *mount_sub_state_to_string(Unit
*u
) {
1121 return mount_state_to_string(MOUNT(u
)->state
);
1124 _pure_
static bool mount_check_gc(Unit
*u
) {
1125 Mount
*m
= MOUNT(u
);
1129 return m
->from_proc_self_mountinfo
;
1132 static void mount_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
1133 Mount
*m
= MOUNT(u
);
1139 if (pid
!= m
->control_pid
)
1144 if (is_clean_exit(code
, status
, NULL
))
1146 else if (code
== CLD_EXITED
)
1147 f
= MOUNT_FAILURE_EXIT_CODE
;
1148 else if (code
== CLD_KILLED
)
1149 f
= MOUNT_FAILURE_SIGNAL
;
1150 else if (code
== CLD_DUMPED
)
1151 f
= MOUNT_FAILURE_CORE_DUMP
;
1153 assert_not_reached("Unknown code");
1155 if (f
!= MOUNT_SUCCESS
)
1158 if (m
->control_command
) {
1159 exec_status_exit(&m
->control_command
->exec_status
, &m
->exec_context
, pid
, code
, status
);
1161 m
->control_command
= NULL
;
1162 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
1165 log_unit_full(u
, f
== MOUNT_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
1166 "Mount process exited, code=%s status=%i", sigchld_code_to_string(code
), status
);
1168 /* Note that mount(8) returning and the kernel sending us a
1169 * mount table change event might happen out-of-order. If an
1170 * operation succeed we assume the kernel will follow soon too
1171 * and already change into the resulting state. If it fails
1172 * we check if the kernel still knows about the mount. and
1173 * change state accordingly. */
1177 case MOUNT_MOUNTING
:
1178 case MOUNT_MOUNTING_DONE
:
1179 case MOUNT_MOUNTING_SIGKILL
:
1180 case MOUNT_MOUNTING_SIGTERM
:
1182 if (f
== MOUNT_SUCCESS
)
1183 mount_enter_mounted(m
, f
);
1184 else if (m
->from_proc_self_mountinfo
)
1185 mount_enter_mounted(m
, f
);
1187 mount_enter_dead(m
, f
);
1190 case MOUNT_REMOUNTING
:
1191 case MOUNT_REMOUNTING_SIGKILL
:
1192 case MOUNT_REMOUNTING_SIGTERM
:
1194 m
->reload_result
= f
;
1195 if (m
->from_proc_self_mountinfo
)
1196 mount_enter_mounted(m
, MOUNT_SUCCESS
);
1198 mount_enter_dead(m
, MOUNT_SUCCESS
);
1202 case MOUNT_UNMOUNTING
:
1203 case MOUNT_UNMOUNTING_SIGKILL
:
1204 case MOUNT_UNMOUNTING_SIGTERM
:
1206 if (f
== MOUNT_SUCCESS
) {
1208 if (m
->from_proc_self_mountinfo
) {
1210 /* Still a mount point? If so, let's
1211 * try again. Most likely there were
1212 * multiple mount points stacked on
1213 * top of each other. Note that due to
1214 * the io event priority logic we can
1215 * be sure the new mountinfo is loaded
1216 * before we process the SIGCHLD for
1217 * the mount command. */
1219 if (m
->n_retry_umount
< RETRY_UMOUNT_MAX
) {
1220 log_unit_debug(u
, "Mount still present, trying again.");
1221 m
->n_retry_umount
++;
1222 mount_enter_unmounting(m
);
1224 log_unit_debug(u
, "Mount still present after %u attempts to unmount, giving up.", m
->n_retry_umount
);
1225 mount_enter_mounted(m
, f
);
1228 mount_enter_dead(m
, f
);
1230 } else if (m
->from_proc_self_mountinfo
)
1231 mount_enter_mounted(m
, f
);
1233 mount_enter_dead(m
, f
);
1237 assert_not_reached("Uh, control process died at wrong time.");
1240 /* Notify clients about changed exit status */
1241 unit_add_to_dbus_queue(u
);
1244 static int mount_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
1245 Mount
*m
= MOUNT(userdata
);
1248 assert(m
->timer_event_source
== source
);
1252 case MOUNT_MOUNTING
:
1253 case MOUNT_MOUNTING_DONE
:
1254 log_unit_warning(UNIT(m
), "Mounting timed out. Stopping.");
1255 mount_enter_signal(m
, MOUNT_MOUNTING_SIGTERM
, MOUNT_FAILURE_TIMEOUT
);
1258 case MOUNT_REMOUNTING
:
1259 log_unit_warning(UNIT(m
), "Remounting timed out. Stopping.");
1260 m
->reload_result
= MOUNT_FAILURE_TIMEOUT
;
1261 mount_enter_mounted(m
, MOUNT_SUCCESS
);
1264 case MOUNT_UNMOUNTING
:
1265 log_unit_warning(UNIT(m
), "Unmounting timed out. Stopping.");
1266 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGTERM
, MOUNT_FAILURE_TIMEOUT
);
1269 case MOUNT_MOUNTING_SIGTERM
:
1270 if (m
->kill_context
.send_sigkill
) {
1271 log_unit_warning(UNIT(m
), "Mounting timed out. Killing.");
1272 mount_enter_signal(m
, MOUNT_MOUNTING_SIGKILL
, MOUNT_FAILURE_TIMEOUT
);
1274 log_unit_warning(UNIT(m
), "Mounting timed out. Skipping SIGKILL. Ignoring.");
1276 if (m
->from_proc_self_mountinfo
)
1277 mount_enter_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1279 mount_enter_dead(m
, MOUNT_FAILURE_TIMEOUT
);
1283 case MOUNT_REMOUNTING_SIGTERM
:
1284 if (m
->kill_context
.send_sigkill
) {
1285 log_unit_warning(UNIT(m
), "Remounting timed out. Killing.");
1286 mount_enter_signal(m
, MOUNT_REMOUNTING_SIGKILL
, MOUNT_FAILURE_TIMEOUT
);
1288 log_unit_warning(UNIT(m
), "Remounting timed out. Skipping SIGKILL. Ignoring.");
1290 if (m
->from_proc_self_mountinfo
)
1291 mount_enter_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1293 mount_enter_dead(m
, MOUNT_FAILURE_TIMEOUT
);
1297 case MOUNT_UNMOUNTING_SIGTERM
:
1298 if (m
->kill_context
.send_sigkill
) {
1299 log_unit_warning(UNIT(m
), "Unmounting timed out. Killing.");
1300 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGKILL
, MOUNT_FAILURE_TIMEOUT
);
1302 log_unit_warning(UNIT(m
), "Unmounting timed out. Skipping SIGKILL. Ignoring.");
1304 if (m
->from_proc_self_mountinfo
)
1305 mount_enter_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1307 mount_enter_dead(m
, MOUNT_FAILURE_TIMEOUT
);
1311 case MOUNT_MOUNTING_SIGKILL
:
1312 case MOUNT_REMOUNTING_SIGKILL
:
1313 case MOUNT_UNMOUNTING_SIGKILL
:
1314 log_unit_warning(UNIT(m
),"Mount process still around after SIGKILL. Ignoring.");
1316 if (m
->from_proc_self_mountinfo
)
1317 mount_enter_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1319 mount_enter_dead(m
, MOUNT_FAILURE_TIMEOUT
);
1323 assert_not_reached("Timeout at wrong time.");
1329 static int mount_setup_unit(
1333 const char *options
,
1337 _cleanup_free_
char *e
= NULL
, *w
= NULL
, *o
= NULL
, *f
= NULL
;
1338 bool load_extras
= false;
1340 bool delete, changed
= false;
1350 /* Ignore API mount points. They should never be referenced in
1351 * dependencies ever. */
1352 if (mount_point_is_api(where
) || mount_point_ignore(where
))
1355 if (streq(fstype
, "autofs"))
1358 /* probably some kind of swap, ignore */
1359 if (!is_path(where
))
1362 r
= unit_name_from_path(where
, ".mount", &e
);
1366 u
= manager_get_unit(m
, e
);
1370 u
= unit_new(m
, sizeof(Mount
));
1374 r
= unit_add_name(u
, e
);
1378 MOUNT(u
)->where
= strdup(where
);
1379 if (!MOUNT(u
)->where
) {
1384 u
->source_path
= strdup("/proc/self/mountinfo");
1385 if (!u
->source_path
) {
1390 if (m
->running_as
== MANAGER_SYSTEM
) {
1393 target
= mount_needs_network(options
, fstype
) ? SPECIAL_REMOTE_FS_TARGET
: SPECIAL_LOCAL_FS_TARGET
;
1394 r
= unit_add_dependency_by_name(u
, UNIT_BEFORE
, target
, NULL
, true);
1398 if (should_umount(MOUNT(u
))) {
1399 r
= unit_add_dependency_by_name(u
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
1405 unit_add_to_load_queue(u
);
1410 if (!MOUNT(u
)->where
) {
1411 MOUNT(u
)->where
= strdup(where
);
1412 if (!MOUNT(u
)->where
) {
1418 if (m
->running_as
== MANAGER_SYSTEM
&&
1419 mount_needs_network(options
, fstype
)) {
1420 /* _netdev option may have shown up late, or on a
1421 * remount. Add remote-fs dependencies, even though
1422 * local-fs ones may already be there. */
1423 unit_add_dependency_by_name(u
, UNIT_BEFORE
, SPECIAL_REMOTE_FS_TARGET
, NULL
, true);
1427 if (u
->load_state
== UNIT_NOT_FOUND
) {
1428 u
->load_state
= UNIT_LOADED
;
1431 /* Load in the extras later on, after we
1432 * finished initialization of the unit */
1439 o
= strdup(options
);
1441 if (!w
|| !o
|| !f
) {
1446 p
= &MOUNT(u
)->parameters_proc_self_mountinfo
;
1448 changed
= changed
||
1449 !streq_ptr(p
->options
, options
) ||
1450 !streq_ptr(p
->what
, what
) ||
1451 !streq_ptr(p
->fstype
, fstype
);
1454 MOUNT(u
)->is_mounted
= true;
1455 MOUNT(u
)->just_mounted
= !MOUNT(u
)->from_proc_self_mountinfo
;
1456 MOUNT(u
)->just_changed
= changed
;
1459 MOUNT(u
)->from_proc_self_mountinfo
= true;
1474 r
= mount_add_extras(MOUNT(u
));
1480 unit_add_to_dbus_queue(u
);
1485 log_warning_errno(r
, "Failed to set up mount unit: %m");
1493 static int mount_load_proc_self_mountinfo(Manager
*m
, bool set_flags
) {
1494 _cleanup_(mnt_free_tablep
) struct libmnt_table
*t
= NULL
;
1495 _cleanup_(mnt_free_iterp
) struct libmnt_iter
*i
= NULL
;
1500 t
= mnt_new_table();
1504 i
= mnt_new_iter(MNT_ITER_FORWARD
);
1508 r
= mnt_table_parse_mtab(t
, NULL
);
1510 return log_error_errno(r
, "Failed to parse /proc/self/mountinfo: %m");
1514 const char *device
, *path
, *options
, *fstype
;
1515 _cleanup_free_
char *d
= NULL
, *p
= NULL
;
1516 struct libmnt_fs
*fs
;
1519 k
= mnt_table_next_fs(t
, i
, &fs
);
1523 return log_error_errno(k
, "Failed to get next entry from /proc/self/mountinfo: %m");
1525 device
= mnt_fs_get_source(fs
);
1526 path
= mnt_fs_get_target(fs
);
1527 options
= mnt_fs_get_options(fs
);
1528 fstype
= mnt_fs_get_fstype(fs
);
1530 if (!device
|| !path
)
1533 if (cunescape(device
, UNESCAPE_RELAX
, &d
) < 0)
1536 if (cunescape(path
, UNESCAPE_RELAX
, &p
) < 0)
1539 (void) device_found_node(m
, d
, true, DEVICE_FOUND_MOUNT
, set_flags
);
1541 k
= mount_setup_unit(m
, d
, p
, options
, fstype
, set_flags
);
1542 if (r
== 0 && k
< 0)
1549 static void mount_shutdown(Manager
*m
) {
1553 m
->mount_event_source
= sd_event_source_unref(m
->mount_event_source
);
1555 mnt_unref_monitor(m
->mount_monitor
);
1556 m
->mount_monitor
= NULL
;
1559 static int mount_get_timeout(Unit
*u
, uint64_t *timeout
) {
1560 Mount
*m
= MOUNT(u
);
1563 if (!m
->timer_event_source
)
1566 r
= sd_event_source_get_time(m
->timer_event_source
, timeout
);
1573 static void mount_enumerate(Manager
*m
) {
1580 if (!m
->mount_monitor
) {
1583 m
->mount_monitor
= mnt_new_monitor();
1584 if (!m
->mount_monitor
) {
1589 r
= mnt_monitor_enable_kernel(m
->mount_monitor
, 1);
1591 log_error_errno(r
, "Failed to enable watching of kernel mount events: %m");
1595 r
= mnt_monitor_enable_userspace(m
->mount_monitor
, 1, NULL
);
1597 log_error_errno(r
, "Failed to enable watching of userspace mount events: %m");
1601 /* mnt_unref_monitor() will close the fd */
1602 fd
= r
= mnt_monitor_get_fd(m
->mount_monitor
);
1604 log_error_errno(r
, "Failed to acquire watch file descriptor: %m");
1608 r
= sd_event_add_io(m
->event
, &m
->mount_event_source
, fd
, EPOLLIN
, mount_dispatch_io
, m
);
1610 log_error_errno(r
, "Failed to watch mount file descriptor: %m");
1614 r
= sd_event_source_set_priority(m
->mount_event_source
, -10);
1616 log_error_errno(r
, "Failed to adjust mount watch priority: %m");
1620 (void) sd_event_source_set_description(m
->mount_event_source
, "mount-monitor-dispatch");
1623 r
= mount_load_proc_self_mountinfo(m
, false);
1633 static int mount_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1634 _cleanup_set_free_ Set
*around
= NULL
, *gone
= NULL
;
1635 Manager
*m
= userdata
;
1642 assert(revents
& EPOLLIN
);
1644 if (fd
== mnt_monitor_get_fd(m
->mount_monitor
)) {
1645 bool rescan
= false;
1647 /* Drain all events and verify that the event is valid.
1649 * Note that libmount also monitors /run/mount mkdir if the
1650 * directory does not exist yet. The mkdir may generate event
1651 * which is irrelevant for us.
1653 * error: r < 0; valid: r == 0, false positive: rc == 1 */
1655 r
= mnt_monitor_next_change(m
->mount_monitor
, NULL
, NULL
);
1659 return log_error_errno(r
, "Failed to drain libmount events");
1662 log_debug("libmount event [rescan: %s]", yes_no(rescan
));
1667 r
= mount_load_proc_self_mountinfo(m
, true);
1669 /* Reset flags, just in case, for later calls */
1670 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_MOUNT
]) {
1671 Mount
*mount
= MOUNT(u
);
1673 mount
->is_mounted
= mount
->just_mounted
= mount
->just_changed
= false;
1679 manager_dispatch_load_queue(m
);
1681 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_MOUNT
]) {
1682 Mount
*mount
= MOUNT(u
);
1684 if (!mount
->is_mounted
) {
1686 /* A mount point is not around right now. It
1687 * might be gone, or might never have
1690 if (mount
->from_proc_self_mountinfo
&&
1691 mount
->parameters_proc_self_mountinfo
.what
) {
1693 /* Remember that this device might just have disappeared */
1694 if (set_ensure_allocated(&gone
, &string_hash_ops
) < 0 ||
1695 set_put(gone
, mount
->parameters_proc_self_mountinfo
.what
) < 0)
1696 log_oom(); /* we don't care too much about OOM here... */
1699 mount
->from_proc_self_mountinfo
= false;
1701 switch (mount
->state
) {
1704 /* This has just been unmounted by
1705 * somebody else, follow the state
1707 mount_enter_dead(mount
, MOUNT_SUCCESS
);
1714 } else if (mount
->just_mounted
|| mount
->just_changed
) {
1716 /* A mount point was added or changed */
1718 switch (mount
->state
) {
1722 /* This has just been mounted by
1723 * somebody else, follow the state
1725 mount_enter_mounted(mount
, MOUNT_SUCCESS
);
1728 case MOUNT_MOUNTING
:
1729 mount_set_state(mount
, MOUNT_MOUNTING_DONE
);
1733 /* Nothing really changed, but let's
1734 * issue an notification call
1735 * nonetheless, in case somebody is
1736 * waiting for this. (e.g. file system
1737 * ro/rw remounts.) */
1738 mount_set_state(mount
, mount
->state
);
1743 if (mount
->is_mounted
&&
1744 mount
->from_proc_self_mountinfo
&&
1745 mount
->parameters_proc_self_mountinfo
.what
) {
1747 if (set_ensure_allocated(&around
, &string_hash_ops
) < 0 ||
1748 set_put(around
, mount
->parameters_proc_self_mountinfo
.what
) < 0)
1752 /* Reset the flags for later calls */
1753 mount
->is_mounted
= mount
->just_mounted
= mount
->just_changed
= false;
1756 SET_FOREACH(what
, gone
, i
) {
1757 if (set_contains(around
, what
))
1760 /* Let the device units know that the device is no longer mounted */
1761 (void) device_found_node(m
, what
, false, DEVICE_FOUND_MOUNT
, true);
1767 static void mount_reset_failed(Unit
*u
) {
1768 Mount
*m
= MOUNT(u
);
1772 if (m
->state
== MOUNT_FAILED
)
1773 mount_set_state(m
, MOUNT_DEAD
);
1775 m
->result
= MOUNT_SUCCESS
;
1776 m
->reload_result
= MOUNT_SUCCESS
;
1779 static int mount_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
1780 return unit_kill_common(u
, who
, signo
, -1, MOUNT(u
)->control_pid
, error
);
1783 static const char* const mount_exec_command_table
[_MOUNT_EXEC_COMMAND_MAX
] = {
1784 [MOUNT_EXEC_MOUNT
] = "ExecMount",
1785 [MOUNT_EXEC_UNMOUNT
] = "ExecUnmount",
1786 [MOUNT_EXEC_REMOUNT
] = "ExecRemount",
1789 DEFINE_STRING_TABLE_LOOKUP(mount_exec_command
, MountExecCommand
);
1791 static const char* const mount_result_table
[_MOUNT_RESULT_MAX
] = {
1792 [MOUNT_SUCCESS
] = "success",
1793 [MOUNT_FAILURE_RESOURCES
] = "resources",
1794 [MOUNT_FAILURE_TIMEOUT
] = "timeout",
1795 [MOUNT_FAILURE_EXIT_CODE
] = "exit-code",
1796 [MOUNT_FAILURE_SIGNAL
] = "signal",
1797 [MOUNT_FAILURE_CORE_DUMP
] = "core-dump"
1800 DEFINE_STRING_TABLE_LOOKUP(mount_result
, MountResult
);
1802 const UnitVTable mount_vtable
= {
1803 .object_size
= sizeof(Mount
),
1804 .exec_context_offset
= offsetof(Mount
, exec_context
),
1805 .cgroup_context_offset
= offsetof(Mount
, cgroup_context
),
1806 .kill_context_offset
= offsetof(Mount
, kill_context
),
1807 .exec_runtime_offset
= offsetof(Mount
, exec_runtime
),
1813 .private_section
= "Mount",
1816 .no_instances
= true,
1822 .coldplug
= mount_coldplug
,
1826 .start
= mount_start
,
1828 .reload
= mount_reload
,
1832 .serialize
= mount_serialize
,
1833 .deserialize_item
= mount_deserialize_item
,
1835 .active_state
= mount_active_state
,
1836 .sub_state_to_string
= mount_sub_state_to_string
,
1838 .check_gc
= mount_check_gc
,
1840 .sigchld_event
= mount_sigchld_event
,
1842 .reset_failed
= mount_reset_failed
,
1844 .bus_vtable
= bus_mount_vtable
,
1845 .bus_set_property
= bus_mount_set_property
,
1846 .bus_commit_properties
= bus_mount_commit_properties
,
1848 .get_timeout
= mount_get_timeout
,
1850 .can_transient
= true,
1852 .enumerate
= mount_enumerate
,
1853 .shutdown
= mount_shutdown
,
1855 .status_message_formats
= {
1856 .starting_stopping
= {
1857 [0] = "Mounting %s...",
1858 [1] = "Unmounting %s...",
1860 .finished_start_job
= {
1861 [JOB_DONE
] = "Mounted %s.",
1862 [JOB_FAILED
] = "Failed to mount %s.",
1863 [JOB_TIMEOUT
] = "Timed out mounting %s.",
1865 .finished_stop_job
= {
1866 [JOB_DONE
] = "Unmounted %s.",
1867 [JOB_FAILED
] = "Failed unmounting %s.",
1868 [JOB_TIMEOUT
] = "Timed out unmounting %s.",