X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fswap.c;h=a0b16776457e0c887964c1aa24df112236e61d76;hb=3611581ebdabbe3a1d6a9b5310a0b59792279d7d;hp=035efbaf4b1a941d5cc68adefbd5b3e732a08bc3;hpb=f6a6225e414858ff222d2b175369cc42459abf9a;p=elogind.git diff --git a/src/swap.c b/src/swap.c index 035efbaf4..a0b167764 100644 --- a/src/swap.c +++ b/src/swap.c @@ -90,6 +90,8 @@ static void swap_unset_proc_swaps(Swap *s) { s->timer_watch.type = WATCH_INVALID; s->control_command_id = _MOUNT_EXEC_COMMAND_INVALID; + + s->meta.ignore_on_isolate = true; } static void swap_unwatch_control_pid(Swap *s) { @@ -153,7 +155,7 @@ static int swap_add_mount_links(Swap *s) { assert(s); - LIST_FOREACH(units_per_type, other, s->meta.manager->units_per_type[UNIT_MOUNT]) + LIST_FOREACH(units_by_type, other, s->meta.manager->units_by_type[UNIT_MOUNT]) if ((r = swap_add_one_mount_link(s, (Mount*) other)) < 0) return r; @@ -661,9 +663,7 @@ static void swap_enter_signal(Swap *s, SwapState state, bool success) { state == SWAP_DEACTIVATING_SIGTERM) ? s->exec_context.kill_signal : SIGKILL; if (s->control_pid > 0) { - if (kill_and_sigcont(s->exec_context.kill_mode == KILL_PROCESS_GROUP ? - -s->control_pid : - s->control_pid, sig) < 0 && errno != ESRCH) + if (kill_and_sigcont(s->control_pid, sig) < 0 && errno != ESRCH) log_warning("Failed to kill control process %li: %m", (long) s->control_pid); else @@ -689,6 +689,7 @@ static void swap_enter_signal(Swap *s, SwapState state, bool success) { wait_for_exit = true; set_free(pid_set); + pid_set = NULL; } } @@ -939,7 +940,7 @@ static void swap_sigchld_event(Unit *u, pid_t pid, int code, int status) { s->failure = s->failure || !success; if (s->control_command) { - exec_status_exit(&s->control_command->exec_status, pid, code, status, s->exec_context.utmp_id); + exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status); s->control_command = NULL; s->control_command_id = _SWAP_EXEC_COMMAND_INVALID; } @@ -1099,7 +1100,7 @@ int swap_fd_event(Manager *m, int events) { log_error("Failed to reread /proc/swaps: %s", strerror(-r)); /* Reset flags, just in case, for late calls */ - LIST_FOREACH(units_per_type, meta, m->units_per_type[UNIT_SWAP]) { + LIST_FOREACH(units_by_type, meta, m->units_by_type[UNIT_SWAP]) { Swap *swap = (Swap*) meta; swap->is_active = swap->just_activated = false; @@ -1110,7 +1111,7 @@ int swap_fd_event(Manager *m, int events) { manager_dispatch_load_queue(m); - LIST_FOREACH(units_per_type, meta, m->units_per_type[UNIT_SWAP]) { + LIST_FOREACH(units_by_type, meta, m->units_by_type[UNIT_SWAP]) { Swap *swap = (Swap*) meta; if (!swap->is_active) { @@ -1236,7 +1237,7 @@ static int swap_enumerate(Manager *m) { if (!m->proc_swaps) { if (!(m->proc_swaps = fopen("/proc/swaps", "re"))) - return -errno; + return (errno == ENOENT) ? 0 : -errno; m->swap_watch.type = WATCH_SWAP; m->swap_watch.fd = fileno(m->proc_swaps); @@ -1285,11 +1286,12 @@ static int swap_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError * return -ENOENT; } - if (s->control_pid > 0) - if (kill(mode == KILL_PROCESS_GROUP ? -s->control_pid : s->control_pid, signo) < 0) - r = -errno; + if (who == KILL_CONTROL || who == KILL_ALL) + if (s->control_pid > 0) + if (kill(s->control_pid, signo) < 0) + r = -errno; - if (mode == KILL_CONTROL_GROUP) { + if (who == KILL_ALL && mode == KILL_CONTROL_GROUP) { int q; if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) @@ -1303,7 +1305,7 @@ static int swap_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError * } if ((q = cgroup_bonding_kill_list(s->meta.cgroup_bondings, signo, false, pid_set)) < 0) - if (r != -EAGAIN && r != -ESRCH && r != -ENOENT) + if (q != -EAGAIN && q != -ESRCH && q != -ENOENT) r = q; } @@ -1340,7 +1342,6 @@ const UnitVTable swap_vtable = { .no_alias = true, .no_instances = true, - .no_isolate = true, .show_status = true, .init = swap_init,