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/>.
24 #include <sys/epoll.h>
27 #include <sys/inotify.h>
33 #include "sd-messages.h"
36 #include "path-util.h"
37 #include "mount-setup.h"
38 #include "unit-name.h"
39 #include "dbus-mount.h"
41 #include "exit-status.h"
42 #include "fstab-util.h"
43 #include "formats-util.h"
45 #define RETRY_UMOUNT_MAX 32
47 DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_table
*, mnt_free_table
);
48 DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_iter
*, mnt_free_iter
);
50 static const UnitActiveState state_translation_table
[_MOUNT_STATE_MAX
] = {
51 [MOUNT_DEAD
] = UNIT_INACTIVE
,
52 [MOUNT_MOUNTING
] = UNIT_ACTIVATING
,
53 [MOUNT_MOUNTING_DONE
] = UNIT_ACTIVE
,
54 [MOUNT_MOUNTED
] = UNIT_ACTIVE
,
55 [MOUNT_REMOUNTING
] = UNIT_RELOADING
,
56 [MOUNT_UNMOUNTING
] = UNIT_DEACTIVATING
,
57 [MOUNT_MOUNTING_SIGTERM
] = UNIT_DEACTIVATING
,
58 [MOUNT_MOUNTING_SIGKILL
] = UNIT_DEACTIVATING
,
59 [MOUNT_REMOUNTING_SIGTERM
] = UNIT_RELOADING
,
60 [MOUNT_REMOUNTING_SIGKILL
] = UNIT_RELOADING
,
61 [MOUNT_UNMOUNTING_SIGTERM
] = UNIT_DEACTIVATING
,
62 [MOUNT_UNMOUNTING_SIGKILL
] = UNIT_DEACTIVATING
,
63 [MOUNT_FAILED
] = UNIT_FAILED
66 static int mount_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
67 static int mount_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
69 static bool mount_needs_network(const char *options
, const char *fstype
) {
70 if (fstab_test_option(options
, "_netdev\0"))
73 if (fstype
&& fstype_is_network(fstype
))
79 static bool mount_is_network(const MountParameters
*p
) {
82 return mount_needs_network(p
->options
, p
->fstype
);
85 static bool mount_is_bind(const MountParameters
*p
) {
88 if (fstab_test_option(p
->options
, "bind\0" "rbind\0"))
91 if (p
->fstype
&& STR_IN_SET(p
->fstype
, "bind", "rbind"))
97 static bool mount_is_auto(const MountParameters
*p
) {
100 return !fstab_test_option(p
->options
, "noauto\0");
103 static bool needs_quota(const MountParameters
*p
) {
106 /* Quotas are not enabled on network filesystems,
107 * but we want them, for example, on storage connected via iscsi */
108 if (p
->fstype
&& fstype_is_network(p
->fstype
))
111 if (mount_is_bind(p
))
114 return fstab_test_option(p
->options
,
115 "usrquota\0" "grpquota\0" "quota\0" "usrjquota\0" "grpjquota\0");
118 static void mount_init(Unit
*u
) {
122 assert(u
->load_state
== UNIT_STUB
);
124 m
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
125 m
->directory_mode
= 0755;
127 if (unit_has_name(u
, "-.mount")) {
128 /* Don't allow start/stop for root directory */
129 u
->refuse_manual_start
= true;
130 u
->refuse_manual_stop
= true;
132 /* The stdio/kmsg bridge socket is on /, in order to avoid a
133 * dep loop, don't use kmsg logging for -.mount */
134 m
->exec_context
.std_output
= u
->manager
->default_std_output
;
135 m
->exec_context
.std_error
= u
->manager
->default_std_error
;
138 /* We need to make sure that /bin/mount is always called in
139 * the same process group as us, so that the autofs kernel
140 * side doesn't send us another mount request while we are
141 * already trying to comply its last one. */
142 m
->exec_context
.same_pgrp
= true;
144 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
146 u
->ignore_on_isolate
= true;
149 static int mount_arm_timer(Mount
*m
) {
154 if (m
->timeout_usec
<= 0) {
155 m
->timer_event_source
= sd_event_source_unref(m
->timer_event_source
);
159 if (m
->timer_event_source
) {
160 r
= sd_event_source_set_time(m
->timer_event_source
, now(CLOCK_MONOTONIC
) + m
->timeout_usec
);
164 return sd_event_source_set_enabled(m
->timer_event_source
, SD_EVENT_ONESHOT
);
167 r
= sd_event_add_time(
168 UNIT(m
)->manager
->event
,
169 &m
->timer_event_source
,
171 now(CLOCK_MONOTONIC
) + m
->timeout_usec
, 0,
172 mount_dispatch_timer
, m
);
176 (void) sd_event_source_set_description(m
->timer_event_source
, "mount-timer");
181 static void mount_unwatch_control_pid(Mount
*m
) {
184 if (m
->control_pid
<= 0)
187 unit_unwatch_pid(UNIT(m
), m
->control_pid
);
191 static void mount_parameters_done(MountParameters
*p
) {
198 p
->what
= p
->options
= p
->fstype
= NULL
;
201 static void mount_done(Unit
*u
) {
209 mount_parameters_done(&m
->parameters_proc_self_mountinfo
);
210 mount_parameters_done(&m
->parameters_fragment
);
212 m
->exec_runtime
= exec_runtime_unref(m
->exec_runtime
);
213 exec_command_done_array(m
->exec_command
, _MOUNT_EXEC_COMMAND_MAX
);
214 m
->control_command
= NULL
;
216 mount_unwatch_control_pid(m
);
218 m
->timer_event_source
= sd_event_source_unref(m
->timer_event_source
);
221 _pure_
static MountParameters
* get_mount_parameters_fragment(Mount
*m
) {
224 if (m
->from_fragment
)
225 return &m
->parameters_fragment
;
230 _pure_
static MountParameters
* get_mount_parameters(Mount
*m
) {
233 if (m
->from_proc_self_mountinfo
)
234 return &m
->parameters_proc_self_mountinfo
;
236 return get_mount_parameters_fragment(m
);
239 static int mount_add_mount_links(Mount
*m
) {
240 _cleanup_free_
char *parent
= NULL
;
249 if (!path_equal(m
->where
, "/")) {
250 /* Adds in links to other mount points that might lie further
251 * up in the hierarchy */
252 r
= path_get_parent(m
->where
, &parent
);
256 r
= unit_require_mounts_for(UNIT(m
), parent
);
261 /* Adds in links to other mount points that might be needed
262 * for the source path (if this is a bind mount) to be
264 pm
= get_mount_parameters_fragment(m
);
265 if (pm
&& pm
->what
&&
266 path_is_absolute(pm
->what
) &&
267 !mount_is_network(pm
)) {
269 r
= unit_require_mounts_for(UNIT(m
), pm
->what
);
274 /* Adds in links to other units that use this path or paths
275 * further down in the hierarchy */
276 s
= manager_get_units_requiring_mounts_for(UNIT(m
)->manager
, m
->where
);
277 SET_FOREACH(other
, s
, i
) {
279 if (other
->load_state
!= UNIT_LOADED
)
282 if (other
== UNIT(m
))
285 r
= unit_add_dependency(other
, UNIT_AFTER
, UNIT(m
), true);
289 if (UNIT(m
)->fragment_path
) {
290 /* If we have fragment configuration, then make this dependency required */
291 r
= unit_add_dependency(other
, UNIT_REQUIRES
, UNIT(m
), true);
300 static int mount_add_device_links(Mount
*m
) {
302 bool device_wants_mount
= false;
307 p
= get_mount_parameters(m
);
314 if (mount_is_bind(p
))
317 if (!is_device_path(p
->what
))
320 if (path_equal(m
->where
, "/"))
323 if (mount_is_auto(p
) && UNIT(m
)->manager
->running_as
== SYSTEMD_SYSTEM
)
324 device_wants_mount
= true;
326 r
= unit_add_node_link(UNIT(m
), p
->what
, device_wants_mount
);
333 static int mount_add_quota_links(Mount
*m
) {
339 if (UNIT(m
)->manager
->running_as
!= SYSTEMD_SYSTEM
)
342 p
= get_mount_parameters_fragment(m
);
349 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_WANTS
, SPECIAL_QUOTACHECK_SERVICE
, NULL
, true);
353 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_WANTS
, SPECIAL_QUOTAON_SERVICE
, NULL
, true);
360 static bool should_umount(Mount
*m
) {
363 if (path_equal(m
->where
, "/") ||
364 path_equal(m
->where
, "/usr"))
367 p
= get_mount_parameters(m
);
368 if (p
&& fstab_test_option(p
->options
, "x-initrd.mount\0") &&
375 static int mount_add_default_dependencies(Mount
*m
) {
376 const char *after
, *after2
, *online
;
382 if (UNIT(m
)->manager
->running_as
!= SYSTEMD_SYSTEM
)
385 /* We do not add any default dependencies to / and /usr, since
386 * they are guaranteed to stay mounted the whole time, since
387 * our system is on it. Also, don't bother with anything
388 * mounted below virtual file systems, it's also going to be
389 * virtual, and hence not worth the effort. */
390 if (path_equal(m
->where
, "/") ||
391 path_equal(m
->where
, "/usr") ||
392 path_startswith(m
->where
, "/proc") ||
393 path_startswith(m
->where
, "/sys") ||
394 path_startswith(m
->where
, "/dev"))
397 p
= get_mount_parameters(m
);
401 if (mount_is_network(p
)) {
402 after
= SPECIAL_REMOTE_FS_PRE_TARGET
;
403 after2
= SPECIAL_NETWORK_TARGET
;
404 online
= SPECIAL_NETWORK_ONLINE_TARGET
;
406 after
= SPECIAL_LOCAL_FS_PRE_TARGET
;
411 r
= unit_add_dependency_by_name(UNIT(m
), UNIT_AFTER
, after
, NULL
, true);
416 r
= unit_add_dependency_by_name(UNIT(m
), UNIT_AFTER
, after2
, NULL
, true);
422 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_WANTS
, UNIT_AFTER
, online
, NULL
, true);
427 if (should_umount(m
)) {
428 r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
436 static int mount_verify(Mount
*m
) {
437 _cleanup_free_
char *e
= NULL
;
442 if (UNIT(m
)->load_state
!= UNIT_LOADED
)
445 if (!m
->from_fragment
&& !m
->from_proc_self_mountinfo
)
448 r
= unit_name_from_path(m
->where
, ".mount", &e
);
450 return log_unit_error_errno(UNIT(m
), r
, "Failed to generate unit name from mount path: %m");
452 if (!unit_has_name(UNIT(m
), e
)) {
453 log_unit_error(UNIT(m
), "Where= setting doesn't match unit name. Refusing.");
457 if (mount_point_is_api(m
->where
) || mount_point_ignore(m
->where
)) {
458 log_unit_error(UNIT(m
), "Cannot create mount unit for API file system %s. Refusing.", m
->where
);
462 if (UNIT(m
)->fragment_path
&& !m
->parameters_fragment
.what
) {
463 log_unit_error(UNIT(m
), "What= setting is missing. Refusing.");
467 if (m
->exec_context
.pam_name
&& m
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
468 log_unit_error(UNIT(m
), "Unit has PAM enabled. Kill mode must be set to control-group'. Refusing.");
475 static int mount_add_extras(Mount
*m
) {
481 if (u
->fragment_path
)
482 m
->from_fragment
= true;
485 r
= unit_name_to_path(u
->id
, &m
->where
);
490 path_kill_slashes(m
->where
);
492 if (!u
->description
) {
493 r
= unit_set_description(u
, m
->where
);
498 r
= mount_add_device_links(m
);
502 r
= mount_add_mount_links(m
);
506 r
= mount_add_quota_links(m
);
510 r
= unit_patch_contexts(u
);
514 r
= unit_add_exec_dependencies(u
, &m
->exec_context
);
518 r
= unit_add_default_slice(u
, &m
->cgroup_context
);
522 if (u
->default_dependencies
) {
523 r
= mount_add_default_dependencies(m
);
531 static int mount_load(Unit
*u
) {
536 assert(u
->load_state
== UNIT_STUB
);
538 if (m
->from_proc_self_mountinfo
)
539 r
= unit_load_fragment_and_dropin_optional(u
);
541 r
= unit_load_fragment_and_dropin(u
);
546 /* This is a new unit? Then let's add in some extras */
547 if (u
->load_state
== UNIT_LOADED
) {
548 r
= mount_add_extras(m
);
553 return mount_verify(m
);
556 static int mount_notify_automount(Mount
*m
, MountState old_state
, MountState state
) {
563 SET_FOREACH(p
, UNIT(m
)->dependencies
[UNIT_TRIGGERED_BY
], i
)
564 if (p
->type
== UNIT_AUTOMOUNT
) {
565 r
= automount_update_mount(AUTOMOUNT(p
), old_state
, state
);
573 static void mount_set_state(Mount
*m
, MountState state
) {
574 MountState old_state
;
577 old_state
= m
->state
;
580 if (state
!= MOUNT_MOUNTING
&&
581 state
!= MOUNT_MOUNTING_DONE
&&
582 state
!= MOUNT_REMOUNTING
&&
583 state
!= MOUNT_UNMOUNTING
&&
584 state
!= MOUNT_MOUNTING_SIGTERM
&&
585 state
!= MOUNT_MOUNTING_SIGKILL
&&
586 state
!= MOUNT_UNMOUNTING_SIGTERM
&&
587 state
!= MOUNT_UNMOUNTING_SIGKILL
&&
588 state
!= MOUNT_REMOUNTING_SIGTERM
&&
589 state
!= MOUNT_REMOUNTING_SIGKILL
) {
590 m
->timer_event_source
= sd_event_source_unref(m
->timer_event_source
);
591 mount_unwatch_control_pid(m
);
592 m
->control_command
= NULL
;
593 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
596 mount_notify_automount(m
, old_state
, state
);
598 if (state
!= old_state
)
599 log_unit_debug(UNIT(m
), "Changed %s -> %s", mount_state_to_string(old_state
), mount_state_to_string(state
));
601 unit_notify(UNIT(m
), state_translation_table
[old_state
], state_translation_table
[state
], m
->reload_result
== MOUNT_SUCCESS
);
602 m
->reload_result
= MOUNT_SUCCESS
;
605 static int mount_coldplug(Unit
*u
) {
607 MountState new_state
= MOUNT_DEAD
;
611 assert(m
->state
== MOUNT_DEAD
);
613 if (m
->deserialized_state
!= m
->state
)
614 new_state
= m
->deserialized_state
;
615 else if (m
->from_proc_self_mountinfo
)
616 new_state
= MOUNT_MOUNTED
;
618 if (new_state
== m
->state
)
621 if (new_state
== MOUNT_MOUNTING
||
622 new_state
== MOUNT_MOUNTING_DONE
||
623 new_state
== MOUNT_REMOUNTING
||
624 new_state
== MOUNT_UNMOUNTING
||
625 new_state
== MOUNT_MOUNTING_SIGTERM
||
626 new_state
== MOUNT_MOUNTING_SIGKILL
||
627 new_state
== MOUNT_UNMOUNTING_SIGTERM
||
628 new_state
== MOUNT_UNMOUNTING_SIGKILL
||
629 new_state
== MOUNT_REMOUNTING_SIGTERM
||
630 new_state
== MOUNT_REMOUNTING_SIGKILL
) {
632 if (m
->control_pid
<= 0)
635 r
= unit_watch_pid(UNIT(m
), m
->control_pid
);
639 r
= mount_arm_timer(m
);
644 mount_set_state(m
, new_state
);
648 static void mount_dump(Unit
*u
, FILE *f
, const char *prefix
) {
655 p
= get_mount_parameters(m
);
658 "%sMount State: %s\n"
662 "%sFile System Type: %s\n"
664 "%sFrom /proc/self/mountinfo: %s\n"
665 "%sFrom fragment: %s\n"
666 "%sDirectoryMode: %04o\n",
667 prefix
, mount_state_to_string(m
->state
),
668 prefix
, mount_result_to_string(m
->result
),
670 prefix
, p
? strna(p
->what
) : "n/a",
671 prefix
, p
? strna(p
->fstype
) : "n/a",
672 prefix
, p
? strna(p
->options
) : "n/a",
673 prefix
, yes_no(m
->from_proc_self_mountinfo
),
674 prefix
, yes_no(m
->from_fragment
),
675 prefix
, m
->directory_mode
);
677 if (m
->control_pid
> 0)
679 "%sControl PID: "PID_FMT
"\n",
680 prefix
, m
->control_pid
);
682 exec_context_dump(&m
->exec_context
, f
, prefix
);
683 kill_context_dump(&m
->kill_context
, f
, prefix
);
686 static int mount_spawn(Mount
*m
, ExecCommand
*c
, pid_t
*_pid
) {
689 ExecParameters exec_params
= {
690 .apply_permissions
= true,
691 .apply_chroot
= true,
692 .apply_tty_stdin
= true,
693 .bus_endpoint_fd
= -1,
700 (void) unit_realize_cgroup(UNIT(m
));
701 if (m
->reset_cpu_usage
) {
702 (void) unit_reset_cpu_usage(UNIT(m
));
703 m
->reset_cpu_usage
= false;
706 r
= unit_setup_exec_runtime(UNIT(m
));
710 r
= mount_arm_timer(m
);
714 exec_params
.environment
= UNIT(m
)->manager
->environment
;
715 exec_params
.confirm_spawn
= UNIT(m
)->manager
->confirm_spawn
;
716 exec_params
.cgroup_supported
= UNIT(m
)->manager
->cgroup_supported
;
717 exec_params
.cgroup_path
= UNIT(m
)->cgroup_path
;
718 exec_params
.cgroup_delegate
= m
->cgroup_context
.delegate
;
719 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(m
)->manager
);
721 r
= exec_spawn(UNIT(m
),
730 r
= unit_watch_pid(UNIT(m
), pid
);
732 /* FIXME: we need to do something here */
740 m
->timer_event_source
= sd_event_source_unref(m
->timer_event_source
);
745 static void mount_enter_dead(Mount
*m
, MountResult f
) {
748 if (f
!= MOUNT_SUCCESS
)
751 exec_runtime_destroy(m
->exec_runtime
);
752 m
->exec_runtime
= exec_runtime_unref(m
->exec_runtime
);
754 exec_context_destroy_runtime_directory(&m
->exec_context
, manager_get_runtime_prefix(UNIT(m
)->manager
));
756 mount_set_state(m
, m
->result
!= MOUNT_SUCCESS
? MOUNT_FAILED
: MOUNT_DEAD
);
759 static void mount_enter_mounted(Mount
*m
, MountResult f
) {
762 if (f
!= MOUNT_SUCCESS
)
765 mount_set_state(m
, MOUNT_MOUNTED
);
768 static void mount_enter_signal(Mount
*m
, MountState state
, MountResult f
) {
773 if (f
!= MOUNT_SUCCESS
)
776 r
= unit_kill_context(
779 (state
!= MOUNT_MOUNTING_SIGTERM
&& state
!= MOUNT_UNMOUNTING_SIGTERM
&& state
!= MOUNT_REMOUNTING_SIGTERM
) ?
780 KILL_KILL
: KILL_TERMINATE
,
788 r
= mount_arm_timer(m
);
792 mount_set_state(m
, state
);
793 } else if (state
== MOUNT_REMOUNTING_SIGTERM
)
794 mount_enter_signal(m
, MOUNT_REMOUNTING_SIGKILL
, MOUNT_SUCCESS
);
795 else if (state
== MOUNT_REMOUNTING_SIGKILL
)
796 mount_enter_mounted(m
, MOUNT_SUCCESS
);
797 else if (state
== MOUNT_MOUNTING_SIGTERM
)
798 mount_enter_signal(m
, MOUNT_MOUNTING_SIGKILL
, MOUNT_SUCCESS
);
799 else if (state
== MOUNT_UNMOUNTING_SIGTERM
)
800 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGKILL
, MOUNT_SUCCESS
);
802 mount_enter_dead(m
, MOUNT_SUCCESS
);
807 log_unit_warning_errno(UNIT(m
), r
, "Failed to kill processes: %m");
809 if (state
== MOUNT_REMOUNTING_SIGTERM
|| state
== MOUNT_REMOUNTING_SIGKILL
)
810 mount_enter_mounted(m
, MOUNT_FAILURE_RESOURCES
);
812 mount_enter_dead(m
, MOUNT_FAILURE_RESOURCES
);
815 void unit_warn_if_dir_nonempty(Unit
*u
, const char* where
) {
821 r
= dir_is_empty(where
);
825 log_unit_warning_errno(u
, r
, "Failed to check directory %s: %m", where
);
829 log_struct(LOG_NOTICE
,
830 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
832 LOG_UNIT_MESSAGE(u
, "Directory %s to mount over is not empty, mounting anyway.", where
),
837 int unit_fail_if_symlink(Unit
*u
, const char* where
) {
843 r
= is_symlink(where
);
845 log_unit_debug_errno(u
, r
, "Failed to check symlink %s, ignoring: %m", where
);
852 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
854 LOG_UNIT_MESSAGE(u
, "Mount on symlink %s not allowed.", where
),
861 static void mount_enter_unmounting(Mount
*m
) {
866 /* Start counting our attempts */
867 if (!IN_SET(m
->state
,
869 MOUNT_UNMOUNTING_SIGTERM
,
870 MOUNT_UNMOUNTING_SIGKILL
))
871 m
->n_retry_umount
= 0;
873 m
->control_command_id
= MOUNT_EXEC_UNMOUNT
;
874 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_UNMOUNT
;
876 r
= exec_command_set(m
->control_command
, "/bin/umount", m
->where
, NULL
);
877 if (r
>= 0 && UNIT(m
)->manager
->running_as
== SYSTEMD_SYSTEM
)
878 r
= exec_command_append(m
->control_command
, "-n", NULL
);
882 mount_unwatch_control_pid(m
);
884 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
888 mount_set_state(m
, MOUNT_UNMOUNTING
);
893 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'umount' task: %m");
894 mount_enter_mounted(m
, MOUNT_FAILURE_RESOURCES
);
897 static void mount_enter_mounting(Mount
*m
) {
903 m
->control_command_id
= MOUNT_EXEC_MOUNT
;
904 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_MOUNT
;
906 r
= unit_fail_if_symlink(UNIT(m
), m
->where
);
910 (void) mkdir_p_label(m
->where
, m
->directory_mode
);
912 unit_warn_if_dir_nonempty(UNIT(m
), m
->where
);
914 /* Create the source directory for bind-mounts if needed */
915 p
= get_mount_parameters_fragment(m
);
916 if (p
&& mount_is_bind(p
))
917 (void) mkdir_p_label(p
->what
, m
->directory_mode
);
919 if (m
->from_fragment
) {
920 _cleanup_free_
char *opts
= NULL
;
922 r
= fstab_filter_options(m
->parameters_fragment
.options
,
923 "nofail\0" "noauto\0" "auto\0", NULL
, NULL
, &opts
);
927 r
= exec_command_set(m
->control_command
, "/bin/mount",
928 m
->parameters_fragment
.what
, m
->where
, NULL
);
929 if (r
>= 0 && UNIT(m
)->manager
->running_as
== SYSTEMD_SYSTEM
)
930 r
= exec_command_append(m
->control_command
, "-n", NULL
);
931 if (r
>= 0 && m
->sloppy_options
)
932 r
= exec_command_append(m
->control_command
, "-s", NULL
);
933 if (r
>= 0 && m
->parameters_fragment
.fstype
)
934 r
= exec_command_append(m
->control_command
, "-t", m
->parameters_fragment
.fstype
, NULL
);
935 if (r
>= 0 && !isempty(opts
))
936 r
= exec_command_append(m
->control_command
, "-o", opts
, NULL
);
943 mount_unwatch_control_pid(m
);
945 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
949 mount_set_state(m
, MOUNT_MOUNTING
);
954 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'mount' task: %m");
955 mount_enter_dead(m
, MOUNT_FAILURE_RESOURCES
);
958 static void mount_enter_remounting(Mount
*m
) {
963 m
->control_command_id
= MOUNT_EXEC_REMOUNT
;
964 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_REMOUNT
;
966 if (m
->from_fragment
) {
969 if (m
->parameters_fragment
.options
)
970 o
= strjoina("remount,", m
->parameters_fragment
.options
);
974 r
= exec_command_set(m
->control_command
, "/bin/mount",
975 m
->parameters_fragment
.what
, m
->where
,
977 if (r
>= 0 && UNIT(m
)->manager
->running_as
== SYSTEMD_SYSTEM
)
978 r
= exec_command_append(m
->control_command
, "-n", NULL
);
979 if (r
>= 0 && m
->sloppy_options
)
980 r
= exec_command_append(m
->control_command
, "-s", NULL
);
981 if (r
>= 0 && m
->parameters_fragment
.fstype
)
982 r
= exec_command_append(m
->control_command
, "-t", m
->parameters_fragment
.fstype
, NULL
);
989 mount_unwatch_control_pid(m
);
991 r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
);
995 mount_set_state(m
, MOUNT_REMOUNTING
);
1000 log_unit_warning_errno(UNIT(m
), r
, "Failed to run 'remount' task: %m");
1001 m
->reload_result
= MOUNT_FAILURE_RESOURCES
;
1002 mount_enter_mounted(m
, MOUNT_SUCCESS
);
1005 static int mount_start(Unit
*u
) {
1006 Mount
*m
= MOUNT(u
);
1010 /* We cannot fulfill this request right now, try again later
1012 if (m
->state
== MOUNT_UNMOUNTING
||
1013 m
->state
== MOUNT_UNMOUNTING_SIGTERM
||
1014 m
->state
== MOUNT_UNMOUNTING_SIGKILL
||
1015 m
->state
== MOUNT_MOUNTING_SIGTERM
||
1016 m
->state
== MOUNT_MOUNTING_SIGKILL
)
1019 /* Already on it! */
1020 if (m
->state
== MOUNT_MOUNTING
)
1023 assert(m
->state
== MOUNT_DEAD
|| m
->state
== MOUNT_FAILED
);
1025 m
->result
= MOUNT_SUCCESS
;
1026 m
->reload_result
= MOUNT_SUCCESS
;
1027 m
->reset_cpu_usage
= true;
1029 mount_enter_mounting(m
);
1033 static int mount_stop(Unit
*u
) {
1034 Mount
*m
= MOUNT(u
);
1039 if (m
->state
== MOUNT_UNMOUNTING
||
1040 m
->state
== MOUNT_UNMOUNTING_SIGKILL
||
1041 m
->state
== MOUNT_UNMOUNTING_SIGTERM
||
1042 m
->state
== MOUNT_MOUNTING_SIGTERM
||
1043 m
->state
== MOUNT_MOUNTING_SIGKILL
)
1046 assert(m
->state
== MOUNT_MOUNTING
||
1047 m
->state
== MOUNT_MOUNTING_DONE
||
1048 m
->state
== MOUNT_MOUNTED
||
1049 m
->state
== MOUNT_REMOUNTING
||
1050 m
->state
== MOUNT_REMOUNTING_SIGTERM
||
1051 m
->state
== MOUNT_REMOUNTING_SIGKILL
);
1053 mount_enter_unmounting(m
);
1057 static int mount_reload(Unit
*u
) {
1058 Mount
*m
= MOUNT(u
);
1062 if (m
->state
== MOUNT_MOUNTING_DONE
)
1065 assert(m
->state
== MOUNT_MOUNTED
);
1067 mount_enter_remounting(m
);
1071 static int mount_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
1072 Mount
*m
= MOUNT(u
);
1078 unit_serialize_item(u
, f
, "state", mount_state_to_string(m
->state
));
1079 unit_serialize_item(u
, f
, "result", mount_result_to_string(m
->result
));
1080 unit_serialize_item(u
, f
, "reload-result", mount_result_to_string(m
->reload_result
));
1082 if (m
->control_pid
> 0)
1083 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, m
->control_pid
);
1085 if (m
->control_command_id
>= 0)
1086 unit_serialize_item(u
, f
, "control-command", mount_exec_command_to_string(m
->control_command_id
));
1091 static int mount_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
1092 Mount
*m
= MOUNT(u
);
1099 if (streq(key
, "state")) {
1102 if ((state
= mount_state_from_string(value
)) < 0)
1103 log_unit_debug(u
, "Failed to parse state value: %s", value
);
1105 m
->deserialized_state
= state
;
1106 } else if (streq(key
, "result")) {
1109 f
= mount_result_from_string(value
);
1111 log_unit_debug(u
, "Failed to parse result value: %s", value
);
1112 else if (f
!= MOUNT_SUCCESS
)
1115 } else if (streq(key
, "reload-result")) {
1118 f
= mount_result_from_string(value
);
1120 log_unit_debug(u
, "Failed to parse reload result value: %s", value
);
1121 else if (f
!= MOUNT_SUCCESS
)
1122 m
->reload_result
= f
;
1124 } else if (streq(key
, "control-pid")) {
1127 if (parse_pid(value
, &pid
) < 0)
1128 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
1130 m
->control_pid
= pid
;
1131 } else if (streq(key
, "control-command")) {
1132 MountExecCommand id
;
1134 id
= mount_exec_command_from_string(value
);
1136 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
1138 m
->control_command_id
= id
;
1139 m
->control_command
= m
->exec_command
+ id
;
1142 log_unit_debug(u
, "Unknown serialization key: %s", key
);
1147 _pure_
static UnitActiveState
mount_active_state(Unit
*u
) {
1150 return state_translation_table
[MOUNT(u
)->state
];
1153 _pure_
static const char *mount_sub_state_to_string(Unit
*u
) {
1156 return mount_state_to_string(MOUNT(u
)->state
);
1159 _pure_
static bool mount_check_gc(Unit
*u
) {
1160 Mount
*m
= MOUNT(u
);
1164 return m
->from_proc_self_mountinfo
;
1167 static void mount_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
1168 Mount
*m
= MOUNT(u
);
1174 if (pid
!= m
->control_pid
)
1179 if (is_clean_exit(code
, status
, NULL
))
1181 else if (code
== CLD_EXITED
)
1182 f
= MOUNT_FAILURE_EXIT_CODE
;
1183 else if (code
== CLD_KILLED
)
1184 f
= MOUNT_FAILURE_SIGNAL
;
1185 else if (code
== CLD_DUMPED
)
1186 f
= MOUNT_FAILURE_CORE_DUMP
;
1188 assert_not_reached("Unknown code");
1190 if (f
!= MOUNT_SUCCESS
)
1193 if (m
->control_command
) {
1194 exec_status_exit(&m
->control_command
->exec_status
, &m
->exec_context
, pid
, code
, status
);
1196 m
->control_command
= NULL
;
1197 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
1200 log_unit_full(u
, f
== MOUNT_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
1201 "Mount process exited, code=%s status=%i", sigchld_code_to_string(code
), status
);
1203 /* Note that mount(8) returning and the kernel sending us a
1204 * mount table change event might happen out-of-order. If an
1205 * operation succeed we assume the kernel will follow soon too
1206 * and already change into the resulting state. If it fails
1207 * we check if the kernel still knows about the mount. and
1208 * change state accordingly. */
1212 case MOUNT_MOUNTING
:
1213 case MOUNT_MOUNTING_DONE
:
1214 case MOUNT_MOUNTING_SIGKILL
:
1215 case MOUNT_MOUNTING_SIGTERM
:
1217 if (f
== MOUNT_SUCCESS
)
1218 mount_enter_mounted(m
, f
);
1219 else if (m
->from_proc_self_mountinfo
)
1220 mount_enter_mounted(m
, f
);
1222 mount_enter_dead(m
, f
);
1225 case MOUNT_REMOUNTING
:
1226 case MOUNT_REMOUNTING_SIGKILL
:
1227 case MOUNT_REMOUNTING_SIGTERM
:
1229 m
->reload_result
= f
;
1230 if (m
->from_proc_self_mountinfo
)
1231 mount_enter_mounted(m
, MOUNT_SUCCESS
);
1233 mount_enter_dead(m
, MOUNT_SUCCESS
);
1237 case MOUNT_UNMOUNTING
:
1238 case MOUNT_UNMOUNTING_SIGKILL
:
1239 case MOUNT_UNMOUNTING_SIGTERM
:
1241 if (f
== MOUNT_SUCCESS
) {
1243 if (m
->from_proc_self_mountinfo
) {
1245 /* Still a mount point? If so, let's
1246 * try again. Most likely there were
1247 * multiple mount points stacked on
1248 * top of each other. Note that due to
1249 * the io event priority logic we can
1250 * be sure the new mountinfo is loaded
1251 * before we process the SIGCHLD for
1252 * the mount command. */
1254 if (m
->n_retry_umount
< RETRY_UMOUNT_MAX
) {
1255 log_unit_debug(u
, "Mount still present, trying again.");
1256 m
->n_retry_umount
++;
1257 mount_enter_unmounting(m
);
1259 log_unit_debug(u
, "Mount still present after %u attempts to unmount, giving up.", m
->n_retry_umount
);
1260 mount_enter_mounted(m
, f
);
1263 mount_enter_dead(m
, f
);
1265 } else if (m
->from_proc_self_mountinfo
)
1266 mount_enter_mounted(m
, f
);
1268 mount_enter_dead(m
, f
);
1272 assert_not_reached("Uh, control process died at wrong time.");
1275 /* Notify clients about changed exit status */
1276 unit_add_to_dbus_queue(u
);
1279 static int mount_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
1280 Mount
*m
= MOUNT(userdata
);
1283 assert(m
->timer_event_source
== source
);
1287 case MOUNT_MOUNTING
:
1288 case MOUNT_MOUNTING_DONE
:
1289 log_unit_warning(UNIT(m
), "Mounting timed out. Stopping.");
1290 mount_enter_signal(m
, MOUNT_MOUNTING_SIGTERM
, MOUNT_FAILURE_TIMEOUT
);
1293 case MOUNT_REMOUNTING
:
1294 log_unit_warning(UNIT(m
), "Remounting timed out. Stopping.");
1295 m
->reload_result
= MOUNT_FAILURE_TIMEOUT
;
1296 mount_enter_mounted(m
, MOUNT_SUCCESS
);
1299 case MOUNT_UNMOUNTING
:
1300 log_unit_warning(UNIT(m
), "Unmounting timed out. Stopping.");
1301 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGTERM
, MOUNT_FAILURE_TIMEOUT
);
1304 case MOUNT_MOUNTING_SIGTERM
:
1305 if (m
->kill_context
.send_sigkill
) {
1306 log_unit_warning(UNIT(m
), "Mounting timed out. Killing.");
1307 mount_enter_signal(m
, MOUNT_MOUNTING_SIGKILL
, MOUNT_FAILURE_TIMEOUT
);
1309 log_unit_warning(UNIT(m
), "Mounting timed out. Skipping SIGKILL. Ignoring.");
1311 if (m
->from_proc_self_mountinfo
)
1312 mount_enter_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1314 mount_enter_dead(m
, MOUNT_FAILURE_TIMEOUT
);
1318 case MOUNT_REMOUNTING_SIGTERM
:
1319 if (m
->kill_context
.send_sigkill
) {
1320 log_unit_warning(UNIT(m
), "Remounting timed out. Killing.");
1321 mount_enter_signal(m
, MOUNT_REMOUNTING_SIGKILL
, MOUNT_FAILURE_TIMEOUT
);
1323 log_unit_warning(UNIT(m
), "Remounting timed out. Skipping SIGKILL. Ignoring.");
1325 if (m
->from_proc_self_mountinfo
)
1326 mount_enter_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1328 mount_enter_dead(m
, MOUNT_FAILURE_TIMEOUT
);
1332 case MOUNT_UNMOUNTING_SIGTERM
:
1333 if (m
->kill_context
.send_sigkill
) {
1334 log_unit_warning(UNIT(m
), "Unmounting timed out. Killing.");
1335 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGKILL
, MOUNT_FAILURE_TIMEOUT
);
1337 log_unit_warning(UNIT(m
), "Unmounting timed out. Skipping SIGKILL. Ignoring.");
1339 if (m
->from_proc_self_mountinfo
)
1340 mount_enter_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1342 mount_enter_dead(m
, MOUNT_FAILURE_TIMEOUT
);
1346 case MOUNT_MOUNTING_SIGKILL
:
1347 case MOUNT_REMOUNTING_SIGKILL
:
1348 case MOUNT_UNMOUNTING_SIGKILL
:
1349 log_unit_warning(UNIT(m
),"Mount process still around after SIGKILL. Ignoring.");
1351 if (m
->from_proc_self_mountinfo
)
1352 mount_enter_mounted(m
, MOUNT_FAILURE_TIMEOUT
);
1354 mount_enter_dead(m
, MOUNT_FAILURE_TIMEOUT
);
1358 assert_not_reached("Timeout at wrong time.");
1364 static int mount_setup_unit(
1368 const char *options
,
1372 _cleanup_free_
char *e
= NULL
, *w
= NULL
, *o
= NULL
, *f
= NULL
;
1373 bool load_extras
= false;
1375 bool delete, changed
= false;
1385 /* Ignore API mount points. They should never be referenced in
1386 * dependencies ever. */
1387 if (mount_point_is_api(where
) || mount_point_ignore(where
))
1390 if (streq(fstype
, "autofs"))
1393 /* probably some kind of swap, ignore */
1394 if (!is_path(where
))
1397 r
= unit_name_from_path(where
, ".mount", &e
);
1401 u
= manager_get_unit(m
, e
);
1405 u
= unit_new(m
, sizeof(Mount
));
1409 r
= unit_add_name(u
, e
);
1413 MOUNT(u
)->where
= strdup(where
);
1414 if (!MOUNT(u
)->where
) {
1419 u
->source_path
= strdup("/proc/self/mountinfo");
1420 if (!u
->source_path
) {
1425 if (m
->running_as
== SYSTEMD_SYSTEM
) {
1428 target
= mount_needs_network(options
, fstype
) ? SPECIAL_REMOTE_FS_TARGET
: SPECIAL_LOCAL_FS_TARGET
;
1429 r
= unit_add_dependency_by_name(u
, UNIT_BEFORE
, target
, NULL
, true);
1433 if (should_umount(MOUNT(u
))) {
1434 r
= unit_add_dependency_by_name(u
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
1440 unit_add_to_load_queue(u
);
1445 if (!MOUNT(u
)->where
) {
1446 MOUNT(u
)->where
= strdup(where
);
1447 if (!MOUNT(u
)->where
) {
1453 if (m
->running_as
== SYSTEMD_SYSTEM
&&
1454 mount_needs_network(options
, fstype
)) {
1455 /* _netdev option may have shown up late, or on a
1456 * remount. Add remote-fs dependencies, even though
1457 * local-fs ones may already be there. */
1458 unit_add_dependency_by_name(u
, UNIT_BEFORE
, SPECIAL_REMOTE_FS_TARGET
, NULL
, true);
1462 if (u
->load_state
== UNIT_NOT_FOUND
) {
1463 u
->load_state
= UNIT_LOADED
;
1466 /* Load in the extras later on, after we
1467 * finished initialization of the unit */
1474 o
= strdup(options
);
1476 if (!w
|| !o
|| !f
) {
1481 p
= &MOUNT(u
)->parameters_proc_self_mountinfo
;
1483 changed
= changed
||
1484 !streq_ptr(p
->options
, options
) ||
1485 !streq_ptr(p
->what
, what
) ||
1486 !streq_ptr(p
->fstype
, fstype
);
1489 MOUNT(u
)->is_mounted
= true;
1490 MOUNT(u
)->just_mounted
= !MOUNT(u
)->from_proc_self_mountinfo
;
1491 MOUNT(u
)->just_changed
= changed
;
1494 MOUNT(u
)->from_proc_self_mountinfo
= true;
1509 r
= mount_add_extras(MOUNT(u
));
1515 unit_add_to_dbus_queue(u
);
1520 log_warning_errno(r
, "Failed to set up mount unit: %m");
1528 static int mount_load_proc_self_mountinfo(Manager
*m
, bool set_flags
) {
1529 _cleanup_(mnt_free_tablep
) struct libmnt_table
*t
= NULL
;
1530 _cleanup_(mnt_free_iterp
) struct libmnt_iter
*i
= NULL
;
1535 t
= mnt_new_table();
1539 i
= mnt_new_iter(MNT_ITER_FORWARD
);
1543 r
= mnt_table_parse_mtab(t
, NULL
);
1545 return log_error_errno(r
, "Failed to parse /proc/self/mountinfo: %m");
1549 const char *device
, *path
, *options
, *fstype
;
1550 _cleanup_free_
char *d
= NULL
, *p
= NULL
;
1551 struct libmnt_fs
*fs
;
1554 k
= mnt_table_next_fs(t
, i
, &fs
);
1558 return log_error_errno(k
, "Failed to get next entry from /proc/self/mountinfo: %m");
1560 device
= mnt_fs_get_source(fs
);
1561 path
= mnt_fs_get_target(fs
);
1562 options
= mnt_fs_get_options(fs
);
1563 fstype
= mnt_fs_get_fstype(fs
);
1565 if (cunescape(device
, UNESCAPE_RELAX
, &d
) < 0)
1568 if (cunescape(path
, UNESCAPE_RELAX
, &p
) < 0)
1571 (void) device_found_node(m
, d
, true, DEVICE_FOUND_MOUNT
, set_flags
);
1573 k
= mount_setup_unit(m
, d
, p
, options
, fstype
, set_flags
);
1574 if (r
== 0 && k
< 0)
1581 static void mount_shutdown(Manager
*m
) {
1584 m
->mount_event_source
= sd_event_source_unref(m
->mount_event_source
);
1585 m
->mount_utab_event_source
= sd_event_source_unref(m
->mount_utab_event_source
);
1587 if (m
->proc_self_mountinfo
) {
1588 fclose(m
->proc_self_mountinfo
);
1589 m
->proc_self_mountinfo
= NULL
;
1591 m
->utab_inotify_fd
= safe_close(m
->utab_inotify_fd
);
1594 static int mount_get_timeout(Unit
*u
, uint64_t *timeout
) {
1595 Mount
*m
= MOUNT(u
);
1598 if (!m
->timer_event_source
)
1601 r
= sd_event_source_get_time(m
->timer_event_source
, timeout
);
1608 static int mount_enumerate(Manager
*m
) {
1614 if (!m
->proc_self_mountinfo
) {
1615 m
->proc_self_mountinfo
= fopen("/proc/self/mountinfo", "re");
1616 if (!m
->proc_self_mountinfo
)
1619 r
= sd_event_add_io(m
->event
, &m
->mount_event_source
, fileno(m
->proc_self_mountinfo
), EPOLLPRI
, mount_dispatch_io
, m
);
1623 /* Dispatch this before we dispatch SIGCHLD, so that
1624 * we always get the events from /proc/self/mountinfo
1625 * before the SIGCHLD of /bin/mount. */
1626 r
= sd_event_source_set_priority(m
->mount_event_source
, -10);
1630 (void) sd_event_source_set_description(m
->mount_event_source
, "mount-mountinfo-dispatch");
1633 if (m
->utab_inotify_fd
< 0) {
1634 m
->utab_inotify_fd
= inotify_init1(IN_NONBLOCK
|IN_CLOEXEC
);
1635 if (m
->utab_inotify_fd
< 0) {
1640 (void) mkdir_p_label("/run/mount", 0755);
1642 r
= inotify_add_watch(m
->utab_inotify_fd
, "/run/mount", IN_MOVED_TO
);
1648 r
= sd_event_add_io(m
->event
, &m
->mount_utab_event_source
, m
->utab_inotify_fd
, EPOLLIN
, mount_dispatch_io
, m
);
1652 r
= sd_event_source_set_priority(m
->mount_utab_event_source
, -10);
1656 (void) sd_event_source_set_description(m
->mount_utab_event_source
, "mount-utab-dispatch");
1659 r
= mount_load_proc_self_mountinfo(m
, false);
1670 static int mount_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1671 Manager
*m
= userdata
;
1676 assert(revents
& (EPOLLPRI
| EPOLLIN
));
1678 /* The manager calls this for every fd event happening on the
1679 * /proc/self/mountinfo file, which informs us about mounting
1680 * table changes, and for /run/mount events which we watch
1681 * for mount options. */
1683 if (fd
== m
->utab_inotify_fd
) {
1684 bool rescan
= false;
1686 /* FIXME: We *really* need to replace this with
1687 * libmount's own API for this, we should not hardcode
1688 * internal behaviour of libmount here. */
1691 union inotify_event_buffer buffer
;
1692 struct inotify_event
*e
;
1695 l
= read(fd
, &buffer
, sizeof(buffer
));
1697 if (errno
== EAGAIN
|| errno
== EINTR
)
1700 log_error_errno(errno
, "Failed to read utab inotify: %m");
1704 FOREACH_INOTIFY_EVENT(e
, buffer
, l
) {
1705 /* Only care about changes to utab,
1706 * but we have to monitor the
1707 * directory to reliably get
1708 * notifications about when utab is
1709 * replaced using rename(2) */
1710 if ((e
->mask
& IN_Q_OVERFLOW
) || streq(e
->name
, "utab"))
1719 r
= mount_load_proc_self_mountinfo(m
, true);
1721 /* Reset flags, just in case, for later calls */
1722 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_MOUNT
]) {
1723 Mount
*mount
= MOUNT(u
);
1725 mount
->is_mounted
= mount
->just_mounted
= mount
->just_changed
= false;
1731 manager_dispatch_load_queue(m
);
1733 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_MOUNT
]) {
1734 Mount
*mount
= MOUNT(u
);
1736 if (!mount
->is_mounted
) {
1738 mount
->from_proc_self_mountinfo
= false;
1740 switch (mount
->state
) {
1743 /* This has just been unmounted by
1744 * somebody else, follow the state
1746 mount_enter_dead(mount
, MOUNT_SUCCESS
);
1753 if (mount
->parameters_proc_self_mountinfo
.what
)
1754 (void) device_found_node(m
, mount
->parameters_proc_self_mountinfo
.what
, false, DEVICE_FOUND_MOUNT
, true);
1757 } else if (mount
->just_mounted
|| mount
->just_changed
) {
1759 /* New or changed mount entry */
1761 switch (mount
->state
) {
1765 /* This has just been mounted by
1766 * somebody else, follow the state
1768 mount_enter_mounted(mount
, MOUNT_SUCCESS
);
1771 case MOUNT_MOUNTING
:
1772 mount_set_state(mount
, MOUNT_MOUNTING_DONE
);
1776 /* Nothing really changed, but let's
1777 * issue an notification call
1778 * nonetheless, in case somebody is
1779 * waiting for this. (e.g. file system
1780 * ro/rw remounts.) */
1781 mount_set_state(mount
, mount
->state
);
1786 /* Reset the flags for later calls */
1787 mount
->is_mounted
= mount
->just_mounted
= mount
->just_changed
= false;
1793 static void mount_reset_failed(Unit
*u
) {
1794 Mount
*m
= MOUNT(u
);
1798 if (m
->state
== MOUNT_FAILED
)
1799 mount_set_state(m
, MOUNT_DEAD
);
1801 m
->result
= MOUNT_SUCCESS
;
1802 m
->reload_result
= MOUNT_SUCCESS
;
1805 static int mount_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
1806 return unit_kill_common(u
, who
, signo
, -1, MOUNT(u
)->control_pid
, error
);
1809 static const char* const mount_state_table
[_MOUNT_STATE_MAX
] = {
1810 [MOUNT_DEAD
] = "dead",
1811 [MOUNT_MOUNTING
] = "mounting",
1812 [MOUNT_MOUNTING_DONE
] = "mounting-done",
1813 [MOUNT_MOUNTED
] = "mounted",
1814 [MOUNT_REMOUNTING
] = "remounting",
1815 [MOUNT_UNMOUNTING
] = "unmounting",
1816 [MOUNT_MOUNTING_SIGTERM
] = "mounting-sigterm",
1817 [MOUNT_MOUNTING_SIGKILL
] = "mounting-sigkill",
1818 [MOUNT_REMOUNTING_SIGTERM
] = "remounting-sigterm",
1819 [MOUNT_REMOUNTING_SIGKILL
] = "remounting-sigkill",
1820 [MOUNT_UNMOUNTING_SIGTERM
] = "unmounting-sigterm",
1821 [MOUNT_UNMOUNTING_SIGKILL
] = "unmounting-sigkill",
1822 [MOUNT_FAILED
] = "failed"
1825 DEFINE_STRING_TABLE_LOOKUP(mount_state
, MountState
);
1827 static const char* const mount_exec_command_table
[_MOUNT_EXEC_COMMAND_MAX
] = {
1828 [MOUNT_EXEC_MOUNT
] = "ExecMount",
1829 [MOUNT_EXEC_UNMOUNT
] = "ExecUnmount",
1830 [MOUNT_EXEC_REMOUNT
] = "ExecRemount",
1833 DEFINE_STRING_TABLE_LOOKUP(mount_exec_command
, MountExecCommand
);
1835 static const char* const mount_result_table
[_MOUNT_RESULT_MAX
] = {
1836 [MOUNT_SUCCESS
] = "success",
1837 [MOUNT_FAILURE_RESOURCES
] = "resources",
1838 [MOUNT_FAILURE_TIMEOUT
] = "timeout",
1839 [MOUNT_FAILURE_EXIT_CODE
] = "exit-code",
1840 [MOUNT_FAILURE_SIGNAL
] = "signal",
1841 [MOUNT_FAILURE_CORE_DUMP
] = "core-dump"
1844 DEFINE_STRING_TABLE_LOOKUP(mount_result
, MountResult
);
1846 const UnitVTable mount_vtable
= {
1847 .object_size
= sizeof(Mount
),
1848 .exec_context_offset
= offsetof(Mount
, exec_context
),
1849 .cgroup_context_offset
= offsetof(Mount
, cgroup_context
),
1850 .kill_context_offset
= offsetof(Mount
, kill_context
),
1851 .exec_runtime_offset
= offsetof(Mount
, exec_runtime
),
1857 .private_section
= "Mount",
1860 .no_instances
= true,
1866 .coldplug
= mount_coldplug
,
1870 .start
= mount_start
,
1872 .reload
= mount_reload
,
1876 .serialize
= mount_serialize
,
1877 .deserialize_item
= mount_deserialize_item
,
1879 .active_state
= mount_active_state
,
1880 .sub_state_to_string
= mount_sub_state_to_string
,
1882 .check_gc
= mount_check_gc
,
1884 .sigchld_event
= mount_sigchld_event
,
1886 .reset_failed
= mount_reset_failed
,
1888 .bus_interface
= "org.freedesktop.systemd1.Mount",
1889 .bus_vtable
= bus_mount_vtable
,
1890 .bus_set_property
= bus_mount_set_property
,
1891 .bus_commit_properties
= bus_mount_commit_properties
,
1893 .get_timeout
= mount_get_timeout
,
1895 .can_transient
= true,
1897 .enumerate
= mount_enumerate
,
1898 .shutdown
= mount_shutdown
,
1900 .status_message_formats
= {
1901 .starting_stopping
= {
1902 [0] = "Mounting %s...",
1903 [1] = "Unmounting %s...",
1905 .finished_start_job
= {
1906 [JOB_DONE
] = "Mounted %s.",
1907 [JOB_FAILED
] = "Failed to mount %s.",
1908 [JOB_DEPENDENCY
] = "Dependency failed for %s.",
1909 [JOB_TIMEOUT
] = "Timed out mounting %s.",
1911 .finished_stop_job
= {
1912 [JOB_DONE
] = "Unmounted %s.",
1913 [JOB_FAILED
] = "Failed unmounting %s.",
1914 [JOB_TIMEOUT
] = "Timed out unmounting %s.",