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/>.
26 #include <sys/epoll.h>
33 #include "load-fragment.h"
34 #include "load-dropin.h"
35 #include "unit-name.h"
36 #include "dbus-swap.h"
38 #include "bus-errors.h"
39 #include "exit-status.h"
41 #include "path-util.h"
43 #include "udev-util.h"
45 static const UnitActiveState state_translation_table
[_SWAP_STATE_MAX
] = {
46 [SWAP_DEAD
] = UNIT_INACTIVE
,
47 [SWAP_ACTIVATING
] = UNIT_ACTIVATING
,
48 [SWAP_ACTIVATING_DONE
] = UNIT_ACTIVE
,
49 [SWAP_ACTIVE
] = UNIT_ACTIVE
,
50 [SWAP_DEACTIVATING
] = UNIT_DEACTIVATING
,
51 [SWAP_ACTIVATING_SIGTERM
] = UNIT_DEACTIVATING
,
52 [SWAP_ACTIVATING_SIGKILL
] = UNIT_DEACTIVATING
,
53 [SWAP_DEACTIVATING_SIGTERM
] = UNIT_DEACTIVATING
,
54 [SWAP_DEACTIVATING_SIGKILL
] = UNIT_DEACTIVATING
,
55 [SWAP_FAILED
] = UNIT_FAILED
58 static int swap_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
59 static int swap_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
61 static void swap_unset_proc_swaps(Swap
*s
) {
64 if (!s
->from_proc_swaps
)
67 free(s
->parameters_proc_swaps
.what
);
68 s
->parameters_proc_swaps
.what
= NULL
;
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_func
, string_compare_func
);
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
);
100 s
->devnode
= strdup(devnode
);
104 first
= hashmap_get(swaps
, s
->devnode
);
105 LIST_PREPEND(same_devnode
, first
, s
);
107 return hashmap_replace(swaps
, first
->devnode
, first
);
113 static void swap_init(Unit
*u
) {
117 assert(UNIT(s
)->load_state
== UNIT_STUB
);
119 s
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
121 exec_context_init(&s
->exec_context
);
122 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
123 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
124 kill_context_init(&s
->kill_context
);
125 cgroup_context_init(&s
->cgroup_context
);
127 unit_cgroup_context_init_defaults(u
, &s
->cgroup_context
);
129 s
->parameters_proc_swaps
.priority
= s
->parameters_fragment
.priority
= -1;
131 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
133 u
->ignore_on_isolate
= true;
136 static void swap_unwatch_control_pid(Swap
*s
) {
139 if (s
->control_pid
<= 0)
142 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
146 static void swap_done(Unit
*u
) {
151 swap_unset_proc_swaps(s
);
152 swap_set_devnode(s
, NULL
);
157 free(s
->parameters_fragment
.what
);
158 s
->parameters_fragment
.what
= NULL
;
160 cgroup_context_done(&s
->cgroup_context
);
161 exec_context_done(&s
->exec_context
);
162 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
163 exec_command_done_array(s
->exec_command
, _SWAP_EXEC_COMMAND_MAX
);
164 s
->control_command
= NULL
;
166 swap_unwatch_control_pid(s
);
168 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
171 static int swap_arm_timer(Swap
*s
) {
176 if (s
->timeout_usec
<= 0) {
177 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
181 if (s
->timer_event_source
) {
182 r
= sd_event_source_set_time(s
->timer_event_source
, now(CLOCK_MONOTONIC
) + s
->timeout_usec
);
186 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
189 return sd_event_add_monotonic(UNIT(s
)->manager
->event
, &s
->timer_event_source
, now(CLOCK_MONOTONIC
) + s
->timeout_usec
, 0, swap_dispatch_timer
, s
);
192 static int swap_add_device_links(Swap
*s
) {
200 if (s
->from_fragment
)
201 p
= &s
->parameters_fragment
;
205 if (is_device_path(s
->what
))
206 return unit_add_node_link(UNIT(s
), s
->what
, !p
->noauto
&& UNIT(s
)->manager
->running_as
== SYSTEMD_SYSTEM
);
208 /* File based swap devices need to be ordered after
209 * systemd-remount-fs.service, since they might need a
210 * writable file system. */
211 return unit_add_dependency_by_name(UNIT(s
), UNIT_AFTER
, SPECIAL_REMOUNT_FS_SERVICE
, NULL
, true);
214 static int swap_add_default_dependencies(Swap
*s
) {
215 bool nofail
= false, noauto
= false;
220 if (UNIT(s
)->manager
->running_as
!= SYSTEMD_SYSTEM
)
223 if (detect_container(NULL
) > 0)
226 r
= unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
230 if (s
->from_fragment
) {
231 SwapParameters
*p
= &s
->parameters_fragment
;
239 r
= unit_add_dependency_by_name_inverse(UNIT(s
), UNIT_WANTS
, SPECIAL_SWAP_TARGET
, NULL
, true);
241 r
= unit_add_two_dependencies_by_name_inverse(UNIT(s
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SWAP_TARGET
, NULL
, true);
249 static int swap_verify(Swap
*s
) {
251 _cleanup_free_
char *e
= NULL
;
253 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
256 e
= unit_name_from_path(s
->what
, ".swap");
260 b
= unit_has_name(UNIT(s
), e
);
262 log_error_unit(UNIT(s
)->id
, "%s: Value of \"What\" and unit name do not match, not loading.", UNIT(s
)->id
);
266 if (s
->exec_context
.pam_name
&& s
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
267 log_error_unit(UNIT(s
)->id
, "%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing to load.", UNIT(s
)->id
);
274 static int swap_load_devnode(Swap
*s
) {
275 _cleanup_udev_device_unref_
struct udev_device
*d
= NULL
;
281 if (stat(s
->what
, &st
) < 0 || !S_ISBLK(st
.st_mode
))
284 d
= udev_device_new_from_devnum(UNIT(s
)->manager
->udev
, 'b', st
.st_rdev
);
288 p
= udev_device_get_devnode(d
);
292 return swap_set_devnode(s
, p
);
295 static int swap_load(Unit
*u
) {
300 assert(u
->load_state
== UNIT_STUB
);
302 /* Load a .swap file */
303 r
= unit_load_fragment_and_dropin_optional(u
);
307 if (u
->load_state
== UNIT_LOADED
) {
308 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
312 if (UNIT(s
)->fragment_path
)
313 s
->from_fragment
= true;
316 if (s
->parameters_fragment
.what
)
317 s
->what
= strdup(s
->parameters_fragment
.what
);
318 else if (s
->parameters_proc_swaps
.what
)
319 s
->what
= strdup(s
->parameters_proc_swaps
.what
);
321 s
->what
= unit_name_to_path(u
->id
);
327 path_kill_slashes(s
->what
);
329 if (!UNIT(s
)->description
) {
330 r
= unit_set_description(u
, s
->what
);
335 r
= unit_require_mounts_for(UNIT(s
), s
->what
);
339 r
= swap_add_device_links(s
);
343 r
= swap_load_devnode(s
);
347 r
= unit_add_default_slice(u
);
351 if (UNIT(s
)->default_dependencies
) {
352 r
= swap_add_default_dependencies(s
);
357 r
= unit_exec_context_patch_defaults(u
, &s
->exec_context
);
362 return swap_verify(s
);
365 static int swap_add_one(
368 const char *what_proc_swaps
,
374 _cleanup_free_
char *e
= NULL
;
382 assert(what_proc_swaps
);
384 e
= unit_name_from_path(what
, ".swap");
388 u
= manager_get_unit(m
, e
);
391 SWAP(u
)->from_proc_swaps
&&
392 !path_equal(SWAP(u
)->parameters_proc_swaps
.what
, what_proc_swaps
))
398 u
= unit_new(m
, sizeof(Swap
));
402 r
= unit_add_name(u
, e
);
406 SWAP(u
)->what
= strdup(what
);
407 if (!SWAP(u
)->what
) {
412 unit_add_to_load_queue(u
);
416 p
= &SWAP(u
)->parameters_proc_swaps
;
419 p
->what
= strdup(what_proc_swaps
);
427 SWAP(u
)->is_active
= true;
428 SWAP(u
)->just_activated
= !SWAP(u
)->from_proc_swaps
;
431 SWAP(u
)->from_proc_swaps
= true;
433 p
->priority
= priority
;
437 unit_add_to_dbus_queue(u
);
442 log_warning_unit(e
, "Failed to load swap unit: %s", strerror(-r
));
450 static int swap_process_new_swap(Manager
*m
, const char *device
, int prio
, bool set_flags
) {
451 _cleanup_udev_device_unref_
struct udev_device
*d
= NULL
;
452 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
459 r
= swap_add_one(m
, device
, device
, prio
, false, false, set_flags
);
463 /* If this is a block device, then let's add duplicates for
464 * all other names of this block device */
465 if (stat(device
, &st
) < 0 || !S_ISBLK(st
.st_mode
))
468 d
= udev_device_new_from_devnum(m
->udev
, 'b', st
.st_rdev
);
472 /* Add the main device node */
473 dn
= udev_device_get_devnode(d
);
474 if (dn
&& !streq(dn
, device
))
475 swap_add_one(m
, dn
, device
, prio
, false, false, set_flags
);
477 /* Add additional units for all symlinks */
478 first
= udev_device_get_devlinks_list_entry(d
);
479 udev_list_entry_foreach(item
, first
) {
482 /* Don't bother with the /dev/block links */
483 p
= udev_list_entry_get_name(item
);
485 if (streq(p
, device
))
488 if (path_startswith(p
, "/dev/block/"))
491 if (stat(p
, &st
) >= 0)
492 if (!S_ISBLK(st
.st_mode
) ||
493 st
.st_rdev
!= udev_device_get_devnum(d
))
496 swap_add_one(m
, p
, device
, prio
, false, false, set_flags
);
502 static void swap_set_state(Swap
*s
, SwapState state
) {
507 old_state
= s
->state
;
510 if (state
!= SWAP_ACTIVATING
&&
511 state
!= SWAP_ACTIVATING_SIGTERM
&&
512 state
!= SWAP_ACTIVATING_SIGKILL
&&
513 state
!= SWAP_ACTIVATING_DONE
&&
514 state
!= SWAP_DEACTIVATING
&&
515 state
!= SWAP_DEACTIVATING_SIGTERM
&&
516 state
!= SWAP_DEACTIVATING_SIGKILL
) {
517 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
518 swap_unwatch_control_pid(s
);
519 s
->control_command
= NULL
;
520 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
523 if (state
!= old_state
)
524 log_debug_unit(UNIT(s
)->id
,
525 "%s changed %s -> %s",
527 swap_state_to_string(old_state
),
528 swap_state_to_string(state
));
530 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
533 static int swap_coldplug(Unit
*u
) {
535 SwapState new_state
= SWAP_DEAD
;
539 assert(s
->state
== SWAP_DEAD
);
541 if (s
->deserialized_state
!= s
->state
)
542 new_state
= s
->deserialized_state
;
543 else if (s
->from_proc_swaps
)
544 new_state
= SWAP_ACTIVE
;
546 if (new_state
== s
->state
)
549 if (new_state
== SWAP_ACTIVATING
||
550 new_state
== SWAP_ACTIVATING_SIGTERM
||
551 new_state
== SWAP_ACTIVATING_SIGKILL
||
552 new_state
== SWAP_ACTIVATING_DONE
||
553 new_state
== SWAP_DEACTIVATING
||
554 new_state
== SWAP_DEACTIVATING_SIGTERM
||
555 new_state
== SWAP_DEACTIVATING_SIGKILL
) {
557 if (s
->control_pid
<= 0)
560 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
564 r
= swap_arm_timer(s
);
569 swap_set_state(s
, new_state
);
573 static void swap_dump(Unit
*u
, FILE *f
, const char *prefix
) {
580 if (s
->from_proc_swaps
)
581 p
= &s
->parameters_proc_swaps
;
582 else if (s
->from_fragment
)
583 p
= &s
->parameters_fragment
;
591 "%sFrom /proc/swaps: %s\n"
592 "%sFrom fragment: %s\n",
593 prefix
, swap_state_to_string(s
->state
),
594 prefix
, swap_result_to_string(s
->result
),
596 prefix
, yes_no(s
->from_proc_swaps
),
597 prefix
, yes_no(s
->from_fragment
));
600 fprintf(f
, "%sDevice Node: %s\n", prefix
, s
->devnode
);
608 prefix
, yes_no(p
->noauto
),
609 prefix
, yes_no(p
->nofail
));
611 if (s
->control_pid
> 0)
613 "%sControl PID: %lu\n",
614 prefix
, (unsigned long) s
->control_pid
);
616 exec_context_dump(&s
->exec_context
, f
, prefix
);
617 kill_context_dump(&s
->kill_context
, f
, prefix
);
620 static int swap_spawn(Swap
*s
, ExecCommand
*c
, pid_t
*_pid
) {
628 unit_realize_cgroup(UNIT(s
));
630 r
= unit_setup_exec_runtime(UNIT(s
));
634 r
= swap_arm_timer(s
);
642 UNIT(s
)->manager
->environment
,
646 UNIT(s
)->manager
->confirm_spawn
,
647 UNIT(s
)->manager
->cgroup_supported
,
648 UNIT(s
)->cgroup_path
,
657 r
= unit_watch_pid(UNIT(s
), pid
);
659 /* FIXME: we need to do something here */
667 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
672 static void swap_enter_dead(Swap
*s
, SwapResult f
) {
675 if (f
!= SWAP_SUCCESS
)
678 exec_runtime_destroy(s
->exec_runtime
);
679 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
681 swap_set_state(s
, s
->result
!= SWAP_SUCCESS
? SWAP_FAILED
: SWAP_DEAD
);
684 static void swap_enter_active(Swap
*s
, SwapResult f
) {
687 if (f
!= SWAP_SUCCESS
)
690 swap_set_state(s
, SWAP_ACTIVE
);
693 static void swap_enter_signal(Swap
*s
, SwapState state
, SwapResult f
) {
698 if (f
!= SWAP_SUCCESS
)
701 r
= unit_kill_context(
704 state
!= SWAP_ACTIVATING_SIGTERM
&& state
!= SWAP_DEACTIVATING_SIGTERM
,
712 r
= swap_arm_timer(s
);
716 swap_set_state(s
, state
);
717 } else if (state
== SWAP_ACTIVATING_SIGTERM
)
718 swap_enter_signal(s
, SWAP_ACTIVATING_SIGKILL
, SWAP_SUCCESS
);
719 else if (state
== SWAP_DEACTIVATING_SIGTERM
)
720 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGKILL
, SWAP_SUCCESS
);
722 swap_enter_dead(s
, SWAP_SUCCESS
);
727 log_warning_unit(UNIT(s
)->id
,
728 "%s failed to kill processes: %s", UNIT(s
)->id
, strerror(-r
));
730 swap_enter_dead(s
, SWAP_FAILURE_RESOURCES
);
733 static void swap_enter_activating(Swap
*s
) {
738 s
->control_command_id
= SWAP_EXEC_ACTIVATE
;
739 s
->control_command
= s
->exec_command
+ SWAP_EXEC_ACTIVATE
;
741 if (s
->from_fragment
)
742 priority
= s
->parameters_fragment
.priority
;
747 char p
[DECIMAL_STR_MAX(int)];
749 sprintf(p
, "%i", priority
);
751 r
= exec_command_set(
759 r
= exec_command_set(
768 swap_unwatch_control_pid(s
);
770 r
= swap_spawn(s
, s
->control_command
, &s
->control_pid
);
774 swap_set_state(s
, SWAP_ACTIVATING
);
779 log_warning_unit(UNIT(s
)->id
,
780 "%s failed to run 'swapon' task: %s",
781 UNIT(s
)->id
, strerror(-r
));
782 swap_enter_dead(s
, SWAP_FAILURE_RESOURCES
);
785 static void swap_enter_deactivating(Swap
*s
) {
790 s
->control_command_id
= SWAP_EXEC_DEACTIVATE
;
791 s
->control_command
= s
->exec_command
+ SWAP_EXEC_DEACTIVATE
;
793 r
= exec_command_set(s
->control_command
,
800 swap_unwatch_control_pid(s
);
802 r
= swap_spawn(s
, s
->control_command
, &s
->control_pid
);
806 swap_set_state(s
, SWAP_DEACTIVATING
);
811 log_warning_unit(UNIT(s
)->id
,
812 "%s failed to run 'swapoff' task: %s",
813 UNIT(s
)->id
, strerror(-r
));
814 swap_enter_active(s
, SWAP_FAILURE_RESOURCES
);
817 static int swap_start(Unit
*u
) {
822 /* We cannot fulfill this request right now, try again later
825 if (s
->state
== SWAP_DEACTIVATING
||
826 s
->state
== SWAP_DEACTIVATING_SIGTERM
||
827 s
->state
== SWAP_DEACTIVATING_SIGKILL
||
828 s
->state
== SWAP_ACTIVATING_SIGTERM
||
829 s
->state
== SWAP_ACTIVATING_SIGKILL
)
832 if (s
->state
== SWAP_ACTIVATING
)
835 assert(s
->state
== SWAP_DEAD
|| s
->state
== SWAP_FAILED
);
837 if (detect_container(NULL
) > 0)
840 s
->result
= SWAP_SUCCESS
;
841 swap_enter_activating(s
);
845 static int swap_stop(Unit
*u
) {
850 if (s
->state
== SWAP_DEACTIVATING
||
851 s
->state
== SWAP_DEACTIVATING_SIGTERM
||
852 s
->state
== SWAP_DEACTIVATING_SIGKILL
||
853 s
->state
== SWAP_ACTIVATING_SIGTERM
||
854 s
->state
== SWAP_ACTIVATING_SIGKILL
)
857 assert(s
->state
== SWAP_ACTIVATING
||
858 s
->state
== SWAP_ACTIVATING_DONE
||
859 s
->state
== SWAP_ACTIVE
);
861 if (detect_container(NULL
) > 0)
864 swap_enter_deactivating(s
);
868 static int swap_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
875 unit_serialize_item(u
, f
, "state", swap_state_to_string(s
->state
));
876 unit_serialize_item(u
, f
, "result", swap_result_to_string(s
->result
));
878 if (s
->control_pid
> 0)
879 unit_serialize_item_format(u
, f
, "control-pid", "%lu", (unsigned long) s
->control_pid
);
881 if (s
->control_command_id
>= 0)
882 unit_serialize_item(u
, f
, "control-command", swap_exec_command_to_string(s
->control_command_id
));
887 static int swap_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
893 if (streq(key
, "state")) {
896 state
= swap_state_from_string(value
);
898 log_debug_unit(u
->id
, "Failed to parse state value %s", value
);
900 s
->deserialized_state
= state
;
901 } else if (streq(key
, "result")) {
904 f
= swap_result_from_string(value
);
906 log_debug_unit(u
->id
, "Failed to parse result value %s", value
);
907 else if (f
!= SWAP_SUCCESS
)
909 } else if (streq(key
, "control-pid")) {
912 if (parse_pid(value
, &pid
) < 0)
913 log_debug_unit(u
->id
, "Failed to parse control-pid value %s", value
);
915 s
->control_pid
= pid
;
917 } else if (streq(key
, "control-command")) {
920 id
= swap_exec_command_from_string(value
);
922 log_debug_unit(u
->id
, "Failed to parse exec-command value %s", value
);
924 s
->control_command_id
= id
;
925 s
->control_command
= s
->exec_command
+ id
;
928 log_debug_unit(u
->id
, "Unknown serialization key '%s'", key
);
933 _pure_
static UnitActiveState
swap_active_state(Unit
*u
) {
936 return state_translation_table
[SWAP(u
)->state
];
939 _pure_
static const char *swap_sub_state_to_string(Unit
*u
) {
942 return swap_state_to_string(SWAP(u
)->state
);
945 _pure_
static bool swap_check_gc(Unit
*u
) {
950 return s
->from_proc_swaps
;
953 static void swap_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
960 if (pid
!= s
->control_pid
)
965 if (is_clean_exit(code
, status
, NULL
))
967 else if (code
== CLD_EXITED
)
968 f
= SWAP_FAILURE_EXIT_CODE
;
969 else if (code
== CLD_KILLED
)
970 f
= SWAP_FAILURE_SIGNAL
;
971 else if (code
== CLD_DUMPED
)
972 f
= SWAP_FAILURE_CORE_DUMP
;
974 assert_not_reached("Unknown code");
976 if (f
!= SWAP_SUCCESS
)
979 if (s
->control_command
) {
980 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
982 s
->control_command
= NULL
;
983 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
986 log_full_unit(f
== SWAP_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
,
988 "%s swap process exited, code=%s status=%i",
989 u
->id
, sigchld_code_to_string(code
), status
);
993 case SWAP_ACTIVATING
:
994 case SWAP_ACTIVATING_DONE
:
995 case SWAP_ACTIVATING_SIGTERM
:
996 case SWAP_ACTIVATING_SIGKILL
:
998 if (f
== SWAP_SUCCESS
)
999 swap_enter_active(s
, f
);
1001 swap_enter_dead(s
, f
);
1004 case SWAP_DEACTIVATING
:
1005 case SWAP_DEACTIVATING_SIGKILL
:
1006 case SWAP_DEACTIVATING_SIGTERM
:
1008 swap_enter_dead(s
, f
);
1012 assert_not_reached("Uh, control process died at wrong time.");
1015 /* Notify clients about changed exit status */
1016 unit_add_to_dbus_queue(u
);
1019 static int swap_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
1020 Swap
*s
= SWAP(userdata
);
1023 assert(s
->timer_event_source
== source
);
1027 case SWAP_ACTIVATING
:
1028 case SWAP_ACTIVATING_DONE
:
1029 log_warning_unit(UNIT(s
)->id
, "%s activation timed out. Stopping.", UNIT(s
)->id
);
1030 swap_enter_signal(s
, SWAP_ACTIVATING_SIGTERM
, SWAP_FAILURE_TIMEOUT
);
1033 case SWAP_DEACTIVATING
:
1034 log_warning_unit(UNIT(s
)->id
, "%s deactivation timed out. Stopping.", UNIT(s
)->id
);
1035 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGTERM
, SWAP_FAILURE_TIMEOUT
);
1038 case SWAP_ACTIVATING_SIGTERM
:
1039 if (s
->kill_context
.send_sigkill
) {
1040 log_warning_unit(UNIT(s
)->id
, "%s activation timed out. Killing.", UNIT(s
)->id
);
1041 swap_enter_signal(s
, SWAP_ACTIVATING_SIGKILL
, SWAP_FAILURE_TIMEOUT
);
1043 log_warning_unit(UNIT(s
)->id
, "%s activation timed out. Skipping SIGKILL. Ignoring.", UNIT(s
)->id
);
1044 swap_enter_dead(s
, SWAP_FAILURE_TIMEOUT
);
1048 case SWAP_DEACTIVATING_SIGTERM
:
1049 if (s
->kill_context
.send_sigkill
) {
1050 log_warning_unit(UNIT(s
)->id
, "%s deactivation timed out. Killing.", UNIT(s
)->id
);
1051 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGKILL
, SWAP_FAILURE_TIMEOUT
);
1053 log_warning_unit(UNIT(s
)->id
, "%s deactivation timed out. Skipping SIGKILL. Ignoring.", UNIT(s
)->id
);
1054 swap_enter_dead(s
, SWAP_FAILURE_TIMEOUT
);
1058 case SWAP_ACTIVATING_SIGKILL
:
1059 case SWAP_DEACTIVATING_SIGKILL
:
1060 log_warning_unit(UNIT(s
)->id
, "%s swap process still around after SIGKILL. Ignoring.", UNIT(s
)->id
);
1061 swap_enter_dead(s
, SWAP_FAILURE_TIMEOUT
);
1065 assert_not_reached("Timeout at wrong time.");
1071 static int swap_load_proc_swaps(Manager
*m
, bool set_flags
) {
1077 rewind(m
->proc_swaps
);
1079 (void) fscanf(m
->proc_swaps
, "%*s %*s %*s %*s %*s\n");
1082 _cleanup_free_
char *dev
= NULL
, *d
= NULL
;
1085 k
= fscanf(m
->proc_swaps
,
1086 "%ms " /* device/file */
1087 "%*s " /* type of swap */
1088 "%*s " /* swap size */
1090 "%i\n", /* priority */
1096 log_warning("Failed to parse /proc/swaps:%u", i
);
1104 k
= swap_process_new_swap(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("Failed to reread /proc/swaps: %s", strerror(-r
));
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
);
1156 } else if (swap
->just_activated
) {
1158 /* New swap entry */
1160 switch (swap
->state
) {
1164 swap_enter_active(swap
, SWAP_SUCCESS
);
1167 case SWAP_ACTIVATING
:
1168 swap_set_state(swap
, SWAP_ACTIVATING_DONE
);
1172 /* Nothing really changed, but let's
1173 * issue an notification call
1174 * nonetheless, in case somebody is
1175 * waiting for this. */
1176 swap_set_state(swap
, swap
->state
);
1181 /* Reset the flags for later calls */
1182 swap
->is_active
= swap
->just_activated
= false;
1188 static Unit
*swap_following(Unit
*u
) {
1190 Swap
*other
, *first
= NULL
;
1194 if (streq_ptr(s
->what
, s
->devnode
))
1197 /* Make everybody follow the unit that's named after the swap
1198 * device in the kernel */
1200 LIST_FOREACH_AFTER(same_devnode
, other
, s
)
1201 if (streq_ptr(other
->what
, other
->devnode
))
1204 LIST_FOREACH_BEFORE(same_devnode
, other
, s
) {
1205 if (streq_ptr(other
->what
, other
->devnode
))
1214 static int swap_following_set(Unit
*u
, Set
**_set
) {
1215 Swap
*s
= SWAP(u
), *other
;
1222 if (LIST_JUST_US(same_devnode
, s
)) {
1227 set
= set_new(NULL
, NULL
);
1231 LIST_FOREACH_AFTER(same_devnode
, other
, s
) {
1232 r
= set_put(set
, other
);
1237 LIST_FOREACH_BEFORE(same_devnode
, other
, s
) {
1238 r
= set_put(set
, other
);
1251 static void swap_shutdown(Manager
*m
) {
1254 m
->swap_event_source
= sd_event_source_unref(m
->swap_event_source
);
1256 if (m
->proc_swaps
) {
1257 fclose(m
->proc_swaps
);
1258 m
->proc_swaps
= NULL
;
1261 hashmap_free(m
->swaps_by_devnode
);
1262 m
->swaps_by_devnode
= NULL
;
1265 static int swap_enumerate(Manager
*m
) {
1270 if (!m
->proc_swaps
) {
1271 m
->proc_swaps
= fopen("/proc/swaps", "re");
1273 return errno
== ENOENT
? 0 : -errno
;
1275 r
= sd_event_add_io(m
->event
, &m
->swap_event_source
, fileno(m
->proc_swaps
), EPOLLPRI
, swap_dispatch_io
, m
);
1279 /* Dispatch this before we dispatch SIGCHLD, so that
1280 * we always get the events from /proc/swaps before
1281 * the SIGCHLD of /sbin/swapon. */
1282 r
= sd_event_source_set_priority(m
->swap_event_source
, -10);
1287 r
= swap_load_proc_swaps(m
, false);
1298 int swap_process_new_device(Manager
*m
, struct udev_device
*dev
) {
1299 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
1300 _cleanup_free_
char *e
= NULL
;
1308 dn
= udev_device_get_devnode(dev
);
1312 e
= unit_name_from_path(dn
, ".swap");
1316 s
= hashmap_get(m
->units
, e
);
1318 r
= swap_set_devnode(s
, dn
);
1320 first
= udev_device_get_devlinks_list_entry(dev
);
1321 udev_list_entry_foreach(item
, first
) {
1322 _cleanup_free_
char *n
= NULL
;
1324 n
= unit_name_from_path(udev_list_entry_get_name(item
), ".swap");
1328 s
= hashmap_get(m
->units
, n
);
1332 q
= swap_set_devnode(s
, dn
);
1341 int swap_process_removed_device(Manager
*m
, struct udev_device
*dev
) {
1346 dn
= udev_device_get_devnode(dev
);
1350 while ((s
= hashmap_get(m
->swaps_by_devnode
, dn
))) {
1353 q
= swap_set_devnode(s
, NULL
);
1361 static void swap_reset_failed(Unit
*u
) {
1366 if (s
->state
== SWAP_FAILED
)
1367 swap_set_state(s
, SWAP_DEAD
);
1369 s
->result
= SWAP_SUCCESS
;
1372 static int swap_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
1373 return unit_kill_common(u
, who
, signo
, -1, SWAP(u
)->control_pid
, error
);
1376 static int swap_get_timeout(Unit
*u
, uint64_t *timeout
) {
1380 if (!s
->timer_event_source
)
1383 r
= sd_event_source_get_time(s
->timer_event_source
, timeout
);
1390 static const char* const swap_state_table
[_SWAP_STATE_MAX
] = {
1391 [SWAP_DEAD
] = "dead",
1392 [SWAP_ACTIVATING
] = "activating",
1393 [SWAP_ACTIVATING_DONE
] = "activating-done",
1394 [SWAP_ACTIVE
] = "active",
1395 [SWAP_DEACTIVATING
] = "deactivating",
1396 [SWAP_ACTIVATING_SIGTERM
] = "activating-sigterm",
1397 [SWAP_ACTIVATING_SIGKILL
] = "activating-sigkill",
1398 [SWAP_DEACTIVATING_SIGTERM
] = "deactivating-sigterm",
1399 [SWAP_DEACTIVATING_SIGKILL
] = "deactivating-sigkill",
1400 [SWAP_FAILED
] = "failed"
1403 DEFINE_STRING_TABLE_LOOKUP(swap_state
, SwapState
);
1405 static const char* const swap_exec_command_table
[_SWAP_EXEC_COMMAND_MAX
] = {
1406 [SWAP_EXEC_ACTIVATE
] = "ExecActivate",
1407 [SWAP_EXEC_DEACTIVATE
] = "ExecDeactivate",
1410 DEFINE_STRING_TABLE_LOOKUP(swap_exec_command
, SwapExecCommand
);
1412 static const char* const swap_result_table
[_SWAP_RESULT_MAX
] = {
1413 [SWAP_SUCCESS
] = "success",
1414 [SWAP_FAILURE_RESOURCES
] = "resources",
1415 [SWAP_FAILURE_TIMEOUT
] = "timeout",
1416 [SWAP_FAILURE_EXIT_CODE
] = "exit-code",
1417 [SWAP_FAILURE_SIGNAL
] = "signal",
1418 [SWAP_FAILURE_CORE_DUMP
] = "core-dump"
1421 DEFINE_STRING_TABLE_LOOKUP(swap_result
, SwapResult
);
1423 const UnitVTable swap_vtable
= {
1424 .object_size
= sizeof(Swap
),
1425 .exec_context_offset
= offsetof(Swap
, exec_context
),
1426 .cgroup_context_offset
= offsetof(Swap
, cgroup_context
),
1427 .kill_context_offset
= offsetof(Swap
, kill_context
),
1428 .exec_runtime_offset
= offsetof(Swap
, exec_runtime
),
1434 .private_section
= "Swap",
1437 .no_instances
= true,
1443 .coldplug
= swap_coldplug
,
1447 .start
= swap_start
,
1452 .get_timeout
= swap_get_timeout
,
1454 .serialize
= swap_serialize
,
1455 .deserialize_item
= swap_deserialize_item
,
1457 .active_state
= swap_active_state
,
1458 .sub_state_to_string
= swap_sub_state_to_string
,
1460 .check_gc
= swap_check_gc
,
1462 .sigchld_event
= swap_sigchld_event
,
1464 .reset_failed
= swap_reset_failed
,
1466 .bus_interface
= "org.freedesktop.systemd1.Swap",
1467 .bus_vtable
= bus_swap_vtable
,
1468 .bus_set_property
= bus_swap_set_property
,
1469 .bus_commit_properties
= bus_swap_commit_properties
,
1471 .following
= swap_following
,
1472 .following_set
= swap_following_set
,
1474 .enumerate
= swap_enumerate
,
1475 .shutdown
= swap_shutdown
,
1477 .status_message_formats
= {
1478 .starting_stopping
= {
1479 [0] = "Activating swap %s...",
1480 [1] = "Deactivating swap %s...",
1482 .finished_start_job
= {
1483 [JOB_DONE
] = "Activated swap %s.",
1484 [JOB_FAILED
] = "Failed to activate swap %s.",
1485 [JOB_DEPENDENCY
] = "Dependency failed for %s.",
1486 [JOB_TIMEOUT
] = "Timed out activating swap %s.",
1488 .finished_stop_job
= {
1489 [JOB_DONE
] = "Deactivated swap %s.",
1490 [JOB_FAILED
] = "Failed deactivating swap %s.",
1491 [JOB_TIMEOUT
] = "Timed out deactivating swap %s.",