X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fswap.c;h=afc0c5faab55a6d6fd42d4374f2d378a8c2ec784;hb=39c2a6f19301c0042142149fdaa34a5f8cf71c0e;hp=035efbaf4b1a941d5cc68adefbd5b3e732a08bc3;hpb=f6a6225e414858ff222d2b175369cc42459abf9a;p=elogind.git diff --git a/src/swap.c b/src/swap.c index 035efbaf4..afc0c5faa 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); @@ -1277,19 +1278,20 @@ static int swap_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError * if (who == KILL_MAIN) { dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "Swap units have no main processes"); - return -EINVAL; + return -ESRCH; } if (s->control_pid <= 0 && who == KILL_CONTROL) { dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill"); - return -ENOENT; + return -ESRCH; } - 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; } @@ -1337,10 +1339,13 @@ DEFINE_STRING_TABLE_LOOKUP(swap_exec_command, SwapExecCommand); const UnitVTable swap_vtable = { .suffix = ".swap", + .sections = + "Unit\0" + "Swap\0" + "Install\0", .no_alias = true, .no_instances = true, - .no_isolate = true, .show_status = true, .init = swap_init,