X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fswap.c;h=d503fe20df756448f2b19fc302f705d8aac58b7d;hp=61ce8316c251069a8ebb9ba16858612879174b2a;hb=44a6b1b68029833893f6e9cee35aa27a974038f6;hpb=cd2086fe6573df923dc53ef33998c9fff8c2bda5 diff --git a/src/core/swap.c b/src/core/swap.c index 61ce8316c..d503fe20d 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -125,7 +125,7 @@ static void swap_done(Unit *u) { free(s->parameters_fragment.what); s->parameters_fragment.what = NULL; - exec_context_done(&s->exec_context); + exec_context_done(&s->exec_context, manager_is_reloading_or_reexecuting(u->manager)); exec_command_done_array(s->exec_command, _SWAP_EXEC_COMMAND_MAX); s->control_command = NULL; @@ -214,7 +214,7 @@ static int swap_add_default_dependencies(Swap *s) { static int swap_verify(Swap *s) { bool b; - char _cleanup_free_ *e = NULL; + _cleanup_free_ char *e = NULL; if (UNIT(s)->load_state != UNIT_LOADED) return 0; @@ -315,7 +315,7 @@ static int swap_add_one( bool set_flags) { Unit *u = NULL; - char _cleanup_free_ *e = NULL; + _cleanup_free_ char *e = NULL; char *wp = NULL; bool delete = false; int r; @@ -632,6 +632,7 @@ static void swap_enter_dead(Swap *s, SwapResult f) { if (f != SWAP_SUCCESS) s->result = f; + exec_context_tmp_dirs_done(&s->exec_context); swap_set_state(s, s->result != SWAP_SUCCESS ? SWAP_FAILED : SWAP_DEAD); } @@ -831,6 +832,8 @@ static int swap_serialize(Unit *u, FILE *f, FDSet *fds) { if (s->control_command_id >= 0) unit_serialize_item(u, f, "control-command", swap_exec_command_to_string(s->control_command_id)); + exec_context_serialize(&s->exec_context, UNIT(s), f); + return 0; } @@ -874,26 +877,41 @@ static int swap_deserialize_item(Unit *u, const char *key, const char *value, FD s->control_command_id = id; s->control_command = s->exec_command + id; } + } else if (streq(key, "tmp-dir")) { + char *t; + + t = strdup(value); + if (!t) + return log_oom(); + + s->exec_context.tmp_dir = t; + } else if (streq(key, "var-tmp-dir")) { + char *t; + t = strdup(value); + if (!t) + return log_oom(); + + s->exec_context.var_tmp_dir = t; } else log_debug_unit(u->id, "Unknown serialization key '%s'", key); return 0; } -static UnitActiveState swap_active_state(Unit *u) { +_pure_ static UnitActiveState swap_active_state(Unit *u) { assert(u); return state_translation_table[SWAP(u)->state]; } -static const char *swap_sub_state_to_string(Unit *u) { +_pure_ static const char *swap_sub_state_to_string(Unit *u) { assert(u); return swap_state_to_string(SWAP(u)->state); } -static bool swap_check_gc(Unit *u) { +_pure_ static bool swap_check_gc(Unit *u) { Swap *s = SWAP(u); assert(s); @@ -1224,10 +1242,14 @@ static void swap_shutdown(Manager *m) { static int swap_enumerate(Manager *m) { int r; - struct epoll_event ev; assert(m); if (!m->proc_swaps) { + struct epoll_event ev = { + .events = EPOLLPRI, + .data.ptr = &m->swap_watch, + }; + m->proc_swaps = fopen("/proc/swaps", "re"); if (!m->proc_swaps) return (errno == ENOENT) ? 0 : -errno; @@ -1235,10 +1257,6 @@ static int swap_enumerate(Manager *m) { m->swap_watch.type = WATCH_SWAP; m->swap_watch.fd = fileno(m->proc_swaps); - zero(ev); - ev.events = EPOLLPRI; - ev.data.ptr = &m->swap_watch; - if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->swap_watch.fd, &ev) < 0) return -errno; } @@ -1262,53 +1280,7 @@ static void swap_reset_failed(Unit *u) { } static int swap_kill(Unit *u, KillWho who, int signo, DBusError *error) { - Swap *s = SWAP(u); - int r = 0; - Set *pid_set = NULL; - - assert(s); - - if (who == KILL_MAIN) { - dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "Swap units have no main processes"); - 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 -ESRCH; - } - - if (who == KILL_CONTROL || who == KILL_ALL) - if (s->control_pid > 0) - if (kill(s->control_pid, signo) < 0) - r = -errno; - - if (who == KILL_ALL) { - int q; - - pid_set = set_new(trivial_hash_func, trivial_compare_func); - if (!pid_set) - return -ENOMEM; - - /* Exclude the control pid from being killed via the cgroup */ - if (s->control_pid > 0) { - q = set_put(pid_set, LONG_TO_PTR(s->control_pid)); - if (q < 0) { - r = q; - goto finish; - } - } - - q = cgroup_bonding_kill_list(UNIT(s)->cgroup_bondings, signo, false, false, pid_set, NULL); - if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT) - r = q; - } - -finish: - if (pid_set) - set_free(pid_set); - - return r; + return unit_kill_common(u, who, signo, -1, SWAP(u)->control_pid, error); } static const char* const swap_state_table[_SWAP_STATE_MAX] = {