chiark / gitweb /
cb19d0f1236e50a75e35de76aef7761434a291a6
[elogind.git] / src / core / swap.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2010 Lennart Poettering
7
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.
12
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.
17
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/>.
20 ***/
21
22 #include <errno.h>
23 #include <limits.h>
24 #include <unistd.h>
25 #include <fcntl.h>
26 #include <sys/epoll.h>
27 #include <sys/stat.h>
28 #include <sys/swap.h>
29 #include <libudev.h>
30
31 #include "unit.h"
32 #include "swap.h"
33 #include "load-fragment.h"
34 #include "load-dropin.h"
35 #include "unit-name.h"
36 #include "dbus-swap.h"
37 #include "special.h"
38 #include "bus-common-errors.h"
39 #include "exit-status.h"
40 #include "def.h"
41 #include "path-util.h"
42 #include "virt.h"
43 #include "udev-util.h"
44
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
56 };
57
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);
60
61 static void swap_unset_proc_swaps(Swap *s) {
62         assert(s);
63
64         if (!s->from_proc_swaps)
65                 return;
66
67         free(s->parameters_proc_swaps.what);
68         s->parameters_proc_swaps.what = NULL;
69
70         s->from_proc_swaps = false;
71 }
72
73 static int swap_set_devnode(Swap *s, const char *devnode) {
74         Hashmap *swaps;
75         Swap *first;
76         int r;
77
78         assert(s);
79
80         r = hashmap_ensure_allocated(&UNIT(s)->manager->swaps_by_devnode, &string_hash_ops);
81         if (r < 0)
82                 return r;
83
84         swaps = UNIT(s)->manager->swaps_by_devnode;
85
86         if (s->devnode) {
87                 first = hashmap_get(swaps, s->devnode);
88
89                 LIST_REMOVE(same_devnode, first, s);
90                 if (first)
91                         hashmap_replace(swaps, first->devnode, first);
92                 else
93                         hashmap_remove(swaps, s->devnode);
94
95                 free(s->devnode);
96                 s->devnode = NULL;
97         }
98
99         if (devnode) {
100                 s->devnode = strdup(devnode);
101                 if (!s->devnode)
102                         return -ENOMEM;
103
104                 first = hashmap_get(swaps, s->devnode);
105                 LIST_PREPEND(same_devnode, first, s);
106
107                 return hashmap_replace(swaps, first->devnode, first);
108         }
109
110         return 0;
111 }
112
113 static void swap_init(Unit *u) {
114         Swap *s = SWAP(u);
115
116         assert(s);
117         assert(UNIT(s)->load_state == UNIT_STUB);
118
119         s->timeout_usec = u->manager->default_timeout_start_usec;
120
121         s->exec_context.std_output = u->manager->default_std_output;
122         s->exec_context.std_error = u->manager->default_std_error;
123
124         s->parameters_proc_swaps.priority = s->parameters_fragment.priority = -1;
125
126         s->control_command_id = _SWAP_EXEC_COMMAND_INVALID;
127
128         u->ignore_on_isolate = true;
129 }
130
131 static void swap_unwatch_control_pid(Swap *s) {
132         assert(s);
133
134         if (s->control_pid <= 0)
135                 return;
136
137         unit_unwatch_pid(UNIT(s), s->control_pid);
138         s->control_pid = 0;
139 }
140
141 static void swap_done(Unit *u) {
142         Swap *s = SWAP(u);
143
144         assert(s);
145
146         swap_unset_proc_swaps(s);
147         swap_set_devnode(s, NULL);
148
149         free(s->what);
150         s->what = NULL;
151
152         free(s->parameters_fragment.what);
153         s->parameters_fragment.what = NULL;
154
155         free(s->parameters_fragment.options);
156         s->parameters_fragment.options = NULL;
157
158         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
159         exec_command_done_array(s->exec_command, _SWAP_EXEC_COMMAND_MAX);
160         s->control_command = NULL;
161
162         swap_unwatch_control_pid(s);
163
164         s->timer_event_source = sd_event_source_unref(s->timer_event_source);
165 }
166
167 static int swap_arm_timer(Swap *s) {
168         int r;
169
170         assert(s);
171
172         if (s->timeout_usec <= 0) {
173                 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
174                 return 0;
175         }
176
177         if (s->timer_event_source) {
178                 r = sd_event_source_set_time(s->timer_event_source, now(CLOCK_MONOTONIC) + s->timeout_usec);
179                 if (r < 0)
180                         return r;
181
182                 return sd_event_source_set_enabled(s->timer_event_source, SD_EVENT_ONESHOT);
183         }
184
185         return sd_event_add_time(
186                         UNIT(s)->manager->event,
187                         &s->timer_event_source,
188                         CLOCK_MONOTONIC,
189                         now(CLOCK_MONOTONIC) + s->timeout_usec, 0,
190                         swap_dispatch_timer, s);
191 }
192
193 static int swap_add_device_links(Swap *s) {
194         assert(s);
195
196         if (!s->what)
197                 return 0;
198
199         if (!s->from_fragment)
200                 return 0;
201
202         if (is_device_path(s->what))
203                 return unit_add_node_link(UNIT(s), s->what, UNIT(s)->manager->running_as == SYSTEMD_SYSTEM);
204         else
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);
209 }
210
211 static int swap_add_default_dependencies(Swap *s) {
212         assert(s);
213
214         if (UNIT(s)->manager->running_as != SYSTEMD_SYSTEM)
215                 return 0;
216
217         if (detect_container(NULL) > 0)
218                 return 0;
219
220         return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
221 }
222
223 static int swap_verify(Swap *s) {
224         bool b;
225         _cleanup_free_ char *e = NULL;
226
227         if (UNIT(s)->load_state != UNIT_LOADED)
228                 return 0;
229
230         e = unit_name_from_path(s->what, ".swap");
231         if (!e)
232                 return log_oom();
233
234         b = unit_has_name(UNIT(s), e);
235         if (!b) {
236                 log_unit_error(UNIT(s)->id, "%s: Value of \"What\" and unit name do not match, not loading.", UNIT(s)->id);
237                 return -EINVAL;
238         }
239
240         if (s->exec_context.pam_name && s->kill_context.kill_mode != KILL_CONTROL_GROUP) {
241                 log_unit_error(UNIT(s)->id, "%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing to load.", UNIT(s)->id);
242                 return -EINVAL;
243         }
244
245         return 0;
246 }
247
248 static int swap_load_devnode(Swap *s) {
249         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
250         struct stat st;
251         const char *p;
252
253         assert(s);
254
255         if (stat(s->what, &st) < 0 || !S_ISBLK(st.st_mode))
256                 return 0;
257
258         d = udev_device_new_from_devnum(UNIT(s)->manager->udev, 'b', st.st_rdev);
259         if (!d)
260                 return 0;
261
262         p = udev_device_get_devnode(d);
263         if (!p)
264                 return 0;
265
266         return swap_set_devnode(s, p);
267 }
268
269 static int swap_load(Unit *u) {
270         int r;
271         Swap *s = SWAP(u);
272
273         assert(s);
274         assert(u->load_state == UNIT_STUB);
275
276         /* Load a .swap file */
277         r = unit_load_fragment_and_dropin_optional(u);
278         if (r < 0)
279                 return r;
280
281         if (u->load_state == UNIT_LOADED) {
282
283                 if (UNIT(s)->fragment_path)
284                         s->from_fragment = true;
285
286                 if (!s->what) {
287                         if (s->parameters_fragment.what)
288                                 s->what = strdup(s->parameters_fragment.what);
289                         else if (s->parameters_proc_swaps.what)
290                                 s->what = strdup(s->parameters_proc_swaps.what);
291                         else
292                                 s->what = unit_name_to_path(u->id);
293
294                         if (!s->what)
295                                 return -ENOMEM;
296                 }
297
298                 path_kill_slashes(s->what);
299
300                 if (!UNIT(s)->description) {
301                         r = unit_set_description(u, s->what);
302                         if (r < 0)
303                                 return r;
304                 }
305
306                 r = unit_require_mounts_for(UNIT(s), s->what);
307                 if (r < 0)
308                         return r;
309
310                 r = swap_add_device_links(s);
311                 if (r < 0)
312                         return r;
313
314                 r = swap_load_devnode(s);
315                 if (r < 0)
316                         return r;
317
318                 r = unit_patch_contexts(u);
319                 if (r < 0)
320                         return r;
321
322                 r = unit_add_exec_dependencies(u, &s->exec_context);
323                 if (r < 0)
324                         return r;
325
326                 r = unit_add_default_slice(u, &s->cgroup_context);
327                 if (r < 0)
328                         return r;
329
330                 if (UNIT(s)->default_dependencies) {
331                         r = swap_add_default_dependencies(s);
332                         if (r < 0)
333                                 return r;
334                 }
335         }
336
337         return swap_verify(s);
338 }
339
340 static int swap_add_one(
341                 Manager *m,
342                 const char *what,
343                 const char *what_proc_swaps,
344                 int priority,
345                 bool set_flags) {
346
347         _cleanup_free_ char *e = NULL;
348         bool delete = false;
349         Unit *u = NULL;
350         int r;
351         SwapParameters *p;
352
353         assert(m);
354         assert(what);
355         assert(what_proc_swaps);
356
357         e = unit_name_from_path(what, ".swap");
358         if (!e)
359                 return log_oom();
360
361         u = manager_get_unit(m, e);
362
363         if (u &&
364             SWAP(u)->from_proc_swaps &&
365             !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
366                 return -EEXIST;
367
368         if (!u) {
369                 delete = true;
370
371                 u = unit_new(m, sizeof(Swap));
372                 if (!u)
373                         return log_oom();
374
375                 r = unit_add_name(u, e);
376                 if (r < 0)
377                         goto fail;
378
379                 SWAP(u)->what = strdup(what);
380                 if (!SWAP(u)->what) {
381                         r = log_oom();
382                         goto fail;
383                 }
384
385                 unit_add_to_load_queue(u);
386         } else
387                 delete = false;
388
389         p = &SWAP(u)->parameters_proc_swaps;
390
391         if (!p->what) {
392                 p->what = strdup(what_proc_swaps);
393                 if (!p->what) {
394                         r = -ENOMEM;
395                         goto fail;
396                 }
397         }
398
399         if (set_flags) {
400                 SWAP(u)->is_active = true;
401                 SWAP(u)->just_activated = !SWAP(u)->from_proc_swaps;
402         }
403
404         SWAP(u)->from_proc_swaps = true;
405
406         p->priority = priority;
407
408         unit_add_to_dbus_queue(u);
409
410         return 0;
411
412 fail:
413         log_unit_warning_errno(e, r, "Failed to load swap unit: %m");
414
415         if (delete && u)
416                 unit_free(u);
417
418         return r;
419 }
420
421 static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
422         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
423         struct udev_list_entry *item = NULL, *first = NULL;
424         const char *dn;
425         struct stat st;
426         int r;
427
428         assert(m);
429
430         r = swap_add_one(m, device, device, prio, set_flags);
431         if (r < 0)
432                 return r;
433
434         /* If this is a block device, then let's add duplicates for
435          * all other names of this block device */
436         if (stat(device, &st) < 0 || !S_ISBLK(st.st_mode))
437                 return 0;
438
439         d = udev_device_new_from_devnum(m->udev, 'b', st.st_rdev);
440         if (!d)
441                 return 0;
442
443         /* Add the main device node */
444         dn = udev_device_get_devnode(d);
445         if (dn && !streq(dn, device))
446                 swap_add_one(m, dn, device, prio, set_flags);
447
448         /* Add additional units for all symlinks */
449         first = udev_device_get_devlinks_list_entry(d);
450         udev_list_entry_foreach(item, first) {
451                 const char *p;
452
453                 /* Don't bother with the /dev/block links */
454                 p = udev_list_entry_get_name(item);
455
456                 if (streq(p, device))
457                         continue;
458
459                 if (path_startswith(p, "/dev/block/"))
460                         continue;
461
462                 if (stat(p, &st) >= 0)
463                         if (!S_ISBLK(st.st_mode) ||
464                             st.st_rdev != udev_device_get_devnum(d))
465                                 continue;
466
467                 swap_add_one(m, p, device, prio, set_flags);
468         }
469
470         return r;
471 }
472
473 static void swap_set_state(Swap *s, SwapState state) {
474         SwapState old_state;
475
476         assert(s);
477
478         old_state = s->state;
479         s->state = state;
480
481         if (state != SWAP_ACTIVATING &&
482             state != SWAP_ACTIVATING_SIGTERM &&
483             state != SWAP_ACTIVATING_SIGKILL &&
484             state != SWAP_ACTIVATING_DONE &&
485             state != SWAP_DEACTIVATING &&
486             state != SWAP_DEACTIVATING_SIGTERM &&
487             state != SWAP_DEACTIVATING_SIGKILL) {
488                 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
489                 swap_unwatch_control_pid(s);
490                 s->control_command = NULL;
491                 s->control_command_id = _SWAP_EXEC_COMMAND_INVALID;
492         }
493
494         if (state != old_state)
495                 log_unit_debug(UNIT(s)->id,
496                                "%s changed %s -> %s",
497                                UNIT(s)->id,
498                                swap_state_to_string(old_state),
499                                swap_state_to_string(state));
500
501         unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], true);
502 }
503
504 static int swap_coldplug(Unit *u) {
505         Swap *s = SWAP(u);
506         SwapState new_state = SWAP_DEAD;
507         int r;
508
509         assert(s);
510         assert(s->state == SWAP_DEAD);
511
512         if (s->deserialized_state != s->state)
513                 new_state = s->deserialized_state;
514         else if (s->from_proc_swaps)
515                 new_state = SWAP_ACTIVE;
516
517         if (new_state == s->state)
518                 return 0;
519
520         if (new_state == SWAP_ACTIVATING ||
521             new_state == SWAP_ACTIVATING_SIGTERM ||
522             new_state == SWAP_ACTIVATING_SIGKILL ||
523             new_state == SWAP_ACTIVATING_DONE ||
524             new_state == SWAP_DEACTIVATING ||
525             new_state == SWAP_DEACTIVATING_SIGTERM ||
526             new_state == SWAP_DEACTIVATING_SIGKILL) {
527
528                 if (s->control_pid <= 0)
529                         return -EBADMSG;
530
531                 r = unit_watch_pid(UNIT(s), s->control_pid);
532                 if (r < 0)
533                         return r;
534
535                 r = swap_arm_timer(s);
536                 if (r < 0)
537                         return r;
538         }
539
540         swap_set_state(s, new_state);
541         return 0;
542 }
543
544 static void swap_dump(Unit *u, FILE *f, const char *prefix) {
545         Swap *s = SWAP(u);
546         SwapParameters *p;
547
548         assert(s);
549         assert(f);
550
551         if (s->from_proc_swaps)
552                 p = &s->parameters_proc_swaps;
553         else if (s->from_fragment)
554                 p = &s->parameters_fragment;
555         else
556                 p = NULL;
557
558         fprintf(f,
559                 "%sSwap State: %s\n"
560                 "%sResult: %s\n"
561                 "%sWhat: %s\n"
562                 "%sFrom /proc/swaps: %s\n"
563                 "%sFrom fragment: %s\n",
564                 prefix, swap_state_to_string(s->state),
565                 prefix, swap_result_to_string(s->result),
566                 prefix, s->what,
567                 prefix, yes_no(s->from_proc_swaps),
568                 prefix, yes_no(s->from_fragment));
569
570         if (s->devnode)
571                 fprintf(f, "%sDevice Node: %s\n", prefix, s->devnode);
572
573         if (p)
574                 fprintf(f,
575                         "%sPriority: %i\n"
576                         "%sOptions: %s\n",
577                         prefix, p->priority,
578                         prefix, strempty(p->options));
579
580         if (s->control_pid > 0)
581                 fprintf(f,
582                         "%sControl PID: "PID_FMT"\n",
583                         prefix, s->control_pid);
584
585         exec_context_dump(&s->exec_context, f, prefix);
586         kill_context_dump(&s->kill_context, f, prefix);
587 }
588
589 static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) {
590         pid_t pid;
591         int r;
592         ExecParameters exec_params = {
593                 .apply_permissions = true,
594                 .apply_chroot      = true,
595                 .apply_tty_stdin   = true,
596         };
597
598         assert(s);
599         assert(c);
600         assert(_pid);
601
602         unit_realize_cgroup(UNIT(s));
603
604         r = unit_setup_exec_runtime(UNIT(s));
605         if (r < 0)
606                 goto fail;
607
608         r = swap_arm_timer(s);
609         if (r < 0)
610                 goto fail;
611
612         exec_params.environment = UNIT(s)->manager->environment;
613         exec_params.confirm_spawn = UNIT(s)->manager->confirm_spawn;
614         exec_params.cgroup_supported = UNIT(s)->manager->cgroup_supported;
615         exec_params.cgroup_path = UNIT(s)->cgroup_path;
616         exec_params.cgroup_delegate = s->cgroup_context.delegate;
617         exec_params.runtime_prefix = manager_get_runtime_prefix(UNIT(s)->manager);
618         exec_params.unit_id = UNIT(s)->id;
619
620         r = exec_spawn(c,
621                        &s->exec_context,
622                        &exec_params,
623                        s->exec_runtime,
624                        &pid);
625         if (r < 0)
626                 goto fail;
627
628         r = unit_watch_pid(UNIT(s), pid);
629         if (r < 0)
630                 /* FIXME: we need to do something here */
631                 goto fail;
632
633         *_pid = pid;
634
635         return 0;
636
637 fail:
638         s->timer_event_source = sd_event_source_unref(s->timer_event_source);
639
640         return r;
641 }
642
643 static void swap_enter_dead(Swap *s, SwapResult f) {
644         assert(s);
645
646         if (f != SWAP_SUCCESS)
647                 s->result = f;
648
649         exec_runtime_destroy(s->exec_runtime);
650         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
651
652         exec_context_destroy_runtime_directory(&s->exec_context, manager_get_runtime_prefix(UNIT(s)->manager));
653
654         swap_set_state(s, s->result != SWAP_SUCCESS ? SWAP_FAILED : SWAP_DEAD);
655 }
656
657 static void swap_enter_active(Swap *s, SwapResult f) {
658         assert(s);
659
660         if (f != SWAP_SUCCESS)
661                 s->result = f;
662
663         swap_set_state(s, SWAP_ACTIVE);
664 }
665
666 static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) {
667         int r;
668
669         assert(s);
670
671         if (f != SWAP_SUCCESS)
672                 s->result = f;
673
674         r = unit_kill_context(
675                         UNIT(s),
676                         &s->kill_context,
677                         (state != SWAP_ACTIVATING_SIGTERM && state != SWAP_DEACTIVATING_SIGTERM) ?
678                         KILL_KILL : KILL_TERMINATE,
679                         -1,
680                         s->control_pid,
681                         false);
682         if (r < 0)
683                 goto fail;
684
685         if (r > 0) {
686                 r = swap_arm_timer(s);
687                 if (r < 0)
688                         goto fail;
689
690                 swap_set_state(s, state);
691         } else if (state == SWAP_ACTIVATING_SIGTERM)
692                 swap_enter_signal(s, SWAP_ACTIVATING_SIGKILL, SWAP_SUCCESS);
693         else if (state == SWAP_DEACTIVATING_SIGTERM)
694                 swap_enter_signal(s, SWAP_DEACTIVATING_SIGKILL, SWAP_SUCCESS);
695         else
696                 swap_enter_dead(s, SWAP_SUCCESS);
697
698         return;
699
700 fail:
701         log_unit_warning(UNIT(s)->id,
702                          "%s failed to kill processes: %s", UNIT(s)->id, strerror(-r));
703
704         swap_enter_dead(s, SWAP_FAILURE_RESOURCES);
705 }
706
707 static int mount_find_pri(const char *options, int *ret) {
708         const char *opt;
709         char *end;
710         unsigned long r;
711
712         assert(ret);
713
714         if (!options)
715                 return 0;
716
717         opt = mount_test_option(options, "pri");
718         if (!opt)
719                 return 0;
720
721         opt += strlen("pri");
722         if (*opt != '=')
723                 return -EINVAL;
724
725         errno = 0;
726         r = strtoul(opt + 1, &end, 10);
727         if (errno > 0)
728                 return -errno;
729
730         if (end == opt + 1 || (*end != ',' && *end != 0))
731                 return -EINVAL;
732
733         *ret = (int) r;
734         return 1;
735 }
736
737 static int mount_find_discard(const char *options, char **ret) {
738         const char *opt;
739         char *ans;
740         size_t len;
741
742         assert(ret);
743
744         if (!options)
745                 return 0;
746
747         opt = mount_test_option(options, "discard");
748         if (!opt)
749                 return 0;
750
751         opt += strlen("discard");
752         if (*opt == ',' || *opt == '\0')
753                 ans = strdup("all");
754         else {
755                 if (*opt != '=')
756                         return -EINVAL;
757
758                 len = strcspn(opt + 1, ",");
759                 if (len == 0)
760                         return -EINVAL;
761
762                 ans = strndup(opt + 1, len);
763         }
764
765         if (!ans)
766                 return -ENOMEM;
767
768         *ret = ans;
769         return 1;
770 }
771
772 static void swap_enter_activating(Swap *s) {
773         _cleanup_free_ char *discard = NULL;
774         int r, priority = -1;
775
776         assert(s);
777
778         s->control_command_id = SWAP_EXEC_ACTIVATE;
779         s->control_command = s->exec_command + SWAP_EXEC_ACTIVATE;
780
781         if (s->from_fragment) {
782                 mount_find_discard(s->parameters_fragment.options, &discard);
783
784                 priority = s->parameters_fragment.priority;
785                 if (priority < 0)
786                         mount_find_pri(s->parameters_fragment.options, &priority);
787         }
788
789         r = exec_command_set(s->control_command, "/sbin/swapon", NULL);
790         if (r < 0)
791                 goto fail;
792
793         if (priority >= 0) {
794                 char p[DECIMAL_STR_MAX(int)];
795
796                 sprintf(p, "%i", priority);
797                 r = exec_command_append(s->control_command, "-p", p, NULL);
798                 if (r < 0)
799                         goto fail;
800         }
801
802         if (discard && !streq(discard, "none")) {
803                 const char *discard_arg;
804
805                 if (streq(discard, "all"))
806                         discard_arg = "--discard";
807                 else
808                         discard_arg = strappenda("--discard=", discard);
809
810                 r = exec_command_append(s->control_command, discard_arg, NULL);
811                 if (r < 0)
812                         goto fail;
813         }
814
815         r = exec_command_append(s->control_command, s->what, NULL);
816         if (r < 0)
817                 goto fail;
818
819         swap_unwatch_control_pid(s);
820
821         r = swap_spawn(s, s->control_command, &s->control_pid);
822         if (r < 0)
823                 goto fail;
824
825         swap_set_state(s, SWAP_ACTIVATING);
826
827         return;
828
829 fail:
830         log_unit_warning(UNIT(s)->id,
831                          "%s failed to run 'swapon' task: %s",
832                          UNIT(s)->id, strerror(-r));
833         swap_enter_dead(s, SWAP_FAILURE_RESOURCES);
834 }
835
836 static void swap_enter_deactivating(Swap *s) {
837         int r;
838
839         assert(s);
840
841         s->control_command_id = SWAP_EXEC_DEACTIVATE;
842         s->control_command = s->exec_command + SWAP_EXEC_DEACTIVATE;
843
844         r = exec_command_set(s->control_command,
845                              "/sbin/swapoff",
846                              s->what,
847                              NULL);
848         if (r < 0)
849                 goto fail;
850
851         swap_unwatch_control_pid(s);
852
853         r = swap_spawn(s, s->control_command, &s->control_pid);
854         if (r < 0)
855                 goto fail;
856
857         swap_set_state(s, SWAP_DEACTIVATING);
858
859         return;
860
861 fail:
862         log_unit_warning(UNIT(s)->id,
863                          "%s failed to run 'swapoff' task: %s",
864                          UNIT(s)->id, strerror(-r));
865         swap_enter_active(s, SWAP_FAILURE_RESOURCES);
866 }
867
868 static int swap_start(Unit *u) {
869         Swap *s = SWAP(u);
870
871         assert(s);
872
873         /* We cannot fulfill this request right now, try again later
874          * please! */
875
876         if (s->state == SWAP_DEACTIVATING ||
877             s->state == SWAP_DEACTIVATING_SIGTERM ||
878             s->state == SWAP_DEACTIVATING_SIGKILL ||
879             s->state == SWAP_ACTIVATING_SIGTERM ||
880             s->state == SWAP_ACTIVATING_SIGKILL)
881                 return -EAGAIN;
882
883         if (s->state == SWAP_ACTIVATING)
884                 return 0;
885
886         assert(s->state == SWAP_DEAD || s->state == SWAP_FAILED);
887
888         if (detect_container(NULL) > 0)
889                 return -EPERM;
890
891         s->result = SWAP_SUCCESS;
892         swap_enter_activating(s);
893         return 0;
894 }
895
896 static int swap_stop(Unit *u) {
897         Swap *s = SWAP(u);
898
899         assert(s);
900
901         if (s->state == SWAP_DEACTIVATING ||
902             s->state == SWAP_DEACTIVATING_SIGTERM ||
903             s->state == SWAP_DEACTIVATING_SIGKILL ||
904             s->state == SWAP_ACTIVATING_SIGTERM ||
905             s->state == SWAP_ACTIVATING_SIGKILL)
906                 return 0;
907
908         assert(s->state == SWAP_ACTIVATING ||
909                s->state == SWAP_ACTIVATING_DONE ||
910                s->state == SWAP_ACTIVE);
911
912         if (detect_container(NULL) > 0)
913                 return -EPERM;
914
915         swap_enter_deactivating(s);
916         return 0;
917 }
918
919 static int swap_serialize(Unit *u, FILE *f, FDSet *fds) {
920         Swap *s = SWAP(u);
921
922         assert(s);
923         assert(f);
924         assert(fds);
925
926         unit_serialize_item(u, f, "state", swap_state_to_string(s->state));
927         unit_serialize_item(u, f, "result", swap_result_to_string(s->result));
928
929         if (s->control_pid > 0)
930                 unit_serialize_item_format(u, f, "control-pid", PID_FMT, s->control_pid);
931
932         if (s->control_command_id >= 0)
933                 unit_serialize_item(u, f, "control-command", swap_exec_command_to_string(s->control_command_id));
934
935         return 0;
936 }
937
938 static int swap_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
939         Swap *s = SWAP(u);
940
941         assert(s);
942         assert(fds);
943
944         if (streq(key, "state")) {
945                 SwapState state;
946
947                 state = swap_state_from_string(value);
948                 if (state < 0)
949                         log_unit_debug(u->id, "Failed to parse state value %s", value);
950                 else
951                         s->deserialized_state = state;
952         } else if (streq(key, "result")) {
953                 SwapResult f;
954
955                 f = swap_result_from_string(value);
956                 if (f < 0)
957                         log_unit_debug(u->id, "Failed to parse result value %s", value);
958                 else if (f != SWAP_SUCCESS)
959                         s->result = f;
960         } else if (streq(key, "control-pid")) {
961                 pid_t pid;
962
963                 if (parse_pid(value, &pid) < 0)
964                         log_unit_debug(u->id, "Failed to parse control-pid value %s", value);
965                 else
966                         s->control_pid = pid;
967
968         } else if (streq(key, "control-command")) {
969                 SwapExecCommand id;
970
971                 id = swap_exec_command_from_string(value);
972                 if (id < 0)
973                         log_unit_debug(u->id, "Failed to parse exec-command value %s", value);
974                 else {
975                         s->control_command_id = id;
976                         s->control_command = s->exec_command + id;
977                 }
978         } else
979                 log_unit_debug(u->id, "Unknown serialization key '%s'", key);
980
981         return 0;
982 }
983
984 _pure_ static UnitActiveState swap_active_state(Unit *u) {
985         assert(u);
986
987         return state_translation_table[SWAP(u)->state];
988 }
989
990 _pure_ static const char *swap_sub_state_to_string(Unit *u) {
991         assert(u);
992
993         return swap_state_to_string(SWAP(u)->state);
994 }
995
996 _pure_ static bool swap_check_gc(Unit *u) {
997         Swap *s = SWAP(u);
998
999         assert(s);
1000
1001         return s->from_proc_swaps;
1002 }
1003
1004 static void swap_sigchld_event(Unit *u, pid_t pid, int code, int status) {
1005         Swap *s = SWAP(u);
1006         SwapResult f;
1007
1008         assert(s);
1009         assert(pid >= 0);
1010
1011         if (pid != s->control_pid)
1012                 return;
1013
1014         s->control_pid = 0;
1015
1016         if (is_clean_exit(code, status, NULL))
1017                 f = SWAP_SUCCESS;
1018         else if (code == CLD_EXITED)
1019                 f = SWAP_FAILURE_EXIT_CODE;
1020         else if (code == CLD_KILLED)
1021                 f = SWAP_FAILURE_SIGNAL;
1022         else if (code == CLD_DUMPED)
1023                 f = SWAP_FAILURE_CORE_DUMP;
1024         else
1025                 assert_not_reached("Unknown code");
1026
1027         if (f != SWAP_SUCCESS)
1028                 s->result = f;
1029
1030         if (s->control_command) {
1031                 exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
1032
1033                 s->control_command = NULL;
1034                 s->control_command_id = _SWAP_EXEC_COMMAND_INVALID;
1035         }
1036
1037         log_unit_full(u->id,
1038                       f == SWAP_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
1039                       "%s swap process exited, code=%s status=%i",
1040                       u->id, sigchld_code_to_string(code), status);
1041
1042         switch (s->state) {
1043
1044         case SWAP_ACTIVATING:
1045         case SWAP_ACTIVATING_DONE:
1046         case SWAP_ACTIVATING_SIGTERM:
1047         case SWAP_ACTIVATING_SIGKILL:
1048
1049                 if (f == SWAP_SUCCESS)
1050                         swap_enter_active(s, f);
1051                 else
1052                         swap_enter_dead(s, f);
1053                 break;
1054
1055         case SWAP_DEACTIVATING:
1056         case SWAP_DEACTIVATING_SIGKILL:
1057         case SWAP_DEACTIVATING_SIGTERM:
1058
1059                 swap_enter_dead(s, f);
1060                 break;
1061
1062         default:
1063                 assert_not_reached("Uh, control process died at wrong time.");
1064         }
1065
1066         /* Notify clients about changed exit status */
1067         unit_add_to_dbus_queue(u);
1068 }
1069
1070 static int swap_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata) {
1071         Swap *s = SWAP(userdata);
1072
1073         assert(s);
1074         assert(s->timer_event_source == source);
1075
1076         switch (s->state) {
1077
1078         case SWAP_ACTIVATING:
1079         case SWAP_ACTIVATING_DONE:
1080                 log_unit_warning(UNIT(s)->id, "%s activation timed out. Stopping.", UNIT(s)->id);
1081                 swap_enter_signal(s, SWAP_ACTIVATING_SIGTERM, SWAP_FAILURE_TIMEOUT);
1082                 break;
1083
1084         case SWAP_DEACTIVATING:
1085                 log_unit_warning(UNIT(s)->id, "%s deactivation timed out. Stopping.", UNIT(s)->id);
1086                 swap_enter_signal(s, SWAP_DEACTIVATING_SIGTERM, SWAP_FAILURE_TIMEOUT);
1087                 break;
1088
1089         case SWAP_ACTIVATING_SIGTERM:
1090                 if (s->kill_context.send_sigkill) {
1091                         log_unit_warning(UNIT(s)->id, "%s activation timed out. Killing.", UNIT(s)->id);
1092                         swap_enter_signal(s, SWAP_ACTIVATING_SIGKILL, SWAP_FAILURE_TIMEOUT);
1093                 } else {
1094                         log_unit_warning(UNIT(s)->id, "%s activation timed out. Skipping SIGKILL. Ignoring.", UNIT(s)->id);
1095                         swap_enter_dead(s, SWAP_FAILURE_TIMEOUT);
1096                 }
1097                 break;
1098
1099         case SWAP_DEACTIVATING_SIGTERM:
1100                 if (s->kill_context.send_sigkill) {
1101                         log_unit_warning(UNIT(s)->id, "%s deactivation timed out. Killing.", UNIT(s)->id);
1102                         swap_enter_signal(s, SWAP_DEACTIVATING_SIGKILL, SWAP_FAILURE_TIMEOUT);
1103                 } else {
1104                         log_unit_warning(UNIT(s)->id, "%s deactivation timed out. Skipping SIGKILL. Ignoring.", UNIT(s)->id);
1105                         swap_enter_dead(s, SWAP_FAILURE_TIMEOUT);
1106                 }
1107                 break;
1108
1109         case SWAP_ACTIVATING_SIGKILL:
1110         case SWAP_DEACTIVATING_SIGKILL:
1111                 log_unit_warning(UNIT(s)->id, "%s swap process still around after SIGKILL. Ignoring.", UNIT(s)->id);
1112                 swap_enter_dead(s, SWAP_FAILURE_TIMEOUT);
1113                 break;
1114
1115         default:
1116                 assert_not_reached("Timeout at wrong time.");
1117         }
1118
1119         return 0;
1120 }
1121
1122 static int swap_load_proc_swaps(Manager *m, bool set_flags) {
1123         unsigned i;
1124         int r = 0;
1125
1126         assert(m);
1127
1128         rewind(m->proc_swaps);
1129
1130         (void) fscanf(m->proc_swaps, "%*s %*s %*s %*s %*s\n");
1131
1132         for (i = 1;; i++) {
1133                 _cleanup_free_ char *dev = NULL, *d = NULL;
1134                 int prio = 0, k;
1135
1136                 k = fscanf(m->proc_swaps,
1137                            "%ms "  /* device/file */
1138                            "%*s "  /* type of swap */
1139                            "%*s "  /* swap size */
1140                            "%*s "  /* used */
1141                            "%i\n", /* priority */
1142                            &dev, &prio);
1143                 if (k != 2) {
1144                         if (k == EOF)
1145                                 break;
1146
1147                         log_warning("Failed to parse /proc/swaps:%u", i);
1148                         continue;
1149                 }
1150
1151                 d = cunescape(dev);
1152                 if (!d)
1153                         return -ENOMEM;
1154
1155                 k = swap_process_new_swap(m, d, prio, set_flags);
1156                 if (k < 0)
1157                         r = k;
1158         }
1159
1160         return r;
1161 }
1162
1163 static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1164         Manager *m = userdata;
1165         Unit *u;
1166         int r;
1167
1168         assert(m);
1169         assert(revents & EPOLLPRI);
1170
1171         r = swap_load_proc_swaps(m, true);
1172         if (r < 0) {
1173                 log_error_errno(r, "Failed to reread /proc/swaps: %m");
1174
1175                 /* Reset flags, just in case, for late calls */
1176                 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_SWAP]) {
1177                         Swap *swap = SWAP(u);
1178
1179                         swap->is_active = swap->just_activated = false;
1180                 }
1181
1182                 return 0;
1183         }
1184
1185         manager_dispatch_load_queue(m);
1186
1187         LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_SWAP]) {
1188                 Swap *swap = SWAP(u);
1189
1190                 if (!swap->is_active) {
1191                         /* This has just been deactivated */
1192
1193                         swap_unset_proc_swaps(swap);
1194
1195                         switch (swap->state) {
1196
1197                         case SWAP_ACTIVE:
1198                                 swap_enter_dead(swap, SWAP_SUCCESS);
1199                                 break;
1200
1201                         default:
1202                                 /* Fire again */
1203                                 swap_set_state(swap, swap->state);
1204                                 break;
1205                         }
1206
1207                 } else if (swap->just_activated) {
1208
1209                         /* New swap entry */
1210
1211                         switch (swap->state) {
1212
1213                         case SWAP_DEAD:
1214                         case SWAP_FAILED:
1215                                 swap_enter_active(swap, SWAP_SUCCESS);
1216                                 break;
1217
1218                         case SWAP_ACTIVATING:
1219                                 swap_set_state(swap, SWAP_ACTIVATING_DONE);
1220                                 break;
1221
1222                         default:
1223                                 /* Nothing really changed, but let's
1224                                  * issue an notification call
1225                                  * nonetheless, in case somebody is
1226                                  * waiting for this. */
1227                                 swap_set_state(swap, swap->state);
1228                                 break;
1229                         }
1230                 }
1231
1232                 /* Reset the flags for later calls */
1233                 swap->is_active = swap->just_activated = false;
1234         }
1235
1236         return 1;
1237 }
1238
1239 static Unit *swap_following(Unit *u) {
1240         Swap *s = SWAP(u);
1241         Swap *other, *first = NULL;
1242
1243         assert(s);
1244
1245         /* If the user configured the swap through /etc/fstab or
1246          * a device unit, follow that. */
1247
1248         if (s->from_fragment)
1249                 return NULL;
1250
1251         LIST_FOREACH_AFTER(same_devnode, other, s)
1252                 if (other->from_fragment)
1253                         return UNIT(other);
1254
1255         LIST_FOREACH_BEFORE(same_devnode, other, s)
1256                 if (other->from_fragment)
1257                         return UNIT(other);
1258
1259         /* Otherwise make everybody follow the unit that's named after
1260          * the swap device in the kernel */
1261
1262         if (streq_ptr(s->what, s->devnode))
1263                 return NULL;
1264
1265         LIST_FOREACH_AFTER(same_devnode, other, s)
1266                 if (streq_ptr(other->what, other->devnode))
1267                         return UNIT(other);
1268
1269         LIST_FOREACH_BEFORE(same_devnode, other, s) {
1270                 if (streq_ptr(other->what, other->devnode))
1271                         return UNIT(other);
1272
1273                 first = other;
1274         }
1275
1276         /* Fall back to the first on the list */
1277         return UNIT(first);
1278 }
1279
1280 static int swap_following_set(Unit *u, Set **_set) {
1281         Swap *s = SWAP(u), *other;
1282         Set *set;
1283         int r;
1284
1285         assert(s);
1286         assert(_set);
1287
1288         if (LIST_JUST_US(same_devnode, s)) {
1289                 *_set = NULL;
1290                 return 0;
1291         }
1292
1293         set = set_new(NULL);
1294         if (!set)
1295                 return -ENOMEM;
1296
1297         LIST_FOREACH_AFTER(same_devnode, other, s) {
1298                 r = set_put(set, other);
1299                 if (r < 0)
1300                         goto fail;
1301         }
1302
1303         LIST_FOREACH_BEFORE(same_devnode, other, s) {
1304                 r = set_put(set, other);
1305                 if (r < 0)
1306                         goto fail;
1307         }
1308
1309         *_set = set;
1310         return 1;
1311
1312 fail:
1313         set_free(set);
1314         return r;
1315 }
1316
1317 static void swap_shutdown(Manager *m) {
1318         assert(m);
1319
1320         m->swap_event_source = sd_event_source_unref(m->swap_event_source);
1321
1322         if (m->proc_swaps) {
1323                 fclose(m->proc_swaps);
1324                 m->proc_swaps = NULL;
1325         }
1326
1327         hashmap_free(m->swaps_by_devnode);
1328         m->swaps_by_devnode = NULL;
1329 }
1330
1331 static int swap_enumerate(Manager *m) {
1332         int r;
1333
1334         assert(m);
1335
1336         if (!m->proc_swaps) {
1337                 m->proc_swaps = fopen("/proc/swaps", "re");
1338                 if (!m->proc_swaps)
1339                         return errno == ENOENT ? 0 : -errno;
1340
1341                 r = sd_event_add_io(m->event, &m->swap_event_source, fileno(m->proc_swaps), EPOLLPRI, swap_dispatch_io, m);
1342                 if (r < 0)
1343                         goto fail;
1344
1345                 /* Dispatch this before we dispatch SIGCHLD, so that
1346                  * we always get the events from /proc/swaps before
1347                  * the SIGCHLD of /sbin/swapon. */
1348                 r = sd_event_source_set_priority(m->swap_event_source, -10);
1349                 if (r < 0)
1350                         goto fail;
1351         }
1352
1353         r = swap_load_proc_swaps(m, false);
1354         if (r < 0)
1355                 goto fail;
1356
1357         return 0;
1358
1359 fail:
1360         swap_shutdown(m);
1361         return r;
1362 }
1363
1364 int swap_process_new_device(Manager *m, struct udev_device *dev) {
1365         struct udev_list_entry *item = NULL, *first = NULL;
1366         _cleanup_free_ char *e = NULL;
1367         const char *dn;
1368         Swap *s;
1369         int r = 0;
1370
1371         assert(m);
1372         assert(dev);
1373
1374         dn = udev_device_get_devnode(dev);
1375         if (!dn)
1376                 return 0;
1377
1378         e = unit_name_from_path(dn, ".swap");
1379         if (!e)
1380                 return -ENOMEM;
1381
1382         s = hashmap_get(m->units, e);
1383         if (s)
1384                 r = swap_set_devnode(s, dn);
1385
1386         first = udev_device_get_devlinks_list_entry(dev);
1387         udev_list_entry_foreach(item, first) {
1388                 _cleanup_free_ char *n = NULL;
1389
1390                 n = unit_name_from_path(udev_list_entry_get_name(item), ".swap");
1391                 if (!n)
1392                         return -ENOMEM;
1393
1394                 s = hashmap_get(m->units, n);
1395                 if (s) {
1396                         int q;
1397
1398                         q = swap_set_devnode(s, dn);
1399                         if (q < 0)
1400                                 r = q;
1401                 }
1402         }
1403
1404         return r;
1405 }
1406
1407 int swap_process_removed_device(Manager *m, struct udev_device *dev) {
1408         const char *dn;
1409         int r = 0;
1410         Swap *s;
1411
1412         dn = udev_device_get_devnode(dev);
1413         if (!dn)
1414                 return 0;
1415
1416         while ((s = hashmap_get(m->swaps_by_devnode, dn))) {
1417                 int q;
1418
1419                 q = swap_set_devnode(s, NULL);
1420                 if (q < 0)
1421                         r = q;
1422         }
1423
1424         return r;
1425 }
1426
1427 static void swap_reset_failed(Unit *u) {
1428         Swap *s = SWAP(u);
1429
1430         assert(s);
1431
1432         if (s->state == SWAP_FAILED)
1433                 swap_set_state(s, SWAP_DEAD);
1434
1435         s->result = SWAP_SUCCESS;
1436 }
1437
1438 static int swap_kill(Unit *u, KillWho who, int signo, sd_bus_error *error) {
1439         return unit_kill_common(u, who, signo, -1, SWAP(u)->control_pid, error);
1440 }
1441
1442 static int swap_get_timeout(Unit *u, uint64_t *timeout) {
1443         Swap *s = SWAP(u);
1444         int r;
1445
1446         if (!s->timer_event_source)
1447                 return 0;
1448
1449         r = sd_event_source_get_time(s->timer_event_source, timeout);
1450         if (r < 0)
1451                 return r;
1452
1453         return 1;
1454 }
1455
1456 static bool swap_supported(Manager *m) {
1457         static int supported = -1;
1458
1459         /* If swap support is not available in the kernel, or we are
1460          * running in a container we don't support swap units, and any
1461          * attempts to starting one should fail immediately. */
1462
1463         if (supported < 0)
1464                 supported =
1465                         access("/proc/swaps", F_OK) >= 0 &&
1466                         detect_container(NULL) <= 0;
1467
1468         return supported;
1469 }
1470
1471 static const char* const swap_state_table[_SWAP_STATE_MAX] = {
1472         [SWAP_DEAD] = "dead",
1473         [SWAP_ACTIVATING] = "activating",
1474         [SWAP_ACTIVATING_DONE] = "activating-done",
1475         [SWAP_ACTIVE] = "active",
1476         [SWAP_DEACTIVATING] = "deactivating",
1477         [SWAP_ACTIVATING_SIGTERM] = "activating-sigterm",
1478         [SWAP_ACTIVATING_SIGKILL] = "activating-sigkill",
1479         [SWAP_DEACTIVATING_SIGTERM] = "deactivating-sigterm",
1480         [SWAP_DEACTIVATING_SIGKILL] = "deactivating-sigkill",
1481         [SWAP_FAILED] = "failed"
1482 };
1483
1484 DEFINE_STRING_TABLE_LOOKUP(swap_state, SwapState);
1485
1486 static const char* const swap_exec_command_table[_SWAP_EXEC_COMMAND_MAX] = {
1487         [SWAP_EXEC_ACTIVATE] = "ExecActivate",
1488         [SWAP_EXEC_DEACTIVATE] = "ExecDeactivate",
1489 };
1490
1491 DEFINE_STRING_TABLE_LOOKUP(swap_exec_command, SwapExecCommand);
1492
1493 static const char* const swap_result_table[_SWAP_RESULT_MAX] = {
1494         [SWAP_SUCCESS] = "success",
1495         [SWAP_FAILURE_RESOURCES] = "resources",
1496         [SWAP_FAILURE_TIMEOUT] = "timeout",
1497         [SWAP_FAILURE_EXIT_CODE] = "exit-code",
1498         [SWAP_FAILURE_SIGNAL] = "signal",
1499         [SWAP_FAILURE_CORE_DUMP] = "core-dump"
1500 };
1501
1502 DEFINE_STRING_TABLE_LOOKUP(swap_result, SwapResult);
1503
1504 const UnitVTable swap_vtable = {
1505         .object_size = sizeof(Swap),
1506         .exec_context_offset = offsetof(Swap, exec_context),
1507         .cgroup_context_offset = offsetof(Swap, cgroup_context),
1508         .kill_context_offset = offsetof(Swap, kill_context),
1509         .exec_runtime_offset = offsetof(Swap, exec_runtime),
1510
1511         .sections =
1512                 "Unit\0"
1513                 "Swap\0"
1514                 "Install\0",
1515         .private_section = "Swap",
1516
1517         .no_alias = true,
1518         .no_instances = true,
1519
1520         .init = swap_init,
1521         .load = swap_load,
1522         .done = swap_done,
1523
1524         .coldplug = swap_coldplug,
1525
1526         .dump = swap_dump,
1527
1528         .start = swap_start,
1529         .stop = swap_stop,
1530
1531         .kill = swap_kill,
1532
1533         .get_timeout = swap_get_timeout,
1534
1535         .serialize = swap_serialize,
1536         .deserialize_item = swap_deserialize_item,
1537
1538         .active_state = swap_active_state,
1539         .sub_state_to_string = swap_sub_state_to_string,
1540
1541         .check_gc = swap_check_gc,
1542
1543         .sigchld_event = swap_sigchld_event,
1544
1545         .reset_failed = swap_reset_failed,
1546
1547         .bus_interface = "org.freedesktop.systemd1.Swap",
1548         .bus_vtable = bus_swap_vtable,
1549         .bus_set_property = bus_swap_set_property,
1550         .bus_commit_properties = bus_swap_commit_properties,
1551
1552         .following = swap_following,
1553         .following_set = swap_following_set,
1554
1555         .enumerate = swap_enumerate,
1556         .shutdown = swap_shutdown,
1557         .supported = swap_supported,
1558
1559         .status_message_formats = {
1560                 .starting_stopping = {
1561                         [0] = "Activating swap %s...",
1562                         [1] = "Deactivating swap %s...",
1563                 },
1564                 .finished_start_job = {
1565                         [JOB_DONE]       = "Activated swap %s.",
1566                         [JOB_FAILED]     = "Failed to activate swap %s.",
1567                         [JOB_DEPENDENCY] = "Dependency failed for %s.",
1568                         [JOB_TIMEOUT]    = "Timed out activating swap %s.",
1569                 },
1570                 .finished_stop_job = {
1571                         [JOB_DONE]       = "Deactivated swap %s.",
1572                         [JOB_FAILED]     = "Failed deactivating swap %s.",
1573                         [JOB_TIMEOUT]    = "Timed out deactivating swap %s.",
1574                 },
1575         },
1576 };