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 General Public License as published by
10 the Free Software Foundation; either version 2 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 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 #include <sys/epoll.h>
30 #include "load-fragment.h"
31 #include "load-dropin.h"
34 #include "mount-setup.h"
35 #include "unit-name.h"
36 #include "dbus-mount.h"
38 #include "bus-errors.h"
39 #include "exit-status.h"
42 static const UnitActiveState state_translation_table
[_MOUNT_STATE_MAX
] = {
43 [MOUNT_DEAD
] = UNIT_INACTIVE
,
44 [MOUNT_MOUNTING
] = UNIT_ACTIVATING
,
45 [MOUNT_MOUNTING_DONE
] = UNIT_ACTIVE
,
46 [MOUNT_MOUNTED
] = UNIT_ACTIVE
,
47 [MOUNT_REMOUNTING
] = UNIT_RELOADING
,
48 [MOUNT_UNMOUNTING
] = UNIT_DEACTIVATING
,
49 [MOUNT_MOUNTING_SIGTERM
] = UNIT_DEACTIVATING
,
50 [MOUNT_MOUNTING_SIGKILL
] = UNIT_DEACTIVATING
,
51 [MOUNT_REMOUNTING_SIGTERM
] = UNIT_RELOADING
,
52 [MOUNT_REMOUNTING_SIGKILL
] = UNIT_RELOADING
,
53 [MOUNT_UNMOUNTING_SIGTERM
] = UNIT_DEACTIVATING
,
54 [MOUNT_UNMOUNTING_SIGKILL
] = UNIT_DEACTIVATING
,
55 [MOUNT_FAILED
] = UNIT_FAILED
58 static void mount_init(Unit
*u
) {
62 assert(u
->meta
.load_state
== UNIT_STUB
);
64 m
->timeout_usec
= DEFAULT_TIMEOUT_USEC
;
65 m
->directory_mode
= 0755;
67 exec_context_init(&m
->exec_context
);
68 m
->exec_context
.std_output
= EXEC_OUTPUT_KMSG
;
70 /* We need to make sure that /bin/mount is always called in
71 * the same process group as us, so that the autofs kernel
72 * side doesn't send us another mount request while we are
73 * already trying to comply its last one. */
74 m
->exec_context
.same_pgrp
= true;
76 m
->timer_watch
.type
= WATCH_INVALID
;
78 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
81 static void mount_unwatch_control_pid(Mount
*m
) {
84 if (m
->control_pid
<= 0)
87 unit_unwatch_pid(UNIT(m
), m
->control_pid
);
91 static void mount_parameters_done(MountParameters
*p
) {
98 p
->what
= p
->options
= p
->fstype
= NULL
;
101 static void mount_done(Unit
*u
) {
110 /* Try to detach us from the automount unit if there is any */
111 LIST_FOREACH(units_per_type
, other
, m
->meta
.manager
->units_per_type
[UNIT_AUTOMOUNT
]) {
112 Automount
*a
= (Automount
*) other
;
118 mount_parameters_done(&m
->parameters_etc_fstab
);
119 mount_parameters_done(&m
->parameters_proc_self_mountinfo
);
120 mount_parameters_done(&m
->parameters_fragment
);
122 exec_context_done(&m
->exec_context
);
123 exec_command_done_array(m
->exec_command
, _MOUNT_EXEC_COMMAND_MAX
);
124 m
->control_command
= NULL
;
126 mount_unwatch_control_pid(m
);
128 unit_unwatch_timer(u
, &m
->timer_watch
);
131 static MountParameters
* get_mount_parameters_configured(Mount
*m
) {
134 if (m
->from_fragment
)
135 return &m
->parameters_fragment
;
136 else if (m
->from_etc_fstab
)
137 return &m
->parameters_etc_fstab
;
142 static MountParameters
* get_mount_parameters(Mount
*m
) {
145 if (m
->from_proc_self_mountinfo
)
146 return &m
->parameters_proc_self_mountinfo
;
148 return get_mount_parameters_configured(m
);
151 static int mount_add_mount_links(Mount
*m
) {
158 pm
= get_mount_parameters_configured(m
);
160 /* Adds in links to other mount points that might lie below or
161 * above us in the hierarchy */
163 LIST_FOREACH(units_per_type
, other
, m
->meta
.manager
->units_per_type
[UNIT_MOUNT
]) {
164 Mount
*n
= (Mount
*) other
;
170 if (n
->meta
.load_state
!= UNIT_LOADED
)
173 pn
= get_mount_parameters_configured(n
);
175 if (path_startswith(m
->where
, n
->where
)) {
177 if ((r
= unit_add_dependency(UNIT(m
), UNIT_AFTER
, UNIT(n
), true)) < 0)
181 if ((r
= unit_add_dependency(UNIT(m
), UNIT_REQUIRES
, UNIT(n
), true)) < 0)
184 } else if (path_startswith(n
->where
, m
->where
)) {
186 if ((r
= unit_add_dependency(UNIT(n
), UNIT_AFTER
, UNIT(m
), true)) < 0)
190 if ((r
= unit_add_dependency(UNIT(n
), UNIT_REQUIRES
, UNIT(m
), true)) < 0)
193 } else if (pm
&& path_startswith(pm
->what
, n
->where
)) {
195 if ((r
= unit_add_dependency(UNIT(m
), UNIT_AFTER
, UNIT(n
), true)) < 0)
198 if ((r
= unit_add_dependency(UNIT(m
), UNIT_REQUIRES
, UNIT(n
), true)) < 0)
201 } else if (pn
&& path_startswith(pn
->what
, m
->where
)) {
203 if ((r
= unit_add_dependency(UNIT(n
), UNIT_AFTER
, UNIT(m
), true)) < 0)
206 if ((r
= unit_add_dependency(UNIT(n
), UNIT_REQUIRES
, UNIT(m
), true)) < 0)
214 static int mount_add_swap_links(Mount
*m
) {
220 LIST_FOREACH(units_per_type
, other
, m
->meta
.manager
->units_per_type
[UNIT_SWAP
])
221 if ((r
= swap_add_one_mount_link((Swap
*) other
, m
)) < 0)
227 static int mount_add_path_links(Mount
*m
) {
233 LIST_FOREACH(units_per_type
, other
, m
->meta
.manager
->units_per_type
[UNIT_PATH
])
234 if ((r
= path_add_one_mount_link((Path
*) other
, m
)) < 0)
240 static int mount_add_automount_links(Mount
*m
) {
246 LIST_FOREACH(units_per_type
, other
, m
->meta
.manager
->units_per_type
[UNIT_AUTOMOUNT
])
247 if ((r
= automount_add_one_mount_link((Automount
*) other
, m
)) < 0)
253 static int mount_add_socket_links(Mount
*m
) {
259 LIST_FOREACH(units_per_type
, other
, m
->meta
.manager
->units_per_type
[UNIT_SOCKET
])
260 if ((r
= socket_add_one_mount_link((Socket
*) other
, m
)) < 0)
266 static char* mount_test_option(const char *haystack
, const char *needle
) {
271 /* Like glibc's hasmntopt(), but works on a string, not a
278 me
.mnt_opts
= (char*) haystack
;
280 return hasmntopt(&me
, needle
);
283 static bool mount_is_network(MountParameters
*p
) {
286 if (mount_test_option(p
->options
, "_netdev"))
289 if (p
->fstype
&& fstype_is_network(p
->fstype
))
295 static bool mount_is_bind(MountParameters
*p
) {
298 if (mount_test_option(p
->options
, "bind"))
301 if (p
->fstype
&& streq(p
->fstype
, "bind"))
307 static bool needs_quota(MountParameters
*p
) {
310 if (mount_is_network(p
))
313 if (mount_is_bind(p
))
316 return mount_test_option(p
->options
, "usrquota") ||
317 mount_test_option(p
->options
, "grpquota");
320 static int mount_add_target_links(Mount
*m
) {
321 const char *target
, *after
= NULL
;
325 bool noauto
, nofail
, handle
, automount
;
329 if (!(p
= get_mount_parameters_configured(m
)))
332 noauto
= !!mount_test_option(p
->options
, MNTOPT_NOAUTO
);
333 nofail
= !!mount_test_option(p
->options
, "nofail");
335 mount_test_option(p
->options
, "comment=systemd.mount") ||
336 mount_test_option(p
->options
, "x-systemd-mount") ||
337 m
->meta
.manager
->mount_auto
;
339 mount_test_option(p
->options
, "comment=systemd.automount") ||
340 mount_test_option(p
->options
, "x-systemd-automount");
342 if (mount_is_network(p
)) {
343 target
= SPECIAL_REMOTE_FS_TARGET
;
345 if (m
->meta
.manager
->running_as
== MANAGER_SYSTEM
)
346 after
= SPECIAL_NETWORK_TARGET
;
348 target
= SPECIAL_LOCAL_FS_TARGET
;
350 if ((r
= manager_load_unit(m
->meta
.manager
, target
, NULL
, NULL
, &tu
)) < 0)
354 if ((r
= unit_add_dependency_by_name(UNIT(m
), UNIT_AFTER
, after
, NULL
, true)) < 0)
357 if (automount
&& m
->meta
.manager
->running_as
== MANAGER_SYSTEM
) {
360 if ((r
= unit_load_related_unit(UNIT(m
), ".automount", &am
)) < 0)
363 return unit_add_two_dependencies(tu
, UNIT_AFTER
, UNIT_WANTS
, UNIT(am
), true);
366 /* Automatically add mount points that aren't natively
367 * configured to local-fs.target */
372 m
->meta
.manager
->running_as
== MANAGER_SYSTEM
)
373 if ((r
= unit_add_dependency(tu
, UNIT_WANTS
, UNIT(m
), true)) < 0)
376 return unit_add_dependency(UNIT(m
), UNIT_BEFORE
, tu
, true);
380 static int mount_add_device_links(Mount
*m
) {
386 if (!(p
= get_mount_parameters_configured(m
)))
392 if (!mount_is_bind(p
) && !path_equal(m
->where
, "/")) {
395 noauto
= !!mount_test_option(p
->options
, MNTOPT_NOAUTO
);
396 nofail
= !!mount_test_option(p
->options
, "nofail");
398 if ((r
= unit_add_node_link(UNIT(m
), p
->what
,
400 UNIT(m
)->meta
.manager
->running_as
== MANAGER_SYSTEM
)) < 0)
406 UNIT(m
)->meta
.manager
->running_as
== MANAGER_SYSTEM
&&
407 !path_equal(m
->where
, "/")) {
410 /* Let's add in the fsck service */
412 /* aka SPECIAL_FSCK_SERVICE */
413 if (!(name
= unit_name_from_path_instance("fsck", p
->what
, ".service")))
416 if ((r
= manager_load_unit_prepare(m
->meta
.manager
, name
, NULL
, NULL
, &fsck
)) < 0) {
417 log_warning("Failed to prepare unit %s: %s", name
, strerror(-r
));
424 SERVICE(fsck
)->fsck_passno
= p
->passno
;
426 if ((r
= unit_add_two_dependencies(UNIT(m
), UNIT_AFTER
, UNIT_REQUIRES
, fsck
, true)) < 0)
433 static int mount_add_default_dependencies(Mount
*m
) {
438 if (m
->meta
.manager
->running_as
== MANAGER_SYSTEM
&&
439 !path_equal(m
->where
, "/")) {
442 p
= get_mount_parameters_configured(m
);
444 if (p
&& needs_quota(p
)) {
445 if ((r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_WANTS
, SPECIAL_QUOTACHECK_SERVICE
, NULL
, true)) < 0 ||
446 (r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_WANTS
, SPECIAL_QUOTAON_SERVICE
, NULL
, true)) < 0)
450 if ((r
= unit_add_two_dependencies_by_name(UNIT(m
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true)) < 0)
457 static int mount_verify(Mount
*m
) {
462 if (m
->meta
.load_state
!= UNIT_LOADED
)
465 if (!m
->from_etc_fstab
&& !m
->from_fragment
&& !m
->from_proc_self_mountinfo
)
468 if (!(e
= unit_name_from_path(m
->where
, ".mount")))
471 b
= unit_has_name(UNIT(m
), e
);
475 log_error("%s's Where setting doesn't match unit name. Refusing.", m
->meta
.id
);
479 if (m
->meta
.fragment_path
&& !m
->parameters_fragment
.what
) {
480 log_error("%s's What setting is missing. Refusing.", m
->meta
.id
);
484 if (m
->exec_context
.pam_name
&& m
->exec_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
485 log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", m
->meta
.id
);
492 static int mount_load(Unit
*u
) {
497 assert(u
->meta
.load_state
== UNIT_STUB
);
499 if ((r
= unit_load_fragment_and_dropin_optional(u
)) < 0)
502 /* This is a new unit? Then let's add in some extras */
503 if (u
->meta
.load_state
== UNIT_LOADED
) {
504 if ((r
= unit_add_exec_dependencies(u
, &m
->exec_context
)) < 0)
507 if (m
->meta
.fragment_path
)
508 m
->from_fragment
= true;
511 if (!(m
->where
= unit_name_to_path(u
->meta
.id
)))
514 path_kill_slashes(m
->where
);
516 if (!m
->meta
.description
)
517 if ((r
= unit_set_description(u
, m
->where
)) < 0)
520 if ((r
= mount_add_device_links(m
)) < 0)
523 if ((r
= mount_add_mount_links(m
)) < 0)
526 if ((r
= mount_add_socket_links(m
)) < 0)
529 if ((r
= mount_add_swap_links(m
)) < 0)
532 if ((r
= mount_add_path_links(m
)) < 0)
535 if ((r
= mount_add_automount_links(m
)) < 0)
538 if ((r
= mount_add_target_links(m
)) < 0)
541 if ((r
= unit_add_default_cgroups(u
)) < 0)
544 if (m
->meta
.default_dependencies
)
545 if ((r
= mount_add_default_dependencies(m
)) < 0)
549 return mount_verify(m
);
552 static int mount_notify_automount(Mount
*m
, int status
) {
558 if ((r
= unit_get_related_unit(UNIT(m
), ".automount", &p
)) < 0)
559 return r
== -ENOENT
? 0 : r
;
561 return automount_send_ready(AUTOMOUNT(p
), status
);
564 static void mount_set_state(Mount
*m
, MountState state
) {
565 MountState old_state
;
568 old_state
= m
->state
;
571 if (state
!= MOUNT_MOUNTING
&&
572 state
!= MOUNT_MOUNTING_DONE
&&
573 state
!= MOUNT_REMOUNTING
&&
574 state
!= MOUNT_UNMOUNTING
&&
575 state
!= MOUNT_MOUNTING_SIGTERM
&&
576 state
!= MOUNT_MOUNTING_SIGKILL
&&
577 state
!= MOUNT_UNMOUNTING_SIGTERM
&&
578 state
!= MOUNT_UNMOUNTING_SIGKILL
&&
579 state
!= MOUNT_REMOUNTING_SIGTERM
&&
580 state
!= MOUNT_REMOUNTING_SIGKILL
) {
581 unit_unwatch_timer(UNIT(m
), &m
->timer_watch
);
582 mount_unwatch_control_pid(m
);
583 m
->control_command
= NULL
;
584 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
587 if (state
== MOUNT_MOUNTED
||
588 state
== MOUNT_REMOUNTING
)
589 mount_notify_automount(m
, 0);
590 else if (state
== MOUNT_DEAD
||
591 state
== MOUNT_UNMOUNTING
||
592 state
== MOUNT_MOUNTING_SIGTERM
||
593 state
== MOUNT_MOUNTING_SIGKILL
||
594 state
== MOUNT_REMOUNTING_SIGTERM
||
595 state
== MOUNT_REMOUNTING_SIGKILL
||
596 state
== MOUNT_UNMOUNTING_SIGTERM
||
597 state
== MOUNT_UNMOUNTING_SIGKILL
||
598 state
== MOUNT_FAILED
)
599 mount_notify_automount(m
, -ENODEV
);
601 if (state
!= old_state
)
602 log_debug("%s changed %s -> %s",
604 mount_state_to_string(old_state
),
605 mount_state_to_string(state
));
607 unit_notify(UNIT(m
), state_translation_table
[old_state
], state_translation_table
[state
], !m
->reload_failure
);
608 m
->reload_failure
= false;
611 static int mount_coldplug(Unit
*u
) {
613 MountState new_state
= MOUNT_DEAD
;
617 assert(m
->state
== MOUNT_DEAD
);
619 if (m
->deserialized_state
!= m
->state
)
620 new_state
= m
->deserialized_state
;
621 else if (m
->from_proc_self_mountinfo
)
622 new_state
= MOUNT_MOUNTED
;
624 if (new_state
!= m
->state
) {
626 if (new_state
== MOUNT_MOUNTING
||
627 new_state
== MOUNT_MOUNTING_DONE
||
628 new_state
== MOUNT_REMOUNTING
||
629 new_state
== MOUNT_UNMOUNTING
||
630 new_state
== MOUNT_MOUNTING_SIGTERM
||
631 new_state
== MOUNT_MOUNTING_SIGKILL
||
632 new_state
== MOUNT_UNMOUNTING_SIGTERM
||
633 new_state
== MOUNT_UNMOUNTING_SIGKILL
||
634 new_state
== MOUNT_REMOUNTING_SIGTERM
||
635 new_state
== MOUNT_REMOUNTING_SIGKILL
) {
637 if (m
->control_pid
<= 0)
640 if ((r
= unit_watch_pid(UNIT(m
), m
->control_pid
)) < 0)
643 if ((r
= unit_watch_timer(UNIT(m
), m
->timeout_usec
, &m
->timer_watch
)) < 0)
647 mount_set_state(m
, new_state
);
653 static void mount_dump(Unit
*u
, FILE *f
, const char *prefix
) {
660 p
= get_mount_parameters(m
);
663 "%sMount State: %s\n"
666 "%sFile System Type: %s\n"
668 "%sFrom /etc/fstab: %s\n"
669 "%sFrom /proc/self/mountinfo: %s\n"
670 "%sFrom fragment: %s\n"
671 "%sDirectoryMode: %04o\n",
672 prefix
, mount_state_to_string(m
->state
),
674 prefix
, strna(p
->what
),
675 prefix
, strna(p
->fstype
),
676 prefix
, strna(p
->options
),
677 prefix
, yes_no(m
->from_etc_fstab
),
678 prefix
, yes_no(m
->from_proc_self_mountinfo
),
679 prefix
, yes_no(m
->from_fragment
),
680 prefix
, m
->directory_mode
);
682 if (m
->control_pid
> 0)
684 "%sControl PID: %lu\n",
685 prefix
, (unsigned long) m
->control_pid
);
687 exec_context_dump(&m
->exec_context
, f
, prefix
);
690 static int mount_spawn(Mount
*m
, ExecCommand
*c
, pid_t
*_pid
) {
698 if ((r
= unit_watch_timer(UNIT(m
), m
->timeout_usec
, &m
->timer_watch
)) < 0)
701 if ((r
= exec_spawn(c
,
705 m
->meta
.manager
->environment
,
709 m
->meta
.manager
->confirm_spawn
,
710 m
->meta
.cgroup_bondings
,
714 if ((r
= unit_watch_pid(UNIT(m
), pid
)) < 0)
715 /* FIXME: we need to do something here */
723 unit_unwatch_timer(UNIT(m
), &m
->timer_watch
);
728 static void mount_enter_dead(Mount
*m
, bool success
) {
734 mount_set_state(m
, m
->failure
? MOUNT_FAILED
: MOUNT_DEAD
);
737 static void mount_enter_mounted(Mount
*m
, bool success
) {
743 mount_set_state(m
, MOUNT_MOUNTED
);
746 static void mount_enter_signal(Mount
*m
, MountState state
, bool success
) {
749 bool wait_for_exit
= false;
756 if (m
->exec_context
.kill_mode
!= KILL_NONE
) {
757 int sig
= (state
== MOUNT_MOUNTING_SIGTERM
||
758 state
== MOUNT_UNMOUNTING_SIGTERM
||
759 state
== MOUNT_REMOUNTING_SIGTERM
) ? m
->exec_context
.kill_signal
: SIGKILL
;
761 if (m
->control_pid
> 0) {
762 if (kill_and_sigcont(m
->control_pid
, sig
) < 0 && errno
!= ESRCH
)
764 log_warning("Failed to kill control process %li: %m", (long) m
->control_pid
);
766 wait_for_exit
= true;
769 if (m
->exec_context
.kill_mode
== KILL_CONTROL_GROUP
) {
771 if (!(pid_set
= set_new(trivial_hash_func
, trivial_compare_func
))) {
776 /* Exclude the control pid from being killed via the cgroup */
777 if (m
->control_pid
> 0)
778 if ((r
= set_put(pid_set
, LONG_TO_PTR(m
->control_pid
))) < 0)
781 if ((r
= cgroup_bonding_kill_list(m
->meta
.cgroup_bondings
, sig
, true, pid_set
)) < 0) {
782 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
783 log_warning("Failed to kill control group: %s", strerror(-r
));
785 wait_for_exit
= true;
793 if ((r
= unit_watch_timer(UNIT(m
), m
->timeout_usec
, &m
->timer_watch
)) < 0)
796 mount_set_state(m
, state
);
797 } else if (state
== MOUNT_REMOUNTING_SIGTERM
|| state
== MOUNT_REMOUNTING_SIGKILL
)
798 mount_enter_mounted(m
, true);
800 mount_enter_dead(m
, true);
805 log_warning("%s failed to kill processes: %s", m
->meta
.id
, strerror(-r
));
807 if (state
== MOUNT_REMOUNTING_SIGTERM
|| state
== MOUNT_REMOUNTING_SIGKILL
)
808 mount_enter_mounted(m
, false);
810 mount_enter_dead(m
, false);
816 static void mount_enter_unmounting(Mount
*m
, bool success
) {
824 m
->control_command_id
= MOUNT_EXEC_UNMOUNT
;
825 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_UNMOUNT
;
827 if ((r
= exec_command_set(
834 mount_unwatch_control_pid(m
);
836 if ((r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
)) < 0)
839 mount_set_state(m
, MOUNT_UNMOUNTING
);
844 log_warning("%s failed to run 'umount' task: %s", m
->meta
.id
, strerror(-r
));
845 mount_enter_mounted(m
, false);
848 static void mount_enter_mounting(Mount
*m
) {
854 m
->control_command_id
= MOUNT_EXEC_MOUNT
;
855 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_MOUNT
;
857 mkdir_p(m
->where
, m
->directory_mode
);
859 /* Create the source directory for bind-mounts if needed */
860 p
= get_mount_parameters_configured(m
);
861 if (p
&& mount_is_bind(p
))
862 mkdir_p(p
->what
, m
->directory_mode
);
864 if (m
->from_fragment
)
865 r
= exec_command_set(
868 m
->parameters_fragment
.what
,
870 "-t", m
->parameters_fragment
.fstype
? m
->parameters_fragment
.fstype
: "auto",
871 m
->parameters_fragment
.options
? "-o" : NULL
, m
->parameters_fragment
.options
,
873 else if (m
->from_etc_fstab
)
874 r
= exec_command_set(
885 mount_unwatch_control_pid(m
);
887 if ((r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
)) < 0)
890 mount_set_state(m
, MOUNT_MOUNTING
);
895 log_warning("%s failed to run 'mount' task: %s", m
->meta
.id
, strerror(-r
));
896 mount_enter_dead(m
, false);
899 static void mount_enter_mounting_done(Mount
*m
) {
902 mount_set_state(m
, MOUNT_MOUNTING_DONE
);
905 static void mount_enter_remounting(Mount
*m
, bool success
) {
913 m
->control_command_id
= MOUNT_EXEC_REMOUNT
;
914 m
->control_command
= m
->exec_command
+ MOUNT_EXEC_REMOUNT
;
916 if (m
->from_fragment
) {
920 if (m
->parameters_fragment
.options
) {
921 if (!(buf
= strappend("remount,", m
->parameters_fragment
.options
))) {
930 r
= exec_command_set(
933 m
->parameters_fragment
.what
,
935 "-t", m
->parameters_fragment
.fstype
? m
->parameters_fragment
.fstype
: "auto",
940 } else if (m
->from_etc_fstab
)
941 r
= exec_command_set(
953 mount_unwatch_control_pid(m
);
955 if ((r
= mount_spawn(m
, m
->control_command
, &m
->control_pid
)) < 0)
958 mount_set_state(m
, MOUNT_REMOUNTING
);
963 log_warning("%s failed to run 'remount' task: %s", m
->meta
.id
, strerror(-r
));
964 m
->reload_failure
= true;
965 mount_enter_mounted(m
, true);
968 static int mount_start(Unit
*u
) {
973 /* We cannot fulfill this request right now, try again later
975 if (m
->state
== MOUNT_UNMOUNTING
||
976 m
->state
== MOUNT_UNMOUNTING_SIGTERM
||
977 m
->state
== MOUNT_UNMOUNTING_SIGKILL
||
978 m
->state
== MOUNT_MOUNTING_SIGTERM
||
979 m
->state
== MOUNT_MOUNTING_SIGKILL
)
983 if (m
->state
== MOUNT_MOUNTING
)
986 assert(m
->state
== MOUNT_DEAD
|| m
->state
== MOUNT_FAILED
);
989 mount_enter_mounting(m
);
993 static int mount_stop(Unit
*u
) {
999 if (m
->state
== MOUNT_UNMOUNTING
||
1000 m
->state
== MOUNT_UNMOUNTING_SIGKILL
||
1001 m
->state
== MOUNT_UNMOUNTING_SIGTERM
||
1002 m
->state
== MOUNT_MOUNTING_SIGTERM
||
1003 m
->state
== MOUNT_MOUNTING_SIGKILL
)
1006 assert(m
->state
== MOUNT_MOUNTING
||
1007 m
->state
== MOUNT_MOUNTING_DONE
||
1008 m
->state
== MOUNT_MOUNTED
||
1009 m
->state
== MOUNT_REMOUNTING
||
1010 m
->state
== MOUNT_REMOUNTING_SIGTERM
||
1011 m
->state
== MOUNT_REMOUNTING_SIGKILL
);
1013 mount_enter_unmounting(m
, true);
1017 static int mount_reload(Unit
*u
) {
1018 Mount
*m
= MOUNT(u
);
1022 if (m
->state
== MOUNT_MOUNTING_DONE
)
1025 assert(m
->state
== MOUNT_MOUNTED
);
1027 mount_enter_remounting(m
, true);
1031 static int mount_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
1032 Mount
*m
= MOUNT(u
);
1038 unit_serialize_item(u
, f
, "state", mount_state_to_string(m
->state
));
1039 unit_serialize_item(u
, f
, "failure", yes_no(m
->failure
));
1041 if (m
->control_pid
> 0)
1042 unit_serialize_item_format(u
, f
, "control-pid", "%lu", (unsigned long) m
->control_pid
);
1044 if (m
->control_command_id
>= 0)
1045 unit_serialize_item(u
, f
, "control-command", mount_exec_command_to_string(m
->control_command_id
));
1050 static int mount_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
1051 Mount
*m
= MOUNT(u
);
1058 if (streq(key
, "state")) {
1061 if ((state
= mount_state_from_string(value
)) < 0)
1062 log_debug("Failed to parse state value %s", value
);
1064 m
->deserialized_state
= state
;
1065 } else if (streq(key
, "failure")) {
1068 if ((b
= parse_boolean(value
)) < 0)
1069 log_debug("Failed to parse failure value %s", value
);
1071 m
->failure
= b
|| m
->failure
;
1073 } else if (streq(key
, "control-pid")) {
1076 if (parse_pid(value
, &pid
) < 0)
1077 log_debug("Failed to parse control-pid value %s", value
);
1079 m
->control_pid
= pid
;
1080 } else if (streq(key
, "control-command")) {
1081 MountExecCommand id
;
1083 if ((id
= mount_exec_command_from_string(value
)) < 0)
1084 log_debug("Failed to parse exec-command value %s", value
);
1086 m
->control_command_id
= id
;
1087 m
->control_command
= m
->exec_command
+ id
;
1091 log_debug("Unknown serialization key '%s'", key
);
1096 static UnitActiveState
mount_active_state(Unit
*u
) {
1099 return state_translation_table
[MOUNT(u
)->state
];
1102 static const char *mount_sub_state_to_string(Unit
*u
) {
1105 return mount_state_to_string(MOUNT(u
)->state
);
1108 static bool mount_check_gc(Unit
*u
) {
1109 Mount
*m
= MOUNT(u
);
1113 return m
->from_etc_fstab
|| m
->from_proc_self_mountinfo
;
1116 static void mount_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
1117 Mount
*m
= MOUNT(u
);
1123 if (pid
!= m
->control_pid
)
1128 success
= is_clean_exit(code
, status
);
1129 m
->failure
= m
->failure
|| !success
;
1131 if (m
->control_command
) {
1132 exec_status_exit(&m
->control_command
->exec_status
, pid
, code
, status
, m
->exec_context
.utmp_id
);
1133 m
->control_command
= NULL
;
1134 m
->control_command_id
= _MOUNT_EXEC_COMMAND_INVALID
;
1137 log_full(success
? LOG_DEBUG
: LOG_NOTICE
,
1138 "%s mount process exited, code=%s status=%i", u
->meta
.id
, sigchld_code_to_string(code
), status
);
1140 /* Note that mount(8) returning and the kernel sending us a
1141 * mount table change event might happen out-of-order. If an
1142 * operation succeed we assume the kernel will follow soon too
1143 * and already change into the resulting state. If it fails
1144 * we check if the kernel still knows about the mount. and
1145 * change state accordingly. */
1149 case MOUNT_MOUNTING
:
1150 case MOUNT_MOUNTING_DONE
:
1151 case MOUNT_MOUNTING_SIGKILL
:
1152 case MOUNT_MOUNTING_SIGTERM
:
1155 mount_enter_mounted(m
, true);
1156 else if (m
->from_proc_self_mountinfo
)
1157 mount_enter_mounted(m
, false);
1159 mount_enter_dead(m
, false);
1162 case MOUNT_REMOUNTING
:
1163 case MOUNT_REMOUNTING_SIGKILL
:
1164 case MOUNT_REMOUNTING_SIGTERM
:
1166 m
->reload_failure
= !success
;
1167 if (m
->from_proc_self_mountinfo
)
1168 mount_enter_mounted(m
, true);
1170 mount_enter_dead(m
, true);
1174 case MOUNT_UNMOUNTING
:
1175 case MOUNT_UNMOUNTING_SIGKILL
:
1176 case MOUNT_UNMOUNTING_SIGTERM
:
1179 mount_enter_dead(m
, true);
1180 else if (m
->from_proc_self_mountinfo
)
1181 mount_enter_mounted(m
, false);
1183 mount_enter_dead(m
, false);
1187 assert_not_reached("Uh, control process died at wrong time.");
1190 /* Notify clients about changed exit status */
1191 unit_add_to_dbus_queue(u
);
1194 static void mount_timer_event(Unit
*u
, uint64_t elapsed
, Watch
*w
) {
1195 Mount
*m
= MOUNT(u
);
1198 assert(elapsed
== 1);
1199 assert(w
== &m
->timer_watch
);
1203 case MOUNT_MOUNTING
:
1204 case MOUNT_MOUNTING_DONE
:
1205 log_warning("%s mounting timed out. Stopping.", u
->meta
.id
);
1206 mount_enter_signal(m
, MOUNT_MOUNTING_SIGTERM
, false);
1209 case MOUNT_REMOUNTING
:
1210 log_warning("%s remounting timed out. Stopping.", u
->meta
.id
);
1211 m
->reload_failure
= true;
1212 mount_enter_mounted(m
, true);
1215 case MOUNT_UNMOUNTING
:
1216 log_warning("%s unmounting timed out. Stopping.", u
->meta
.id
);
1217 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGTERM
, false);
1220 case MOUNT_MOUNTING_SIGTERM
:
1221 if (m
->exec_context
.send_sigkill
) {
1222 log_warning("%s mounting timed out. Killing.", u
->meta
.id
);
1223 mount_enter_signal(m
, MOUNT_MOUNTING_SIGKILL
, false);
1225 log_warning("%s mounting timed out. Skipping SIGKILL. Ignoring.", u
->meta
.id
);
1227 if (m
->from_proc_self_mountinfo
)
1228 mount_enter_mounted(m
, false);
1230 mount_enter_dead(m
, false);
1234 case MOUNT_REMOUNTING_SIGTERM
:
1235 if (m
->exec_context
.send_sigkill
) {
1236 log_warning("%s remounting timed out. Killing.", u
->meta
.id
);
1237 mount_enter_signal(m
, MOUNT_REMOUNTING_SIGKILL
, false);
1239 log_warning("%s remounting timed out. Skipping SIGKILL. Ignoring.", u
->meta
.id
);
1241 if (m
->from_proc_self_mountinfo
)
1242 mount_enter_mounted(m
, false);
1244 mount_enter_dead(m
, false);
1248 case MOUNT_UNMOUNTING_SIGTERM
:
1249 if (m
->exec_context
.send_sigkill
) {
1250 log_warning("%s unmounting timed out. Killing.", u
->meta
.id
);
1251 mount_enter_signal(m
, MOUNT_UNMOUNTING_SIGKILL
, false);
1253 log_warning("%s unmounting timed out. Skipping SIGKILL. Ignoring.", u
->meta
.id
);
1255 if (m
->from_proc_self_mountinfo
)
1256 mount_enter_mounted(m
, false);
1258 mount_enter_dead(m
, false);
1262 case MOUNT_MOUNTING_SIGKILL
:
1263 case MOUNT_REMOUNTING_SIGKILL
:
1264 case MOUNT_UNMOUNTING_SIGKILL
:
1265 log_warning("%s mount process still around after SIGKILL. Ignoring.", u
->meta
.id
);
1267 if (m
->from_proc_self_mountinfo
)
1268 mount_enter_mounted(m
, false);
1270 mount_enter_dead(m
, false);
1274 assert_not_reached("Timeout at wrong time.");
1278 static int mount_add_one(
1282 const char *options
,
1285 bool from_proc_self_mountinfo
,
1290 char *e
, *w
= NULL
, *o
= NULL
, *f
= NULL
;
1299 assert(!set_flags
|| from_proc_self_mountinfo
);
1301 /* Ignore API mount points. They should never be referenced in
1302 * dependencies ever. */
1303 if (mount_point_is_api(where
))
1305 if (mount_point_ignore(where
))
1308 if (streq(fstype
, "autofs"))
1311 /* probably some kind of swap, ignore */
1312 if (!is_path(where
))
1315 if (!(e
= unit_name_from_path(where
, ".mount")))
1318 if (!(u
= manager_get_unit(m
, e
))) {
1321 if (!(u
= unit_new(m
))) {
1326 r
= unit_add_name(u
, e
);
1332 if (!(MOUNT(u
)->where
= strdup(where
))) {
1337 unit_add_to_load_queue(u
);
1343 if (!(w
= strdup(what
)) ||
1344 !(o
= strdup(options
)) ||
1345 !(f
= strdup(fstype
))) {
1350 if (from_proc_self_mountinfo
) {
1351 p
= &MOUNT(u
)->parameters_proc_self_mountinfo
;
1354 MOUNT(u
)->is_mounted
= true;
1355 MOUNT(u
)->just_mounted
= !MOUNT(u
)->from_proc_self_mountinfo
;
1356 MOUNT(u
)->just_changed
= !streq_ptr(p
->options
, o
);
1359 MOUNT(u
)->from_proc_self_mountinfo
= true;
1361 p
= &MOUNT(u
)->parameters_etc_fstab
;
1362 MOUNT(u
)->from_etc_fstab
= true;
1376 unit_add_to_dbus_queue(u
);
1391 static int mount_find_pri(char *options
) {
1395 if (!(pri
= mount_test_option(options
, "pri=")))
1401 r
= strtoul(pri
, &end
, 10);
1406 if (end
== pri
|| (*end
!= ',' && *end
!= 0))
1412 static int mount_load_etc_fstab(Manager
*m
) {
1420 if (!(f
= setmntent("/etc/fstab", "r")))
1423 while ((me
= getmntent(f
))) {
1427 if (!(what
= fstab_node_to_udev_node(me
->mnt_fsname
))) {
1432 if (!(where
= strdup(me
->mnt_dir
))) {
1439 path_kill_slashes(what
);
1441 if (where
[0] == '/')
1442 path_kill_slashes(where
);
1444 if (streq(me
->mnt_type
, "swap")) {
1447 if ((pri
= mount_find_pri(me
->mnt_opts
)) < 0)
1454 !!mount_test_option(me
->mnt_opts
, MNTOPT_NOAUTO
),
1455 !!mount_test_option(me
->mnt_opts
, "nofail"),
1456 !!mount_test_option(me
->mnt_opts
, "comment=systemd.swapon"),
1459 k
= mount_add_one(m
, what
, where
, me
->mnt_opts
, me
->mnt_type
, me
->mnt_passno
, false, false);
1474 static int mount_load_proc_self_mountinfo(Manager
*m
, bool set_flags
) {
1477 char *device
, *path
, *options
, *options2
, *fstype
, *d
, *p
, *o
;
1481 rewind(m
->proc_self_mountinfo
);
1486 device
= path
= options
= options2
= fstype
= d
= p
= o
= NULL
;
1488 if ((k
= fscanf(m
->proc_self_mountinfo
,
1489 "%*s " /* (1) mount id */
1490 "%*s " /* (2) parent id */
1491 "%*s " /* (3) major:minor */
1492 "%*s " /* (4) root */
1493 "%ms " /* (5) mount point */
1494 "%ms" /* (6) mount options */
1495 "%*[^-]" /* (7) optional fields */
1496 "- " /* (8) separator */
1497 "%ms " /* (9) file system type */
1498 "%ms" /* (10) mount source */
1499 "%ms" /* (11) mount options 2 */
1500 "%*[^\n]", /* some rubbish at the end */
1510 log_warning("Failed to parse /proc/self/mountinfo:%u.", i
);
1514 if (asprintf(&o
, "%s,%s", options
, options2
) < 0) {
1519 if (!(d
= cunescape(device
)) ||
1520 !(p
= cunescape(path
))) {
1525 if ((k
= mount_add_one(m
, d
, p
, o
, fstype
, 0, true, set_flags
)) < 0)
1552 static void mount_shutdown(Manager
*m
) {
1555 if (m
->proc_self_mountinfo
) {
1556 fclose(m
->proc_self_mountinfo
);
1557 m
->proc_self_mountinfo
= NULL
;
1561 static int mount_enumerate(Manager
*m
) {
1563 struct epoll_event ev
;
1566 if (!m
->proc_self_mountinfo
) {
1567 if (!(m
->proc_self_mountinfo
= fopen("/proc/self/mountinfo", "re")))
1570 m
->mount_watch
.type
= WATCH_MOUNT
;
1571 m
->mount_watch
.fd
= fileno(m
->proc_self_mountinfo
);
1574 ev
.events
= EPOLLPRI
;
1575 ev
.data
.ptr
= &m
->mount_watch
;
1577 if (epoll_ctl(m
->epoll_fd
, EPOLL_CTL_ADD
, m
->mount_watch
.fd
, &ev
) < 0)
1581 if ((r
= mount_load_etc_fstab(m
)) < 0)
1584 if ((r
= mount_load_proc_self_mountinfo(m
, false)) < 0)
1594 void mount_fd_event(Manager
*m
, int events
) {
1599 assert(events
& EPOLLPRI
);
1601 /* The manager calls this for every fd event happening on the
1602 * /proc/self/mountinfo file, which informs us about mounting
1605 if ((r
= mount_load_proc_self_mountinfo(m
, true)) < 0) {
1606 log_error("Failed to reread /proc/self/mountinfo: %s", strerror(-r
));
1608 /* Reset flags, just in case, for later calls */
1609 LIST_FOREACH(units_per_type
, meta
, m
->units_per_type
[UNIT_MOUNT
]) {
1610 Mount
*mount
= (Mount
*) meta
;
1612 mount
->is_mounted
= mount
->just_mounted
= mount
->just_changed
= false;
1618 manager_dispatch_load_queue(m
);
1620 LIST_FOREACH(units_per_type
, meta
, m
->units_per_type
[UNIT_MOUNT
]) {
1621 Mount
*mount
= (Mount
*) meta
;
1623 if (!mount
->is_mounted
) {
1624 /* This has just been unmounted. */
1626 mount
->from_proc_self_mountinfo
= false;
1628 switch (mount
->state
) {
1631 mount_enter_dead(mount
, true);
1635 mount_set_state(mount
, mount
->state
);
1640 } else if (mount
->just_mounted
|| mount
->just_changed
) {
1642 /* New or changed mount entry */
1644 switch (mount
->state
) {
1648 mount_enter_mounted(mount
, true);
1651 case MOUNT_MOUNTING
:
1652 mount_enter_mounting_done(mount
);
1656 /* Nothing really changed, but let's
1657 * issue an notification call
1658 * nonetheless, in case somebody is
1659 * waiting for this. (e.g. file system
1660 * ro/rw remounts.) */
1661 mount_set_state(mount
, mount
->state
);
1666 /* Reset the flags for later calls */
1667 mount
->is_mounted
= mount
->just_mounted
= mount
->just_changed
= false;
1671 static void mount_reset_failed(Unit
*u
) {
1672 Mount
*m
= MOUNT(u
);
1676 if (m
->state
== MOUNT_FAILED
)
1677 mount_set_state(m
, MOUNT_DEAD
);
1682 static int mount_kill(Unit
*u
, KillWho who
, KillMode mode
, int signo
, DBusError
*error
) {
1683 Mount
*m
= MOUNT(u
);
1685 Set
*pid_set
= NULL
;
1689 if (who
== KILL_MAIN
) {
1690 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "Mount units have no main processes");
1694 if (m
->control_pid
<= 0 && who
== KILL_CONTROL
) {
1695 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
1699 if (m
->control_pid
> 0)
1700 if (kill(m
->control_pid
, signo
) < 0)
1703 if (mode
== KILL_CONTROL_GROUP
) {
1706 if (!(pid_set
= set_new(trivial_hash_func
, trivial_compare_func
)))
1709 /* Exclude the control pid from being killed via the cgroup */
1710 if (m
->control_pid
> 0)
1711 if ((q
= set_put(pid_set
, LONG_TO_PTR(m
->control_pid
))) < 0) {
1716 if ((q
= cgroup_bonding_kill_list(m
->meta
.cgroup_bondings
, signo
, false, pid_set
)) < 0)
1717 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
1728 static const char* const mount_state_table
[_MOUNT_STATE_MAX
] = {
1729 [MOUNT_DEAD
] = "dead",
1730 [MOUNT_MOUNTING
] = "mounting",
1731 [MOUNT_MOUNTING_DONE
] = "mounting-done",
1732 [MOUNT_MOUNTED
] = "mounted",
1733 [MOUNT_REMOUNTING
] = "remounting",
1734 [MOUNT_UNMOUNTING
] = "unmounting",
1735 [MOUNT_MOUNTING_SIGTERM
] = "mounting-sigterm",
1736 [MOUNT_MOUNTING_SIGKILL
] = "mounting-sigkill",
1737 [MOUNT_REMOUNTING_SIGTERM
] = "remounting-sigterm",
1738 [MOUNT_REMOUNTING_SIGKILL
] = "remounting-sigkill",
1739 [MOUNT_UNMOUNTING_SIGTERM
] = "unmounting-sigterm",
1740 [MOUNT_UNMOUNTING_SIGKILL
] = "unmounting-sigkill",
1741 [MOUNT_FAILED
] = "failed"
1744 DEFINE_STRING_TABLE_LOOKUP(mount_state
, MountState
);
1746 static const char* const mount_exec_command_table
[_MOUNT_EXEC_COMMAND_MAX
] = {
1747 [MOUNT_EXEC_MOUNT
] = "ExecMount",
1748 [MOUNT_EXEC_UNMOUNT
] = "ExecUnmount",
1749 [MOUNT_EXEC_REMOUNT
] = "ExecRemount",
1752 DEFINE_STRING_TABLE_LOOKUP(mount_exec_command
, MountExecCommand
);
1754 const UnitVTable mount_vtable
= {
1758 .no_instances
= true,
1760 .show_status
= true,
1766 .coldplug
= mount_coldplug
,
1770 .start
= mount_start
,
1772 .reload
= mount_reload
,
1776 .serialize
= mount_serialize
,
1777 .deserialize_item
= mount_deserialize_item
,
1779 .active_state
= mount_active_state
,
1780 .sub_state_to_string
= mount_sub_state_to_string
,
1782 .check_gc
= mount_check_gc
,
1784 .sigchld_event
= mount_sigchld_event
,
1785 .timer_event
= mount_timer_event
,
1787 .reset_failed
= mount_reset_failed
,
1789 .bus_interface
= "org.freedesktop.systemd1.Mount",
1790 .bus_message_handler
= bus_mount_message_handler
,
1791 .bus_invalidating_properties
= bus_mount_invalidating_properties
,
1793 .enumerate
= mount_enumerate
,
1794 .shutdown
= mount_shutdown