chiark / gitweb /
core: add global settings for enabling CPUAccounting=, MemoryAccounting=, BlockIOAcco...
[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-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_func, string_compare_func);
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         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);
126
127         unit_cgroup_context_init_defaults(u, &s->cgroup_context);
128
129         s->parameters_proc_swaps.priority = s->parameters_fragment.priority = -1;
130
131         s->control_command_id = _SWAP_EXEC_COMMAND_INVALID;
132
133         u->ignore_on_isolate = true;
134 }
135
136 static void swap_unwatch_control_pid(Swap *s) {
137         assert(s);
138
139         if (s->control_pid <= 0)
140                 return;
141
142         unit_unwatch_pid(UNIT(s), s->control_pid);
143         s->control_pid = 0;
144 }
145
146 static void swap_done(Unit *u) {
147         Swap *s = SWAP(u);
148
149         assert(s);
150
151         swap_unset_proc_swaps(s);
152         swap_set_devnode(s, NULL);
153
154         free(s->what);
155         s->what = NULL;
156
157         free(s->parameters_fragment.what);
158         s->parameters_fragment.what = NULL;
159
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;
165
166         swap_unwatch_control_pid(s);
167
168         s->timer_event_source = sd_event_source_unref(s->timer_event_source);
169 }
170
171 static int swap_arm_timer(Swap *s) {
172         int r;
173
174         assert(s);
175
176         if (s->timeout_usec <= 0) {
177                 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
178                 return 0;
179         }
180
181         if (s->timer_event_source) {
182                 r = sd_event_source_set_time(s->timer_event_source, now(CLOCK_MONOTONIC) + s->timeout_usec);
183                 if (r < 0)
184                         return r;
185
186                 return sd_event_source_set_enabled(s->timer_event_source, SD_EVENT_ONESHOT);
187         }
188
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);
190 }
191
192 static int swap_add_device_links(Swap *s) {
193         SwapParameters *p;
194
195         assert(s);
196
197         if (!s->what)
198                 return 0;
199
200         if (s->from_fragment)
201                 p = &s->parameters_fragment;
202         else
203                 return 0;
204
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);
207         else
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);
212 }
213
214 static int swap_add_default_dependencies(Swap *s) {
215         bool nofail = false, noauto = false;
216         int r;
217
218         assert(s);
219
220         if (UNIT(s)->manager->running_as != SYSTEMD_SYSTEM)
221                 return 0;
222
223         if (detect_container(NULL) > 0)
224                 return 0;
225
226         r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
227         if (r < 0)
228                 return r;
229
230         if (s->from_fragment) {
231                 SwapParameters *p = &s->parameters_fragment;
232
233                 nofail = p->nofail;
234                 noauto = p->noauto;
235         }
236
237         if (!noauto) {
238                 if (nofail)
239                         r = unit_add_dependency_by_name_inverse(UNIT(s), UNIT_WANTS, SPECIAL_SWAP_TARGET, NULL, true);
240                 else
241                         r = unit_add_two_dependencies_by_name_inverse(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SWAP_TARGET, NULL, true);
242                 if (r < 0)
243                         return r;
244         }
245
246         return 0;
247 }
248
249 static int swap_verify(Swap *s) {
250         bool b;
251         _cleanup_free_ char *e = NULL;
252
253         if (UNIT(s)->load_state != UNIT_LOADED)
254                 return 0;
255
256         e = unit_name_from_path(s->what, ".swap");
257         if (!e)
258                 return log_oom();
259
260         b = unit_has_name(UNIT(s), e);
261         if (!b) {
262                 log_error_unit(UNIT(s)->id, "%s: Value of \"What\" and unit name do not match, not loading.", UNIT(s)->id);
263                 return -EINVAL;
264         }
265
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);
268                 return -EINVAL;
269         }
270
271         return 0;
272 }
273
274 static int swap_load_devnode(Swap *s) {
275         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
276         struct stat st;
277         const char *p;
278
279         assert(s);
280
281         if (stat(s->what, &st) < 0 || !S_ISBLK(st.st_mode))
282                 return 0;
283
284         d = udev_device_new_from_devnum(UNIT(s)->manager->udev, 'b', st.st_rdev);
285         if (!d)
286                 return 0;
287
288         p = udev_device_get_devnode(d);
289         if (!p)
290                 return 0;
291
292         return swap_set_devnode(s, p);
293 }
294
295 static int swap_load(Unit *u) {
296         int r;
297         Swap *s = SWAP(u);
298
299         assert(s);
300         assert(u->load_state == UNIT_STUB);
301
302         /* Load a .swap file */
303         r = unit_load_fragment_and_dropin_optional(u);
304         if (r < 0)
305                 return r;
306
307         if (u->load_state == UNIT_LOADED) {
308                 r = unit_add_exec_dependencies(u, &s->exec_context);
309                 if (r < 0)
310                         return r;
311
312                 if (UNIT(s)->fragment_path)
313                         s->from_fragment = true;
314
315                 if (!s->what) {
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);
320                         else
321                                 s->what = unit_name_to_path(u->id);
322
323                         if (!s->what)
324                                 return -ENOMEM;
325                 }
326
327                 path_kill_slashes(s->what);
328
329                 if (!UNIT(s)->description) {
330                         r = unit_set_description(u, s->what);
331                         if (r < 0)
332                                 return r;
333                 }
334
335                 r = unit_require_mounts_for(UNIT(s), s->what);
336                 if (r < 0)
337                         return r;
338
339                 r = swap_add_device_links(s);
340                 if (r < 0)
341                         return r;
342
343                 r = swap_load_devnode(s);
344                 if (r < 0)
345                         return r;
346
347                 r = unit_add_default_slice(u);
348                 if (r < 0)
349                         return r;
350
351                 if (UNIT(s)->default_dependencies) {
352                         r = swap_add_default_dependencies(s);
353                         if (r < 0)
354                                 return r;
355                 }
356
357                 r = unit_exec_context_patch_defaults(u, &s->exec_context);
358                 if (r < 0)
359                         return r;
360         }
361
362         return swap_verify(s);
363 }
364
365 static int swap_add_one(
366                 Manager *m,
367                 const char *what,
368                 const char *what_proc_swaps,
369                 int priority,
370                 bool noauto,
371                 bool nofail,
372                 bool set_flags) {
373
374         _cleanup_free_ char *e = NULL;
375         bool delete = false;
376         Unit *u = NULL;
377         int r;
378         SwapParameters *p;
379
380         assert(m);
381         assert(what);
382         assert(what_proc_swaps);
383
384         e = unit_name_from_path(what, ".swap");
385         if (!e)
386                 return log_oom();
387
388         u = manager_get_unit(m, e);
389
390         if (u &&
391             SWAP(u)->from_proc_swaps &&
392             !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
393                 return -EEXIST;
394
395         if (!u) {
396                 delete = true;
397
398                 u = unit_new(m, sizeof(Swap));
399                 if (!u)
400                         return log_oom();
401
402                 r = unit_add_name(u, e);
403                 if (r < 0)
404                         goto fail;
405
406                 SWAP(u)->what = strdup(what);
407                 if (!SWAP(u)->what) {
408                         r = log_oom();
409                         goto fail;
410                 }
411
412                 unit_add_to_load_queue(u);
413         } else
414                 delete = false;
415
416         p = &SWAP(u)->parameters_proc_swaps;
417
418         if (!p->what) {
419                 p->what = strdup(what_proc_swaps);
420                 if (!p->what) {
421                         r = -ENOMEM;
422                         goto fail;
423                 }
424         }
425
426         if (set_flags) {
427                 SWAP(u)->is_active = true;
428                 SWAP(u)->just_activated = !SWAP(u)->from_proc_swaps;
429         }
430
431         SWAP(u)->from_proc_swaps = true;
432
433         p->priority = priority;
434         p->noauto = noauto;
435         p->nofail = nofail;
436
437         unit_add_to_dbus_queue(u);
438
439         return 0;
440
441 fail:
442         log_warning_unit(e, "Failed to load swap unit: %s", strerror(-r));
443
444         if (delete && u)
445                 unit_free(u);
446
447         return r;
448 }
449
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;
453         const char *dn;
454         struct stat st;
455         int r;
456
457         assert(m);
458
459         r = swap_add_one(m, device, device, prio, false, false, set_flags);
460         if (r < 0)
461                 return r;
462
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))
466                 return 0;
467
468         d = udev_device_new_from_devnum(m->udev, 'b', st.st_rdev);
469         if (!d)
470                 return 0;
471
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);
476
477         /* Add additional units for all symlinks */
478         first = udev_device_get_devlinks_list_entry(d);
479         udev_list_entry_foreach(item, first) {
480                 const char *p;
481
482                 /* Don't bother with the /dev/block links */
483                 p = udev_list_entry_get_name(item);
484
485                 if (streq(p, device))
486                         continue;
487
488                 if (path_startswith(p, "/dev/block/"))
489                         continue;
490
491                 if (stat(p, &st) >= 0)
492                         if (!S_ISBLK(st.st_mode) ||
493                             st.st_rdev != udev_device_get_devnum(d))
494                                 continue;
495
496                 swap_add_one(m, p, device, prio, false, false, set_flags);
497         }
498
499         return r;
500 }
501
502 static void swap_set_state(Swap *s, SwapState state) {
503         SwapState old_state;
504
505         assert(s);
506
507         old_state = s->state;
508         s->state = state;
509
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;
521         }
522
523         if (state != old_state)
524                 log_debug_unit(UNIT(s)->id,
525                                "%s changed %s -> %s",
526                                UNIT(s)->id,
527                                swap_state_to_string(old_state),
528                                swap_state_to_string(state));
529
530         unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], true);
531 }
532
533 static int swap_coldplug(Unit *u) {
534         Swap *s = SWAP(u);
535         SwapState new_state = SWAP_DEAD;
536         int r;
537
538         assert(s);
539         assert(s->state == SWAP_DEAD);
540
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;
545
546         if (new_state == s->state)
547                 return 0;
548
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) {
556
557                 if (s->control_pid <= 0)
558                         return -EBADMSG;
559
560                 r = unit_watch_pid(UNIT(s), s->control_pid);
561                 if (r < 0)
562                         return r;
563
564                 r = swap_arm_timer(s);
565                 if (r < 0)
566                         return r;
567         }
568
569         swap_set_state(s, new_state);
570         return 0;
571 }
572
573 static void swap_dump(Unit *u, FILE *f, const char *prefix) {
574         Swap *s = SWAP(u);
575         SwapParameters *p;
576
577         assert(s);
578         assert(f);
579
580         if (s->from_proc_swaps)
581                 p = &s->parameters_proc_swaps;
582         else if (s->from_fragment)
583                 p = &s->parameters_fragment;
584         else
585                 p = NULL;
586
587         fprintf(f,
588                 "%sSwap State: %s\n"
589                 "%sResult: %s\n"
590                 "%sWhat: %s\n"
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),
595                 prefix, s->what,
596                 prefix, yes_no(s->from_proc_swaps),
597                 prefix, yes_no(s->from_fragment));
598
599         if (s->devnode)
600                 fprintf(f, "%sDevice Node: %s\n", prefix, s->devnode);
601
602         if (p)
603                 fprintf(f,
604                         "%sPriority: %i\n"
605                         "%sNoAuto: %s\n"
606                         "%sNoFail: %s\n",
607                         prefix, p->priority,
608                         prefix, yes_no(p->noauto),
609                         prefix, yes_no(p->nofail));
610
611         if (s->control_pid > 0)
612                 fprintf(f,
613                         "%sControl PID: %lu\n",
614                         prefix, (unsigned long) s->control_pid);
615
616         exec_context_dump(&s->exec_context, f, prefix);
617         kill_context_dump(&s->kill_context, f, prefix);
618 }
619
620 static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) {
621         pid_t pid;
622         int r;
623
624         assert(s);
625         assert(c);
626         assert(_pid);
627
628         unit_realize_cgroup(UNIT(s));
629
630         r = unit_setup_exec_runtime(UNIT(s));
631         if (r < 0)
632                 goto fail;
633
634         r = swap_arm_timer(s);
635         if (r < 0)
636                 goto fail;
637
638         r = exec_spawn(c,
639                        NULL,
640                        &s->exec_context,
641                        NULL, 0,
642                        UNIT(s)->manager->environment,
643                        true,
644                        true,
645                        true,
646                        UNIT(s)->manager->confirm_spawn,
647                        UNIT(s)->manager->cgroup_supported,
648                        UNIT(s)->cgroup_path,
649                        UNIT(s)->id,
650                        0,
651                        NULL,
652                        s->exec_runtime,
653                        &pid);
654         if (r < 0)
655                 goto fail;
656
657         r = unit_watch_pid(UNIT(s), pid);
658         if (r < 0)
659                 /* FIXME: we need to do something here */
660                 goto fail;
661
662         *_pid = pid;
663
664         return 0;
665
666 fail:
667         s->timer_event_source = sd_event_source_unref(s->timer_event_source);
668
669         return r;
670 }
671
672 static void swap_enter_dead(Swap *s, SwapResult f) {
673         assert(s);
674
675         if (f != SWAP_SUCCESS)
676                 s->result = f;
677
678         exec_runtime_destroy(s->exec_runtime);
679         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
680
681         swap_set_state(s, s->result != SWAP_SUCCESS ? SWAP_FAILED : SWAP_DEAD);
682 }
683
684 static void swap_enter_active(Swap *s, SwapResult f) {
685         assert(s);
686
687         if (f != SWAP_SUCCESS)
688                 s->result = f;
689
690         swap_set_state(s, SWAP_ACTIVE);
691 }
692
693 static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) {
694         int r;
695
696         assert(s);
697
698         if (f != SWAP_SUCCESS)
699                 s->result = f;
700
701         r = unit_kill_context(
702                         UNIT(s),
703                         &s->kill_context,
704                         state != SWAP_ACTIVATING_SIGTERM && state != SWAP_DEACTIVATING_SIGTERM,
705                         -1,
706                         s->control_pid,
707                         false);
708         if (r < 0)
709                 goto fail;
710
711         if (r > 0) {
712                 r = swap_arm_timer(s);
713                 if (r < 0)
714                         goto fail;
715
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);
721         else
722                 swap_enter_dead(s, SWAP_SUCCESS);
723
724         return;
725
726 fail:
727         log_warning_unit(UNIT(s)->id,
728                          "%s failed to kill processes: %s", UNIT(s)->id, strerror(-r));
729
730         swap_enter_dead(s, SWAP_FAILURE_RESOURCES);
731 }
732
733 static void swap_enter_activating(Swap *s) {
734         int r, priority;
735
736         assert(s);
737
738         s->control_command_id = SWAP_EXEC_ACTIVATE;
739         s->control_command = s->exec_command + SWAP_EXEC_ACTIVATE;
740
741         if (s->from_fragment)
742                 priority = s->parameters_fragment.priority;
743         else
744                 priority = -1;
745
746         if (priority >= 0) {
747                 char p[DECIMAL_STR_MAX(int)];
748
749                 sprintf(p, "%i", priority);
750
751                 r = exec_command_set(
752                                 s->control_command,
753                                 "/sbin/swapon",
754                                 "-p",
755                                 p,
756                                 s->what,
757                                 NULL);
758         } else
759                 r = exec_command_set(
760                                 s->control_command,
761                                 "/sbin/swapon",
762                                 s->what,
763                                 NULL);
764
765         if (r < 0)
766                 goto fail;
767
768         swap_unwatch_control_pid(s);
769
770         r = swap_spawn(s, s->control_command, &s->control_pid);
771         if (r < 0)
772                 goto fail;
773
774         swap_set_state(s, SWAP_ACTIVATING);
775
776         return;
777
778 fail:
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);
783 }
784
785 static void swap_enter_deactivating(Swap *s) {
786         int r;
787
788         assert(s);
789
790         s->control_command_id = SWAP_EXEC_DEACTIVATE;
791         s->control_command = s->exec_command + SWAP_EXEC_DEACTIVATE;
792
793         r = exec_command_set(s->control_command,
794                              "/sbin/swapoff",
795                              s->what,
796                              NULL);
797         if (r < 0)
798                 goto fail;
799
800         swap_unwatch_control_pid(s);
801
802         r = swap_spawn(s, s->control_command, &s->control_pid);
803         if (r < 0)
804                 goto fail;
805
806         swap_set_state(s, SWAP_DEACTIVATING);
807
808         return;
809
810 fail:
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);
815 }
816
817 static int swap_start(Unit *u) {
818         Swap *s = SWAP(u);
819
820         assert(s);
821
822         /* We cannot fulfill this request right now, try again later
823          * please! */
824
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)
830                 return -EAGAIN;
831
832         if (s->state == SWAP_ACTIVATING)
833                 return 0;
834
835         assert(s->state == SWAP_DEAD || s->state == SWAP_FAILED);
836
837         if (detect_container(NULL) > 0)
838                 return -EPERM;
839
840         s->result = SWAP_SUCCESS;
841         swap_enter_activating(s);
842         return 0;
843 }
844
845 static int swap_stop(Unit *u) {
846         Swap *s = SWAP(u);
847
848         assert(s);
849
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)
855                 return 0;
856
857         assert(s->state == SWAP_ACTIVATING ||
858                s->state == SWAP_ACTIVATING_DONE ||
859                s->state == SWAP_ACTIVE);
860
861         if (detect_container(NULL) > 0)
862                 return -EPERM;
863
864         swap_enter_deactivating(s);
865         return 0;
866 }
867
868 static int swap_serialize(Unit *u, FILE *f, FDSet *fds) {
869         Swap *s = SWAP(u);
870
871         assert(s);
872         assert(f);
873         assert(fds);
874
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));
877
878         if (s->control_pid > 0)
879                 unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) s->control_pid);
880
881         if (s->control_command_id >= 0)
882                 unit_serialize_item(u, f, "control-command", swap_exec_command_to_string(s->control_command_id));
883
884         return 0;
885 }
886
887 static int swap_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
888         Swap *s = SWAP(u);
889
890         assert(s);
891         assert(fds);
892
893         if (streq(key, "state")) {
894                 SwapState state;
895
896                 state = swap_state_from_string(value);
897                 if (state < 0)
898                         log_debug_unit(u->id, "Failed to parse state value %s", value);
899                 else
900                         s->deserialized_state = state;
901         } else if (streq(key, "result")) {
902                 SwapResult f;
903
904                 f = swap_result_from_string(value);
905                 if (f < 0)
906                         log_debug_unit(u->id, "Failed to parse result value %s", value);
907                 else if (f != SWAP_SUCCESS)
908                         s->result = f;
909         } else if (streq(key, "control-pid")) {
910                 pid_t pid;
911
912                 if (parse_pid(value, &pid) < 0)
913                         log_debug_unit(u->id, "Failed to parse control-pid value %s", value);
914                 else
915                         s->control_pid = pid;
916
917         } else if (streq(key, "control-command")) {
918                 SwapExecCommand id;
919
920                 id = swap_exec_command_from_string(value);
921                 if (id < 0)
922                         log_debug_unit(u->id, "Failed to parse exec-command value %s", value);
923                 else {
924                         s->control_command_id = id;
925                         s->control_command = s->exec_command + id;
926                 }
927         } else
928                 log_debug_unit(u->id, "Unknown serialization key '%s'", key);
929
930         return 0;
931 }
932
933 _pure_ static UnitActiveState swap_active_state(Unit *u) {
934         assert(u);
935
936         return state_translation_table[SWAP(u)->state];
937 }
938
939 _pure_ static const char *swap_sub_state_to_string(Unit *u) {
940         assert(u);
941
942         return swap_state_to_string(SWAP(u)->state);
943 }
944
945 _pure_ static bool swap_check_gc(Unit *u) {
946         Swap *s = SWAP(u);
947
948         assert(s);
949
950         return s->from_proc_swaps;
951 }
952
953 static void swap_sigchld_event(Unit *u, pid_t pid, int code, int status) {
954         Swap *s = SWAP(u);
955         SwapResult f;
956
957         assert(s);
958         assert(pid >= 0);
959
960         if (pid != s->control_pid)
961                 return;
962
963         s->control_pid = 0;
964
965         if (is_clean_exit(code, status, NULL))
966                 f = SWAP_SUCCESS;
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;
973         else
974                 assert_not_reached("Unknown code");
975
976         if (f != SWAP_SUCCESS)
977                 s->result = f;
978
979         if (s->control_command) {
980                 exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
981
982                 s->control_command = NULL;
983                 s->control_command_id = _SWAP_EXEC_COMMAND_INVALID;
984         }
985
986         log_full_unit(f == SWAP_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
987                       u->id,
988                       "%s swap process exited, code=%s status=%i",
989                       u->id, sigchld_code_to_string(code), status);
990
991         switch (s->state) {
992
993         case SWAP_ACTIVATING:
994         case SWAP_ACTIVATING_DONE:
995         case SWAP_ACTIVATING_SIGTERM:
996         case SWAP_ACTIVATING_SIGKILL:
997
998                 if (f == SWAP_SUCCESS)
999                         swap_enter_active(s, f);
1000                 else
1001                         swap_enter_dead(s, f);
1002                 break;
1003
1004         case SWAP_DEACTIVATING:
1005         case SWAP_DEACTIVATING_SIGKILL:
1006         case SWAP_DEACTIVATING_SIGTERM:
1007
1008                 swap_enter_dead(s, f);
1009                 break;
1010
1011         default:
1012                 assert_not_reached("Uh, control process died at wrong time.");
1013         }
1014
1015         /* Notify clients about changed exit status */
1016         unit_add_to_dbus_queue(u);
1017 }
1018
1019 static int swap_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata) {
1020         Swap *s = SWAP(userdata);
1021
1022         assert(s);
1023         assert(s->timer_event_source == source);
1024
1025         switch (s->state) {
1026
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);
1031                 break;
1032
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);
1036                 break;
1037
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);
1042                 } else {
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);
1045                 }
1046                 break;
1047
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);
1052                 } else {
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);
1055                 }
1056                 break;
1057
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);
1062                 break;
1063
1064         default:
1065                 assert_not_reached("Timeout at wrong time.");
1066         }
1067
1068         return 0;
1069 }
1070
1071 static int swap_load_proc_swaps(Manager *m, bool set_flags) {
1072         unsigned i;
1073         int r = 0;
1074
1075         assert(m);
1076
1077         rewind(m->proc_swaps);
1078
1079         (void) fscanf(m->proc_swaps, "%*s %*s %*s %*s %*s\n");
1080
1081         for (i = 1;; i++) {
1082                 _cleanup_free_ char *dev = NULL, *d = NULL;
1083                 int prio = 0, k;
1084
1085                 k = fscanf(m->proc_swaps,
1086                            "%ms "  /* device/file */
1087                            "%*s "  /* type of swap */
1088                            "%*s "  /* swap size */
1089                            "%*s "  /* used */
1090                            "%i\n", /* priority */
1091                            &dev, &prio);
1092                 if (k != 2) {
1093                         if (k == EOF)
1094                                 break;
1095
1096                         log_warning("Failed to parse /proc/swaps:%u", i);
1097                         continue;
1098                 }
1099
1100                 d = cunescape(dev);
1101                 if (!d)
1102                         return -ENOMEM;
1103
1104                 k = swap_process_new_swap(m, d, prio, set_flags);
1105                 if (k < 0)
1106                         r = k;
1107         }
1108
1109         return r;
1110 }
1111
1112 static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1113         Manager *m = userdata;
1114         Unit *u;
1115         int r;
1116
1117         assert(m);
1118         assert(revents & EPOLLPRI);
1119
1120         r = swap_load_proc_swaps(m, true);
1121         if (r < 0) {
1122                 log_error("Failed to reread /proc/swaps: %s", strerror(-r));
1123
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);
1127
1128                         swap->is_active = swap->just_activated = false;
1129                 }
1130
1131                 return 0;
1132         }
1133
1134         manager_dispatch_load_queue(m);
1135
1136         LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_SWAP]) {
1137                 Swap *swap = SWAP(u);
1138
1139                 if (!swap->is_active) {
1140                         /* This has just been deactivated */
1141
1142                         swap_unset_proc_swaps(swap);
1143
1144                         switch (swap->state) {
1145
1146                         case SWAP_ACTIVE:
1147                                 swap_enter_dead(swap, SWAP_SUCCESS);
1148                                 break;
1149
1150                         default:
1151                                 /* Fire again */
1152                                 swap_set_state(swap, swap->state);
1153                                 break;
1154                         }
1155
1156                 } else if (swap->just_activated) {
1157
1158                         /* New swap entry */
1159
1160                         switch (swap->state) {
1161
1162                         case SWAP_DEAD:
1163                         case SWAP_FAILED:
1164                                 swap_enter_active(swap, SWAP_SUCCESS);
1165                                 break;
1166
1167                         case SWAP_ACTIVATING:
1168                                 swap_set_state(swap, SWAP_ACTIVATING_DONE);
1169                                 break;
1170
1171                         default:
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);
1177                                 break;
1178                         }
1179                 }
1180
1181                 /* Reset the flags for later calls */
1182                 swap->is_active = swap->just_activated = false;
1183         }
1184
1185         return 1;
1186 }
1187
1188 static Unit *swap_following(Unit *u) {
1189         Swap *s = SWAP(u);
1190         Swap *other, *first = NULL;
1191
1192         assert(s);
1193
1194         if (streq_ptr(s->what, s->devnode))
1195                 return NULL;
1196
1197         /* Make everybody follow the unit that's named after the swap
1198          * device in the kernel */
1199
1200         LIST_FOREACH_AFTER(same_devnode, other, s)
1201                 if (streq_ptr(other->what, other->devnode))
1202                         return UNIT(other);
1203
1204         LIST_FOREACH_BEFORE(same_devnode, other, s) {
1205                 if (streq_ptr(other->what, other->devnode))
1206                         return UNIT(other);
1207
1208                 first = other;
1209         }
1210
1211         return UNIT(first);
1212 }
1213
1214 static int swap_following_set(Unit *u, Set **_set) {
1215         Swap *s = SWAP(u), *other;
1216         Set *set;
1217         int r;
1218
1219         assert(s);
1220         assert(_set);
1221
1222         if (LIST_JUST_US(same_devnode, s)) {
1223                 *_set = NULL;
1224                 return 0;
1225         }
1226
1227         set = set_new(NULL, NULL);
1228         if (!set)
1229                 return -ENOMEM;
1230
1231         LIST_FOREACH_AFTER(same_devnode, other, s) {
1232                 r = set_put(set, other);
1233                 if (r < 0)
1234                         goto fail;
1235         }
1236
1237         LIST_FOREACH_BEFORE(same_devnode, other, s) {
1238                 r = set_put(set, other);
1239                 if (r < 0)
1240                         goto fail;
1241         }
1242
1243         *_set = set;
1244         return 1;
1245
1246 fail:
1247         set_free(set);
1248         return r;
1249 }
1250
1251 static void swap_shutdown(Manager *m) {
1252         assert(m);
1253
1254         m->swap_event_source = sd_event_source_unref(m->swap_event_source);
1255
1256         if (m->proc_swaps) {
1257                 fclose(m->proc_swaps);
1258                 m->proc_swaps = NULL;
1259         }
1260
1261         hashmap_free(m->swaps_by_devnode);
1262         m->swaps_by_devnode = NULL;
1263 }
1264
1265 static int swap_enumerate(Manager *m) {
1266         int r;
1267
1268         assert(m);
1269
1270         if (!m->proc_swaps) {
1271                 m->proc_swaps = fopen("/proc/swaps", "re");
1272                 if (!m->proc_swaps)
1273                         return errno == ENOENT ? 0 : -errno;
1274
1275                 r = sd_event_add_io(m->event, &m->swap_event_source, fileno(m->proc_swaps), EPOLLPRI, swap_dispatch_io, m);
1276                 if (r < 0)
1277                         goto fail;
1278
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);
1283                 if (r < 0)
1284                         goto fail;
1285         }
1286
1287         r = swap_load_proc_swaps(m, false);
1288         if (r < 0)
1289                 goto fail;
1290
1291         return 0;
1292
1293 fail:
1294         swap_shutdown(m);
1295         return r;
1296 }
1297
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;
1301         const char *dn;
1302         Swap *s;
1303         int r = 0;
1304
1305         assert(m);
1306         assert(dev);
1307
1308         dn = udev_device_get_devnode(dev);
1309         if (!dn)
1310                 return 0;
1311
1312         e = unit_name_from_path(dn, ".swap");
1313         if (!e)
1314                 return -ENOMEM;
1315
1316         s = hashmap_get(m->units, e);
1317         if (s)
1318                 r = swap_set_devnode(s, dn);
1319
1320         first = udev_device_get_devlinks_list_entry(dev);
1321         udev_list_entry_foreach(item, first) {
1322                 _cleanup_free_ char *n = NULL;
1323
1324                 n = unit_name_from_path(udev_list_entry_get_name(item), ".swap");
1325                 if (!n)
1326                         return -ENOMEM;
1327
1328                 s = hashmap_get(m->units, n);
1329                 if (s) {
1330                         int q;
1331
1332                         q = swap_set_devnode(s, dn);
1333                         if (q < 0)
1334                                 r = q;
1335                 }
1336         }
1337
1338         return r;
1339 }
1340
1341 int swap_process_removed_device(Manager *m, struct udev_device *dev) {
1342         const char *dn;
1343         int r = 0;
1344         Swap *s;
1345
1346         dn = udev_device_get_devnode(dev);
1347         if (!dn)
1348                 return 0;
1349
1350         while ((s = hashmap_get(m->swaps_by_devnode, dn))) {
1351                 int q;
1352
1353                 q = swap_set_devnode(s, NULL);
1354                 if (q < 0)
1355                         r = q;
1356         }
1357
1358         return r;
1359 }
1360
1361 static void swap_reset_failed(Unit *u) {
1362         Swap *s = SWAP(u);
1363
1364         assert(s);
1365
1366         if (s->state == SWAP_FAILED)
1367                 swap_set_state(s, SWAP_DEAD);
1368
1369         s->result = SWAP_SUCCESS;
1370 }
1371
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);
1374 }
1375
1376 static int swap_get_timeout(Unit *u, uint64_t *timeout) {
1377         Swap *s = SWAP(u);
1378         int r;
1379
1380         if (!s->timer_event_source)
1381                 return 0;
1382
1383         r = sd_event_source_get_time(s->timer_event_source, timeout);
1384         if (r < 0)
1385                 return r;
1386
1387         return 1;
1388 }
1389
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"
1401 };
1402
1403 DEFINE_STRING_TABLE_LOOKUP(swap_state, SwapState);
1404
1405 static const char* const swap_exec_command_table[_SWAP_EXEC_COMMAND_MAX] = {
1406         [SWAP_EXEC_ACTIVATE] = "ExecActivate",
1407         [SWAP_EXEC_DEACTIVATE] = "ExecDeactivate",
1408 };
1409
1410 DEFINE_STRING_TABLE_LOOKUP(swap_exec_command, SwapExecCommand);
1411
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"
1419 };
1420
1421 DEFINE_STRING_TABLE_LOOKUP(swap_result, SwapResult);
1422
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),
1429
1430         .sections =
1431                 "Unit\0"
1432                 "Swap\0"
1433                 "Install\0",
1434         .private_section = "Swap",
1435
1436         .no_alias = true,
1437         .no_instances = true,
1438
1439         .init = swap_init,
1440         .load = swap_load,
1441         .done = swap_done,
1442
1443         .coldplug = swap_coldplug,
1444
1445         .dump = swap_dump,
1446
1447         .start = swap_start,
1448         .stop = swap_stop,
1449
1450         .kill = swap_kill,
1451
1452         .get_timeout = swap_get_timeout,
1453
1454         .serialize = swap_serialize,
1455         .deserialize_item = swap_deserialize_item,
1456
1457         .active_state = swap_active_state,
1458         .sub_state_to_string = swap_sub_state_to_string,
1459
1460         .check_gc = swap_check_gc,
1461
1462         .sigchld_event = swap_sigchld_event,
1463
1464         .reset_failed = swap_reset_failed,
1465
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,
1470
1471         .following = swap_following,
1472         .following_set = swap_following_set,
1473
1474         .enumerate = swap_enumerate,
1475         .shutdown = swap_shutdown,
1476
1477         .status_message_formats = {
1478                 .starting_stopping = {
1479                         [0] = "Activating swap %s...",
1480                         [1] = "Deactivating swap %s...",
1481                 },
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.",
1487                 },
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.",
1492                 },
1493         },
1494 };