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/>.
23 #include <sys/epoll.h>
29 #include "dbus-swap.h"
31 #include "exit-status.h"
33 #include "formats-util.h"
34 #include "fstab-util.h"
35 #include "parse-util.h"
36 #include "path-util.h"
38 #include "string-table.h"
39 #include "string-util.h"
41 #include "udev-util.h"
42 #include "unit-name.h"
46 static const UnitActiveState state_translation_table
[_SWAP_STATE_MAX
] = {
47 [SWAP_DEAD
] = UNIT_INACTIVE
,
48 [SWAP_ACTIVATING
] = UNIT_ACTIVATING
,
49 [SWAP_ACTIVATING_DONE
] = UNIT_ACTIVE
,
50 [SWAP_ACTIVE
] = UNIT_ACTIVE
,
51 [SWAP_DEACTIVATING
] = UNIT_DEACTIVATING
,
52 [SWAP_ACTIVATING_SIGTERM
] = UNIT_DEACTIVATING
,
53 [SWAP_ACTIVATING_SIGKILL
] = UNIT_DEACTIVATING
,
54 [SWAP_DEACTIVATING_SIGTERM
] = UNIT_DEACTIVATING
,
55 [SWAP_DEACTIVATING_SIGKILL
] = UNIT_DEACTIVATING
,
56 [SWAP_FAILED
] = UNIT_FAILED
59 static int swap_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
60 static int swap_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
62 static void swap_unset_proc_swaps(Swap
*s
) {
65 if (!s
->from_proc_swaps
)
68 s
->parameters_proc_swaps
.what
= mfree(s
->parameters_proc_swaps
.what
);
70 s
->from_proc_swaps
= false;
73 static int swap_set_devnode(Swap
*s
, const char *devnode
) {
80 r
= hashmap_ensure_allocated(&UNIT(s
)->manager
->swaps_by_devnode
, &string_hash_ops
);
84 swaps
= UNIT(s
)->manager
->swaps_by_devnode
;
87 first
= hashmap_get(swaps
, s
->devnode
);
89 LIST_REMOVE(same_devnode
, first
, s
);
91 hashmap_replace(swaps
, first
->devnode
, first
);
93 hashmap_remove(swaps
, s
->devnode
);
95 s
->devnode
= mfree(s
->devnode
);
99 s
->devnode
= strdup(devnode
);
103 first
= hashmap_get(swaps
, s
->devnode
);
104 LIST_PREPEND(same_devnode
, first
, s
);
106 return hashmap_replace(swaps
, first
->devnode
, first
);
112 static void swap_init(Unit
*u
) {
116 assert(UNIT(s
)->load_state
== UNIT_STUB
);
118 s
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
120 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
121 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
123 s
->parameters_proc_swaps
.priority
= s
->parameters_fragment
.priority
= -1;
125 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
127 u
->ignore_on_isolate
= true;
130 static void swap_unwatch_control_pid(Swap
*s
) {
133 if (s
->control_pid
<= 0)
136 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
140 static void swap_done(Unit
*u
) {
145 swap_unset_proc_swaps(s
);
146 swap_set_devnode(s
, NULL
);
148 s
->what
= mfree(s
->what
);
149 s
->parameters_fragment
.what
= mfree(s
->parameters_fragment
.what
);
150 s
->parameters_fragment
.options
= mfree(s
->parameters_fragment
.options
);
152 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
153 exec_command_done_array(s
->exec_command
, _SWAP_EXEC_COMMAND_MAX
);
154 s
->control_command
= NULL
;
156 swap_unwatch_control_pid(s
);
158 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
161 static int swap_arm_timer(Swap
*s
) {
166 if (s
->timeout_usec
<= 0) {
167 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
171 if (s
->timer_event_source
) {
172 r
= sd_event_source_set_time(s
->timer_event_source
, now(CLOCK_MONOTONIC
) + s
->timeout_usec
);
176 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
179 r
= sd_event_add_time(
180 UNIT(s
)->manager
->event
,
181 &s
->timer_event_source
,
183 now(CLOCK_MONOTONIC
) + s
->timeout_usec
, 0,
184 swap_dispatch_timer
, s
);
188 (void) sd_event_source_set_description(s
->timer_event_source
, "swap-timer");
193 static int swap_add_device_links(Swap
*s
) {
199 if (!s
->from_fragment
)
202 if (is_device_path(s
->what
))
203 return unit_add_node_link(UNIT(s
), s
->what
, UNIT(s
)->manager
->running_as
== MANAGER_SYSTEM
);
205 /* File based swap devices need to be ordered after
206 * systemd-remount-fs.service, since they might need a
207 * writable file system. */
208 return unit_add_dependency_by_name(UNIT(s
), UNIT_AFTER
, SPECIAL_REMOUNT_FS_SERVICE
, NULL
, true);
211 static int swap_add_default_dependencies(Swap
*s
) {
214 if (UNIT(s
)->manager
->running_as
!= MANAGER_SYSTEM
)
217 if (detect_container() > 0)
220 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
223 static int swap_verify(Swap
*s
) {
224 _cleanup_free_
char *e
= NULL
;
227 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
230 r
= unit_name_from_path(s
->what
, ".swap", &e
);
232 return log_unit_error_errno(UNIT(s
), r
, "Failed to generate unit name from path: %m");
234 if (!unit_has_name(UNIT(s
), e
)) {
235 log_unit_error(UNIT(s
), "Value of What= and unit name do not match, not loading.");
239 if (s
->exec_context
.pam_name
&& s
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
240 log_unit_error(UNIT(s
), "Unit has PAM enabled. Kill mode must be set to 'control-group'. Refusing to load.");
247 static int swap_load_devnode(Swap
*s
) {
248 _cleanup_udev_device_unref_
struct udev_device
*d
= NULL
;
254 if (stat(s
->what
, &st
) < 0 || !S_ISBLK(st
.st_mode
))
257 d
= udev_device_new_from_devnum(UNIT(s
)->manager
->udev
, 'b', st
.st_rdev
);
261 p
= udev_device_get_devnode(d
);
265 return swap_set_devnode(s
, p
);
268 static int swap_load(Unit
*u
) {
273 assert(u
->load_state
== UNIT_STUB
);
275 /* Load a .swap file */
276 r
= unit_load_fragment_and_dropin_optional(u
);
280 if (u
->load_state
== UNIT_LOADED
) {
282 if (UNIT(s
)->fragment_path
)
283 s
->from_fragment
= true;
286 if (s
->parameters_fragment
.what
)
287 s
->what
= strdup(s
->parameters_fragment
.what
);
288 else if (s
->parameters_proc_swaps
.what
)
289 s
->what
= strdup(s
->parameters_proc_swaps
.what
);
291 r
= unit_name_to_path(u
->id
, &s
->what
);
300 path_kill_slashes(s
->what
);
302 if (!UNIT(s
)->description
) {
303 r
= unit_set_description(u
, s
->what
);
308 r
= unit_require_mounts_for(UNIT(s
), s
->what
);
312 r
= swap_add_device_links(s
);
316 r
= swap_load_devnode(s
);
320 r
= unit_patch_contexts(u
);
324 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
328 r
= unit_set_default_slice(u
);
332 if (UNIT(s
)->default_dependencies
) {
333 r
= swap_add_default_dependencies(s
);
339 return swap_verify(s
);
342 static int swap_setup_unit(
345 const char *what_proc_swaps
,
349 _cleanup_free_
char *e
= NULL
;
357 assert(what_proc_swaps
);
359 r
= unit_name_from_path(what
, ".swap", &e
);
361 return log_unit_error_errno(u
, r
, "Failed to generate unit name from path: %m");
363 u
= manager_get_unit(m
, e
);
366 SWAP(u
)->from_proc_swaps
&&
367 !path_equal(SWAP(u
)->parameters_proc_swaps
.what
, what_proc_swaps
)) {
368 log_error("Swap %s appeared twice with different device paths %s and %s", e
, SWAP(u
)->parameters_proc_swaps
.what
, what_proc_swaps
);
375 u
= unit_new(m
, sizeof(Swap
));
379 r
= unit_add_name(u
, e
);
383 SWAP(u
)->what
= strdup(what
);
384 if (!SWAP(u
)->what
) {
389 unit_add_to_load_queue(u
);
393 p
= &SWAP(u
)->parameters_proc_swaps
;
396 p
->what
= strdup(what_proc_swaps
);
404 SWAP(u
)->is_active
= true;
405 SWAP(u
)->just_activated
= !SWAP(u
)->from_proc_swaps
;
408 SWAP(u
)->from_proc_swaps
= true;
410 p
->priority
= priority
;
412 unit_add_to_dbus_queue(u
);
416 log_unit_warning_errno(u
, r
, "Failed to load swap unit: %m");
424 static int swap_process_new(Manager
*m
, const char *device
, int prio
, bool set_flags
) {
425 _cleanup_udev_device_unref_
struct udev_device
*d
= NULL
;
426 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
433 r
= swap_setup_unit(m
, device
, device
, prio
, set_flags
);
437 /* If this is a block device, then let's add duplicates for
438 * all other names of this block device */
439 if (stat(device
, &st
) < 0 || !S_ISBLK(st
.st_mode
))
442 d
= udev_device_new_from_devnum(m
->udev
, 'b', st
.st_rdev
);
446 /* Add the main device node */
447 dn
= udev_device_get_devnode(d
);
448 if (dn
&& !streq(dn
, device
))
449 swap_setup_unit(m
, dn
, device
, prio
, set_flags
);
451 /* Add additional units for all symlinks */
452 first
= udev_device_get_devlinks_list_entry(d
);
453 udev_list_entry_foreach(item
, first
) {
456 /* Don't bother with the /dev/block links */
457 p
= udev_list_entry_get_name(item
);
459 if (streq(p
, device
))
462 if (path_startswith(p
, "/dev/block/"))
465 if (stat(p
, &st
) >= 0)
466 if (!S_ISBLK(st
.st_mode
) ||
467 st
.st_rdev
!= udev_device_get_devnum(d
))
470 swap_setup_unit(m
, p
, device
, prio
, set_flags
);
476 static void swap_set_state(Swap
*s
, SwapState state
) {
482 old_state
= s
->state
;
485 if (state
!= SWAP_ACTIVATING
&&
486 state
!= SWAP_ACTIVATING_SIGTERM
&&
487 state
!= SWAP_ACTIVATING_SIGKILL
&&
488 state
!= SWAP_ACTIVATING_DONE
&&
489 state
!= SWAP_DEACTIVATING
&&
490 state
!= SWAP_DEACTIVATING_SIGTERM
&&
491 state
!= SWAP_DEACTIVATING_SIGKILL
) {
492 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
493 swap_unwatch_control_pid(s
);
494 s
->control_command
= NULL
;
495 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
498 if (state
!= old_state
)
499 log_unit_debug(UNIT(s
), "Changed %s -> %s", swap_state_to_string(old_state
), swap_state_to_string(state
));
501 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
503 /* If there other units for the same device node have a job
504 queued it might be worth checking again if it is runnable
505 now. This is necessary, since swap_start() refuses
506 operation with EAGAIN if there's already another job for
507 the same device node queued. */
508 LIST_FOREACH_OTHERS(same_devnode
, other
, s
)
509 if (UNIT(other
)->job
)
510 job_add_to_run_queue(UNIT(other
)->job
);
513 static int swap_coldplug(Unit
*u
) {
515 SwapState new_state
= SWAP_DEAD
;
519 assert(s
->state
== SWAP_DEAD
);
521 if (s
->deserialized_state
!= s
->state
)
522 new_state
= s
->deserialized_state
;
523 else if (s
->from_proc_swaps
)
524 new_state
= SWAP_ACTIVE
;
526 if (new_state
== s
->state
)
529 if (new_state
== SWAP_ACTIVATING
||
530 new_state
== SWAP_ACTIVATING_SIGTERM
||
531 new_state
== SWAP_ACTIVATING_SIGKILL
||
532 new_state
== SWAP_ACTIVATING_DONE
||
533 new_state
== SWAP_DEACTIVATING
||
534 new_state
== SWAP_DEACTIVATING_SIGTERM
||
535 new_state
== SWAP_DEACTIVATING_SIGKILL
) {
537 if (s
->control_pid
<= 0)
540 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
544 r
= swap_arm_timer(s
);
549 swap_set_state(s
, new_state
);
553 static void swap_dump(Unit
*u
, FILE *f
, const char *prefix
) {
560 if (s
->from_proc_swaps
)
561 p
= &s
->parameters_proc_swaps
;
562 else if (s
->from_fragment
)
563 p
= &s
->parameters_fragment
;
571 "%sFrom /proc/swaps: %s\n"
572 "%sFrom fragment: %s\n",
573 prefix
, swap_state_to_string(s
->state
),
574 prefix
, swap_result_to_string(s
->result
),
576 prefix
, yes_no(s
->from_proc_swaps
),
577 prefix
, yes_no(s
->from_fragment
));
580 fprintf(f
, "%sDevice Node: %s\n", prefix
, s
->devnode
);
587 prefix
, strempty(p
->options
));
589 if (s
->control_pid
> 0)
591 "%sControl PID: "PID_FMT
"\n",
592 prefix
, s
->control_pid
);
594 exec_context_dump(&s
->exec_context
, f
, prefix
);
595 kill_context_dump(&s
->kill_context
, f
, prefix
);
598 static int swap_spawn(Swap
*s
, ExecCommand
*c
, pid_t
*_pid
) {
601 ExecParameters exec_params
= {
602 .apply_permissions
= true,
603 .apply_chroot
= true,
604 .apply_tty_stdin
= true,
605 .bus_endpoint_fd
= -1,
615 (void) unit_realize_cgroup(UNIT(s
));
616 if (s
->reset_cpu_usage
) {
617 (void) unit_reset_cpu_usage(UNIT(s
));
618 s
->reset_cpu_usage
= false;
621 r
= unit_setup_exec_runtime(UNIT(s
));
625 r
= swap_arm_timer(s
);
629 exec_params
.environment
= UNIT(s
)->manager
->environment
;
630 exec_params
.confirm_spawn
= UNIT(s
)->manager
->confirm_spawn
;
631 exec_params
.cgroup_supported
= UNIT(s
)->manager
->cgroup_supported
;
632 exec_params
.cgroup_path
= UNIT(s
)->cgroup_path
;
633 exec_params
.cgroup_delegate
= s
->cgroup_context
.delegate
;
634 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(s
)->manager
);
636 r
= exec_spawn(UNIT(s
),
645 r
= unit_watch_pid(UNIT(s
), pid
);
647 /* FIXME: we need to do something here */
655 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
659 static void swap_enter_dead(Swap
*s
, SwapResult f
) {
662 if (f
!= SWAP_SUCCESS
)
665 exec_runtime_destroy(s
->exec_runtime
);
666 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
668 exec_context_destroy_runtime_directory(&s
->exec_context
, manager_get_runtime_prefix(UNIT(s
)->manager
));
670 swap_set_state(s
, s
->result
!= SWAP_SUCCESS
? SWAP_FAILED
: SWAP_DEAD
);
673 static void swap_enter_active(Swap
*s
, SwapResult f
) {
676 if (f
!= SWAP_SUCCESS
)
679 swap_set_state(s
, SWAP_ACTIVE
);
682 static void swap_enter_signal(Swap
*s
, SwapState state
, SwapResult f
) {
687 if (f
!= SWAP_SUCCESS
)
690 r
= unit_kill_context(
693 (state
!= SWAP_ACTIVATING_SIGTERM
&& state
!= SWAP_DEACTIVATING_SIGTERM
) ?
694 KILL_KILL
: KILL_TERMINATE
,
702 r
= swap_arm_timer(s
);
706 swap_set_state(s
, state
);
707 } else if (state
== SWAP_ACTIVATING_SIGTERM
)
708 swap_enter_signal(s
, SWAP_ACTIVATING_SIGKILL
, SWAP_SUCCESS
);
709 else if (state
== SWAP_DEACTIVATING_SIGTERM
)
710 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGKILL
, SWAP_SUCCESS
);
712 swap_enter_dead(s
, SWAP_SUCCESS
);
717 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
718 swap_enter_dead(s
, SWAP_FAILURE_RESOURCES
);
721 static void swap_enter_activating(Swap
*s
) {
722 _cleanup_free_
char *opts
= NULL
;
727 s
->control_command_id
= SWAP_EXEC_ACTIVATE
;
728 s
->control_command
= s
->exec_command
+ SWAP_EXEC_ACTIVATE
;
730 if (s
->from_fragment
) {
733 r
= fstab_find_pri(s
->parameters_fragment
.options
, &priority
);
735 log_warning_errno(r
, "Failed to parse swap priority \"%s\", ignoring: %m", s
->parameters_fragment
.options
);
736 else if (r
== 1 && s
->parameters_fragment
.priority
>= 0)
737 log_warning("Duplicate swap priority configuration by Priority and Options fields.");
739 if (r
<= 0 && s
->parameters_fragment
.priority
>= 0) {
740 if (s
->parameters_fragment
.options
)
741 r
= asprintf(&opts
, "%s,pri=%i", s
->parameters_fragment
.options
, s
->parameters_fragment
.priority
);
743 r
= asprintf(&opts
, "pri=%i", s
->parameters_fragment
.priority
);
749 r
= exec_command_set(s
->control_command
, "/sbin/swapon", NULL
);
753 if (s
->parameters_fragment
.options
|| opts
) {
754 r
= exec_command_append(s
->control_command
, "-o",
755 opts
? : s
->parameters_fragment
.options
, NULL
);
760 r
= exec_command_append(s
->control_command
, s
->what
, NULL
);
764 swap_unwatch_control_pid(s
);
766 r
= swap_spawn(s
, s
->control_command
, &s
->control_pid
);
770 swap_set_state(s
, SWAP_ACTIVATING
);
775 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'swapon' task: %m");
776 swap_enter_dead(s
, SWAP_FAILURE_RESOURCES
);
779 static void swap_enter_deactivating(Swap
*s
) {
784 s
->control_command_id
= SWAP_EXEC_DEACTIVATE
;
785 s
->control_command
= s
->exec_command
+ SWAP_EXEC_DEACTIVATE
;
787 r
= exec_command_set(s
->control_command
,
794 swap_unwatch_control_pid(s
);
796 r
= swap_spawn(s
, s
->control_command
, &s
->control_pid
);
800 swap_set_state(s
, SWAP_DEACTIVATING
);
805 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'swapoff' task: %m");
806 swap_enter_active(s
, SWAP_FAILURE_RESOURCES
);
809 static int swap_start(Unit
*u
) {
810 Swap
*s
= SWAP(u
), *other
;
814 /* We cannot fulfill this request right now, try again later
817 if (s
->state
== SWAP_DEACTIVATING
||
818 s
->state
== SWAP_DEACTIVATING_SIGTERM
||
819 s
->state
== SWAP_DEACTIVATING_SIGKILL
||
820 s
->state
== SWAP_ACTIVATING_SIGTERM
||
821 s
->state
== SWAP_ACTIVATING_SIGKILL
)
824 if (s
->state
== SWAP_ACTIVATING
)
827 assert(s
->state
== SWAP_DEAD
|| s
->state
== SWAP_FAILED
);
829 if (detect_container() > 0)
832 /* If there's a job for another swap unit for the same node
833 * running, then let's not dispatch this one for now, and wait
834 * until that other job has finished. */
835 LIST_FOREACH_OTHERS(same_devnode
, other
, s
)
836 if (UNIT(other
)->job
&& UNIT(other
)->job
->state
== JOB_RUNNING
)
839 s
->result
= SWAP_SUCCESS
;
840 s
->reset_cpu_usage
= true;
842 swap_enter_activating(s
);
846 static int swap_stop(Unit
*u
) {
851 if (s
->state
== SWAP_DEACTIVATING
||
852 s
->state
== SWAP_DEACTIVATING_SIGTERM
||
853 s
->state
== SWAP_DEACTIVATING_SIGKILL
||
854 s
->state
== SWAP_ACTIVATING_SIGTERM
||
855 s
->state
== SWAP_ACTIVATING_SIGKILL
)
858 assert(s
->state
== SWAP_ACTIVATING
||
859 s
->state
== SWAP_ACTIVATING_DONE
||
860 s
->state
== SWAP_ACTIVE
);
862 if (detect_container() > 0)
865 swap_enter_deactivating(s
);
869 static int swap_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
876 unit_serialize_item(u
, f
, "state", swap_state_to_string(s
->state
));
877 unit_serialize_item(u
, f
, "result", swap_result_to_string(s
->result
));
879 if (s
->control_pid
> 0)
880 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, s
->control_pid
);
882 if (s
->control_command_id
>= 0)
883 unit_serialize_item(u
, f
, "control-command", swap_exec_command_to_string(s
->control_command_id
));
888 static int swap_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
894 if (streq(key
, "state")) {
897 state
= swap_state_from_string(value
);
899 log_unit_debug(u
, "Failed to parse state value: %s", value
);
901 s
->deserialized_state
= state
;
902 } else if (streq(key
, "result")) {
905 f
= swap_result_from_string(value
);
907 log_unit_debug(u
, "Failed to parse result value: %s", value
);
908 else if (f
!= SWAP_SUCCESS
)
910 } else if (streq(key
, "control-pid")) {
913 if (parse_pid(value
, &pid
) < 0)
914 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
916 s
->control_pid
= pid
;
918 } else if (streq(key
, "control-command")) {
921 id
= swap_exec_command_from_string(value
);
923 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
925 s
->control_command_id
= id
;
926 s
->control_command
= s
->exec_command
+ id
;
929 log_unit_debug(u
, "Unknown serialization key: %s", key
);
934 _pure_
static UnitActiveState
swap_active_state(Unit
*u
) {
937 return state_translation_table
[SWAP(u
)->state
];
940 _pure_
static const char *swap_sub_state_to_string(Unit
*u
) {
943 return swap_state_to_string(SWAP(u
)->state
);
946 _pure_
static bool swap_check_gc(Unit
*u
) {
951 return s
->from_proc_swaps
;
954 static void swap_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
961 if (pid
!= s
->control_pid
)
966 if (is_clean_exit(code
, status
, NULL
))
968 else if (code
== CLD_EXITED
)
969 f
= SWAP_FAILURE_EXIT_CODE
;
970 else if (code
== CLD_KILLED
)
971 f
= SWAP_FAILURE_SIGNAL
;
972 else if (code
== CLD_DUMPED
)
973 f
= SWAP_FAILURE_CORE_DUMP
;
975 assert_not_reached("Unknown code");
977 if (f
!= SWAP_SUCCESS
)
980 if (s
->control_command
) {
981 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
983 s
->control_command
= NULL
;
984 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
987 log_unit_full(u
, f
== SWAP_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
988 "Swap process exited, code=%s status=%i", sigchld_code_to_string(code
), status
);
992 case SWAP_ACTIVATING
:
993 case SWAP_ACTIVATING_DONE
:
994 case SWAP_ACTIVATING_SIGTERM
:
995 case SWAP_ACTIVATING_SIGKILL
:
997 if (f
== SWAP_SUCCESS
)
998 swap_enter_active(s
, f
);
1000 swap_enter_dead(s
, f
);
1003 case SWAP_DEACTIVATING
:
1004 case SWAP_DEACTIVATING_SIGKILL
:
1005 case SWAP_DEACTIVATING_SIGTERM
:
1007 swap_enter_dead(s
, f
);
1011 assert_not_reached("Uh, control process died at wrong time.");
1014 /* Notify clients about changed exit status */
1015 unit_add_to_dbus_queue(u
);
1018 static int swap_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
1019 Swap
*s
= SWAP(userdata
);
1022 assert(s
->timer_event_source
== source
);
1026 case SWAP_ACTIVATING
:
1027 case SWAP_ACTIVATING_DONE
:
1028 log_unit_warning(UNIT(s
), "Activation timed out. Stopping.");
1029 swap_enter_signal(s
, SWAP_ACTIVATING_SIGTERM
, SWAP_FAILURE_TIMEOUT
);
1032 case SWAP_DEACTIVATING
:
1033 log_unit_warning(UNIT(s
), "Deactivation timed out. Stopping.");
1034 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGTERM
, SWAP_FAILURE_TIMEOUT
);
1037 case SWAP_ACTIVATING_SIGTERM
:
1038 if (s
->kill_context
.send_sigkill
) {
1039 log_unit_warning(UNIT(s
), "Activation timed out. Killing.");
1040 swap_enter_signal(s
, SWAP_ACTIVATING_SIGKILL
, SWAP_FAILURE_TIMEOUT
);
1042 log_unit_warning(UNIT(s
), "Activation timed out. Skipping SIGKILL. Ignoring.");
1043 swap_enter_dead(s
, SWAP_FAILURE_TIMEOUT
);
1047 case SWAP_DEACTIVATING_SIGTERM
:
1048 if (s
->kill_context
.send_sigkill
) {
1049 log_unit_warning(UNIT(s
), "Deactivation timed out. Killing.");
1050 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGKILL
, SWAP_FAILURE_TIMEOUT
);
1052 log_unit_warning(UNIT(s
), "Deactivation timed out. Skipping SIGKILL. Ignoring.");
1053 swap_enter_dead(s
, SWAP_FAILURE_TIMEOUT
);
1057 case SWAP_ACTIVATING_SIGKILL
:
1058 case SWAP_DEACTIVATING_SIGKILL
:
1059 log_unit_warning(UNIT(s
), "Swap process still around after SIGKILL. Ignoring.");
1060 swap_enter_dead(s
, SWAP_FAILURE_TIMEOUT
);
1064 assert_not_reached("Timeout at wrong time.");
1070 static int swap_load_proc_swaps(Manager
*m
, bool set_flags
) {
1076 rewind(m
->proc_swaps
);
1078 (void) fscanf(m
->proc_swaps
, "%*s %*s %*s %*s %*s\n");
1081 _cleanup_free_
char *dev
= NULL
, *d
= NULL
;
1084 k
= fscanf(m
->proc_swaps
,
1085 "%ms " /* device/file */
1086 "%*s " /* type of swap */
1087 "%*s " /* swap size */
1089 "%i\n", /* priority */
1095 log_warning("Failed to parse /proc/swaps:%u.", i
);
1099 if (cunescape(dev
, UNESCAPE_RELAX
, &d
) < 0)
1102 device_found_node(m
, d
, true, DEVICE_FOUND_SWAP
, set_flags
);
1104 k
= swap_process_new(m
, d
, prio
, set_flags
);
1112 static int swap_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1113 Manager
*m
= userdata
;
1118 assert(revents
& EPOLLPRI
);
1120 r
= swap_load_proc_swaps(m
, true);
1122 log_error_errno(r
, "Failed to reread /proc/swaps: %m");
1124 /* Reset flags, just in case, for late calls */
1125 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_SWAP
]) {
1126 Swap
*swap
= SWAP(u
);
1128 swap
->is_active
= swap
->just_activated
= false;
1134 manager_dispatch_load_queue(m
);
1136 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_SWAP
]) {
1137 Swap
*swap
= SWAP(u
);
1139 if (!swap
->is_active
) {
1140 /* This has just been deactivated */
1142 swap_unset_proc_swaps(swap
);
1144 switch (swap
->state
) {
1147 swap_enter_dead(swap
, SWAP_SUCCESS
);
1152 swap_set_state(swap
, swap
->state
);
1157 device_found_node(m
, swap
->what
, false, DEVICE_FOUND_SWAP
, true);
1159 } else if (swap
->just_activated
) {
1161 /* New swap entry */
1163 switch (swap
->state
) {
1167 swap_enter_active(swap
, SWAP_SUCCESS
);
1170 case SWAP_ACTIVATING
:
1171 swap_set_state(swap
, SWAP_ACTIVATING_DONE
);
1175 /* Nothing really changed, but let's
1176 * issue an notification call
1177 * nonetheless, in case somebody is
1178 * waiting for this. */
1179 swap_set_state(swap
, swap
->state
);
1184 /* Reset the flags for later calls */
1185 swap
->is_active
= swap
->just_activated
= false;
1191 static Unit
*swap_following(Unit
*u
) {
1193 Swap
*other
, *first
= NULL
;
1197 /* If the user configured the swap through /etc/fstab or
1198 * a device unit, follow that. */
1200 if (s
->from_fragment
)
1203 LIST_FOREACH_OTHERS(same_devnode
, other
, s
)
1204 if (other
->from_fragment
)
1207 /* Otherwise make everybody follow the unit that's named after
1208 * the swap device in the kernel */
1210 if (streq_ptr(s
->what
, s
->devnode
))
1213 LIST_FOREACH_AFTER(same_devnode
, other
, s
)
1214 if (streq_ptr(other
->what
, other
->devnode
))
1217 LIST_FOREACH_BEFORE(same_devnode
, other
, s
) {
1218 if (streq_ptr(other
->what
, other
->devnode
))
1224 /* Fall back to the first on the list */
1228 static int swap_following_set(Unit
*u
, Set
**_set
) {
1229 Swap
*s
= SWAP(u
), *other
;
1236 if (LIST_JUST_US(same_devnode
, s
)) {
1241 set
= set_new(NULL
);
1245 LIST_FOREACH_OTHERS(same_devnode
, other
, s
) {
1246 r
= set_put(set
, other
);
1259 static void swap_shutdown(Manager
*m
) {
1262 m
->swap_event_source
= sd_event_source_unref(m
->swap_event_source
);
1264 m
->proc_swaps
= safe_fclose(m
->proc_swaps
);
1266 m
->swaps_by_devnode
= hashmap_free(m
->swaps_by_devnode
);
1269 static int swap_enumerate(Manager
*m
) {
1274 if (!m
->proc_swaps
) {
1275 m
->proc_swaps
= fopen("/proc/swaps", "re");
1277 return errno
== ENOENT
? 0 : -errno
;
1279 r
= sd_event_add_io(m
->event
, &m
->swap_event_source
, fileno(m
->proc_swaps
), EPOLLPRI
, swap_dispatch_io
, m
);
1283 /* Dispatch this before we dispatch SIGCHLD, so that
1284 * we always get the events from /proc/swaps before
1285 * the SIGCHLD of /sbin/swapon. */
1286 r
= sd_event_source_set_priority(m
->swap_event_source
, -10);
1290 (void) sd_event_source_set_description(m
->swap_event_source
, "swap-proc");
1293 r
= swap_load_proc_swaps(m
, false);
1304 int swap_process_device_new(Manager
*m
, struct udev_device
*dev
) {
1305 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
1306 _cleanup_free_
char *e
= NULL
;
1314 dn
= udev_device_get_devnode(dev
);
1318 r
= unit_name_from_path(dn
, ".swap", &e
);
1322 s
= hashmap_get(m
->units
, e
);
1324 r
= swap_set_devnode(s
, dn
);
1326 first
= udev_device_get_devlinks_list_entry(dev
);
1327 udev_list_entry_foreach(item
, first
) {
1328 _cleanup_free_
char *n
= NULL
;
1331 q
= unit_name_from_path(udev_list_entry_get_name(item
), ".swap", &n
);
1335 s
= hashmap_get(m
->units
, n
);
1337 q
= swap_set_devnode(s
, dn
);
1346 int swap_process_device_remove(Manager
*m
, struct udev_device
*dev
) {
1351 dn
= udev_device_get_devnode(dev
);
1355 while ((s
= hashmap_get(m
->swaps_by_devnode
, dn
))) {
1358 q
= swap_set_devnode(s
, NULL
);
1366 static void swap_reset_failed(Unit
*u
) {
1371 if (s
->state
== SWAP_FAILED
)
1372 swap_set_state(s
, SWAP_DEAD
);
1374 s
->result
= SWAP_SUCCESS
;
1377 static int swap_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
1378 return unit_kill_common(u
, who
, signo
, -1, SWAP(u
)->control_pid
, error
);
1381 static int swap_get_timeout(Unit
*u
, uint64_t *timeout
) {
1385 if (!s
->timer_event_source
)
1388 r
= sd_event_source_get_time(s
->timer_event_source
, timeout
);
1395 static bool swap_supported(void) {
1396 static int supported
= -1;
1398 /* If swap support is not available in the kernel, or we are
1399 * running in a container we don't support swap units, and any
1400 * attempts to starting one should fail immediately. */
1404 access("/proc/swaps", F_OK
) >= 0 &&
1405 detect_container() <= 0;
1410 static const char* const swap_exec_command_table
[_SWAP_EXEC_COMMAND_MAX
] = {
1411 [SWAP_EXEC_ACTIVATE
] = "ExecActivate",
1412 [SWAP_EXEC_DEACTIVATE
] = "ExecDeactivate",
1415 DEFINE_STRING_TABLE_LOOKUP(swap_exec_command
, SwapExecCommand
);
1417 static const char* const swap_result_table
[_SWAP_RESULT_MAX
] = {
1418 [SWAP_SUCCESS
] = "success",
1419 [SWAP_FAILURE_RESOURCES
] = "resources",
1420 [SWAP_FAILURE_TIMEOUT
] = "timeout",
1421 [SWAP_FAILURE_EXIT_CODE
] = "exit-code",
1422 [SWAP_FAILURE_SIGNAL
] = "signal",
1423 [SWAP_FAILURE_CORE_DUMP
] = "core-dump"
1426 DEFINE_STRING_TABLE_LOOKUP(swap_result
, SwapResult
);
1428 const UnitVTable swap_vtable
= {
1429 .object_size
= sizeof(Swap
),
1430 .exec_context_offset
= offsetof(Swap
, exec_context
),
1431 .cgroup_context_offset
= offsetof(Swap
, cgroup_context
),
1432 .kill_context_offset
= offsetof(Swap
, kill_context
),
1433 .exec_runtime_offset
= offsetof(Swap
, exec_runtime
),
1439 .private_section
= "Swap",
1442 .no_instances
= true,
1448 .coldplug
= swap_coldplug
,
1452 .start
= swap_start
,
1457 .get_timeout
= swap_get_timeout
,
1459 .serialize
= swap_serialize
,
1460 .deserialize_item
= swap_deserialize_item
,
1462 .active_state
= swap_active_state
,
1463 .sub_state_to_string
= swap_sub_state_to_string
,
1465 .check_gc
= swap_check_gc
,
1467 .sigchld_event
= swap_sigchld_event
,
1469 .reset_failed
= swap_reset_failed
,
1471 .bus_vtable
= bus_swap_vtable
,
1472 .bus_set_property
= bus_swap_set_property
,
1473 .bus_commit_properties
= bus_swap_commit_properties
,
1475 .following
= swap_following
,
1476 .following_set
= swap_following_set
,
1478 .enumerate
= swap_enumerate
,
1479 .shutdown
= swap_shutdown
,
1480 .supported
= swap_supported
,
1482 .status_message_formats
= {
1483 .starting_stopping
= {
1484 [0] = "Activating swap %s...",
1485 [1] = "Deactivating swap %s...",
1487 .finished_start_job
= {
1488 [JOB_DONE
] = "Activated swap %s.",
1489 [JOB_FAILED
] = "Failed to activate swap %s.",
1490 [JOB_TIMEOUT
] = "Timed out activating swap %s.",
1492 .finished_stop_job
= {
1493 [JOB_DONE
] = "Deactivated swap %s.",
1494 [JOB_FAILED
] = "Failed deactivating swap %s.",
1495 [JOB_TIMEOUT
] = "Timed out deactivating swap %s.",