From: Mike Yuan Date: Sun, 16 Mar 2025 20:09:07 +0000 (+0100) Subject: core: remove cgroups-agent X-Git-Tag: v258-rc1~906^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=be1d96dbc38bd1a08c4d40ac9a919a737563880c;p=thirdparty%2Fsystemd.git core: remove cgroups-agent --- diff --git a/meson.build b/meson.build index f25ad1a27ef..8ae5cfff44d 100644 --- a/meson.build +++ b/meson.build @@ -271,7 +271,6 @@ conf.set_quoted('SYSTEMCTL_BINARY_PATH', bindir / 'systemct conf.set_quoted('SYSTEMD_BINARY_PATH', libexecdir / 'systemd') conf.set_quoted('SYSTEMD_EXECUTOR_BINARY_PATH', libexecdir / 'systemd-executor') conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir) -conf.set_quoted('SYSTEMD_CGROUPS_AGENT_PATH', libexecdir / 'systemd-cgroups-agent') conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', bindir / 'systemd-cryptsetup') conf.set_quoted('SYSTEMD_EXPORT_PATH', libexecdir / 'systemd-export') conf.set_quoted('SYSTEMD_FSCK_PATH', libexecdir / 'systemd-fsck') @@ -2304,7 +2303,6 @@ subdir('src/boot') subdir('src/bootctl') subdir('src/busctl') subdir('src/cgls') -subdir('src/cgroups-agent') subdir('src/cgtop') subdir('src/coredump') subdir('src/creds') diff --git a/mkosi/mkosi.images/build/mkosi.conf.d/opensuse/mkosi.build.chroot b/mkosi/mkosi.images/build/mkosi.conf.d/opensuse/mkosi.build.chroot index 44ef675168c..bef5a0de29d 100755 --- a/mkosi/mkosi.images/build/mkosi.conf.d/opensuse/mkosi.build.chroot +++ b/mkosi/mkosi.images/build/mkosi.conf.d/opensuse/mkosi.build.chroot @@ -18,8 +18,10 @@ TS="${SOURCE_DATE_EPOCH:-$(date +%s)}" # The openSUSE filelists hardcode the manpage compression extension. This causes rpmbuild errors since we # disable manpage compression as the files cannot be found. Fix the issue by removing the compression # extension. +# +# TODO: remove manual cgroups-agent patch when the upstream spec is updated while read -r filelist; do - sed 's/\.gz$//' "$filelist" >"/tmp/$(basename "$filelist")" + sed 's/\.gz$//; /systemd-cgroups-agent/d' "$filelist" >"/tmp/$(basename "$filelist")" mount --bind "/tmp/$(basename "$filelist")" "$filelist" done < <(find "pkg/$PKG_SUBDIR${GIT_SUBDIR:+/$GIT_SUBDIR}" -name "files.*") diff --git a/src/cgroups-agent/cgroups-agent.c b/src/cgroups-agent/cgroups-agent.c deleted file mode 100644 index 16c5a2a6934..00000000000 --- a/src/cgroups-agent/cgroups-agent.c +++ /dev/null @@ -1,54 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -#include - -#include "fd-util.h" -#include "log.h" -#include "socket-util.h" - -int main(int argc, char *argv[]) { - - static const union sockaddr_union sa = { - .un.sun_family = AF_UNIX, - .un.sun_path = "/run/systemd/cgroups-agent", - }; - - _cleanup_close_ int fd = -EBADF; - ssize_t n; - size_t l; - int r; - - r = make_null_stdio(); - if (r < 0) { - log_error_errno(r, "Failed to connect stdin/stdout/stderr with /dev/null: %m"); - return EXIT_FAILURE; - } - - if (argc != 2) { - log_error("Incorrect number of arguments."); - return EXIT_FAILURE; - } - - log_setup(); - - fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0); - if (fd < 0) { - log_debug_errno(errno, "Failed to allocate socket: %m"); - return EXIT_FAILURE; - } - - l = strlen(argv[1]); - - n = sendto(fd, argv[1], l, 0, &sa.sa, SOCKADDR_UN_LEN(sa.un)); - if (n < 0) { - log_debug_errno(errno, "Failed to send cgroups agent message: %m"); - return EXIT_FAILURE; - } - - if ((size_t) n != l) { - log_debug("Datagram size mismatch"); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} diff --git a/src/cgroups-agent/meson.build b/src/cgroups-agent/meson.build deleted file mode 100644 index 33ff1f55fd2..00000000000 --- a/src/cgroups-agent/meson.build +++ /dev/null @@ -1,8 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later - -executables += [ - libexec_template + { - 'name' : 'systemd-cgroups-agent', - 'sources' : files('cgroups-agent.c'), - }, -] diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 4c2fc755b9b..4791a2aa606 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -4332,44 +4332,26 @@ int manager_setup_cgroup(Manager *m) { (void) sd_event_source_set_description(m->cgroup_empty_event_source, "cgroup-empty"); - /* 4. Install notifier inotify object, or agent */ - if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) > 0) { - - /* In the unified hierarchy we can get cgroup empty notifications via inotify. */ - - m->cgroup_inotify_event_source = sd_event_source_disable_unref(m->cgroup_inotify_event_source); - safe_close(m->cgroup_inotify_fd); - - m->cgroup_inotify_fd = inotify_init1(IN_NONBLOCK|IN_CLOEXEC); - if (m->cgroup_inotify_fd < 0) - return log_error_errno(errno, "Failed to create control group inotify object: %m"); - - r = sd_event_add_io(m->event, &m->cgroup_inotify_event_source, m->cgroup_inotify_fd, EPOLLIN, on_cgroup_inotify_event, m); - if (r < 0) - return log_error_errno(r, "Failed to watch control group inotify object: %m"); - - /* Process cgroup empty notifications early. Note that when this event is dispatched it'll - * just add the unit to a cgroup empty queue, hence let's run earlier than that. Also see - * handling of cgroup agent notifications, for the classic cgroup hierarchy support. */ - r = sd_event_source_set_priority(m->cgroup_inotify_event_source, EVENT_PRIORITY_CGROUP_INOTIFY); - if (r < 0) - return log_error_errno(r, "Failed to set priority of inotify event source: %m"); + /* 4. Install cgroup empty event notifier inotify object */ + m->cgroup_inotify_event_source = sd_event_source_disable_unref(m->cgroup_inotify_event_source); + safe_close(m->cgroup_inotify_fd); - (void) sd_event_source_set_description(m->cgroup_inotify_event_source, "cgroup-inotify"); + m->cgroup_inotify_fd = inotify_init1(IN_NONBLOCK|IN_CLOEXEC); + if (m->cgroup_inotify_fd < 0) + return log_error_errno(errno, "Failed to create control group inotify object: %m"); - } else if (MANAGER_IS_SYSTEM(m) && manager_owns_host_root_cgroup(m) && !MANAGER_IS_TEST_RUN(m)) { + r = sd_event_add_io(m->event, &m->cgroup_inotify_event_source, m->cgroup_inotify_fd, EPOLLIN, on_cgroup_inotify_event, m); + if (r < 0) + return log_error_errno(r, "Failed to watch control group inotify object: %m"); - /* On the legacy hierarchy we only get notifications via cgroup agents. (Which isn't really reliable, - * since it does not generate events when control groups with children run empty. */ + /* Process cgroup empty notifications early. Note that when this event is dispatched it'll + * just add the unit to a cgroup empty queue, hence let's run earlier than that. Also see + * handling of cgroup agent notifications, for the classic cgroup hierarchy support. */ + r = sd_event_source_set_priority(m->cgroup_inotify_event_source, EVENT_PRIORITY_CGROUP_INOTIFY); + if (r < 0) + return log_error_errno(r, "Failed to set priority of inotify event source: %m"); - r = cg_install_release_agent(SYSTEMD_CGROUP_CONTROLLER, SYSTEMD_CGROUPS_AGENT_PATH); - if (r < 0) - log_warning_errno(r, "Failed to install release agent, ignoring: %m"); - else if (r > 0) - log_debug("Installed release agent."); - else if (r == 0) - log_debug("Release agent already installed."); - } + (void) sd_event_source_set_description(m->cgroup_inotify_event_source, "cgroup-inotify"); /* 5. Make sure we are in the special "init.scope" unit in the root slice. */ scope_path = strjoina(m->cgroup_root, "/" SPECIAL_INIT_SCOPE); diff --git a/src/core/dbus.c b/src/core/dbus.c index 240b74ec410..faec7eb33c5 100644 --- a/src/core/dbus.c +++ b/src/core/dbus.c @@ -69,61 +69,6 @@ void bus_send_pending_reload_message(Manager *m) { return; } -int bus_forward_agent_released(Manager *m, const char *path) { - int r; - - assert(m); - assert(path); - - if (!MANAGER_IS_SYSTEM(m)) - return 0; - - if (!m->system_bus) - return 0; - - /* If we are running a system instance we forward the agent message on the system bus, so that the user - * instances get notified about this, too */ - - r = sd_bus_emit_signal(m->system_bus, - "/org/freedesktop/systemd1/agent", - "org.freedesktop.systemd1.Agent", - "Released", - "s", path); - if (r < 0) - return log_debug_errno(r, "Failed to propagate agent release message: %m"); - - return 1; -} - -static int signal_agent_released(sd_bus_message *message, void *userdata, sd_bus_error *error) { - _cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL; - Manager *m = ASSERT_PTR(userdata); - const char *cgroup; - uid_t sender_uid; - int r; - - assert(message); - - /* only accept org.freedesktop.systemd1.Agent from UID=0 */ - r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_EUID, &creds); - if (r < 0) - return r; - - r = sd_bus_creds_get_euid(creds, &sender_uid); - if (r < 0 || sender_uid != 0) - return 0; - - /* parse 'cgroup-empty' notification */ - r = sd_bus_message_read(message, "s", &cgroup); - if (r < 0) { - bus_log_parse_error(r); - return 0; - } - - manager_notify_cgroup_empty(m, cgroup); - return 0; -} - static int signal_disconnected(sd_bus_message *message, void *userdata, sd_bus_error *error) { Manager *m = ASSERT_PTR(userdata); sd_bus *bus; @@ -890,30 +835,6 @@ int bus_init_api(Manager *m) { return 0; } -static void bus_setup_system(Manager *m, sd_bus *bus) { - int r; - - assert(m); - assert(bus); - - /* if we are a user instance we get the Released message via the system bus */ - if (MANAGER_IS_USER(m)) { - r = sd_bus_match_signal_async( - bus, - NULL, - NULL, - "/org/freedesktop/systemd1/agent", - "org.freedesktop.systemd1.Agent", - "Released", - signal_agent_released, NULL, m); - if (r < 0) - log_warning_errno(r, "Failed to request Released match on system bus: %m"); - } - - log_debug("Successfully connected to system bus."); - return; -} - int bus_init_system(Manager *m) { _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL; int r; @@ -938,10 +859,10 @@ int bus_init_system(Manager *m) { return r; } - bus_setup_system(m, bus); - m->system_bus = TAKE_PTR(bus); + log_debug("Successfully connected to system bus."); + return 0; } diff --git a/src/core/dbus.h b/src/core/dbus.h index 0f81102fc13..bfd4c8ea4e5 100644 --- a/src/core/dbus.h +++ b/src/core/dbus.h @@ -22,8 +22,6 @@ void bus_track_serialize(sd_bus_track *t, FILE *f, const char *prefix); int bus_foreach_bus(Manager *m, sd_bus_track *subscribed2, int (*send_message)(sd_bus *bus, void *userdata), void *userdata); -int bus_forward_agent_released(Manager *m, const char *path); - uint64_t manager_bus_n_queued_write(Manager *m); void dump_bus_properties(FILE *f); diff --git a/src/core/main.c b/src/core/main.c index 0b5efe98b0d..3e7894ee5e5 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -1723,11 +1723,6 @@ static int become_shutdown(int objective, int retval) { if (arg_watchdog_device) (void) strv_extendf(&env_block, "WATCHDOG_DEVICE=%s", arg_watchdog_device); - /* Avoid the creation of new processes forked by the kernel; at this - * point, we will not listen to the signals anyway */ - if (detect_container() <= 0) - (void) cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER); - (void) write_boot_or_shutdown_osc("shutdown"); execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block); diff --git a/src/core/manager-serialize.c b/src/core/manager-serialize.c index 05021654fae..c5cb82e8d54 100644 --- a/src/core/manager-serialize.c +++ b/src/core/manager-serialize.c @@ -137,12 +137,6 @@ int manager_serialize( (void) serialize_item(f, "notify-socket", m->notify_socket); } - if (m->cgroups_agent_fd >= 0) { - r = serialize_fd(f, fds, "cgroups-agent-fd", m->cgroups_agent_fd); - if (r < 0) - return r; - } - if (m->user_lookup_fds[0] >= 0) { r = serialize_fd_many(f, fds, "user-lookup", m->user_lookup_fds, 2); if (r < 0) @@ -453,15 +447,6 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { if (r < 0) return r; - } else if ((val = startswith(l, "cgroups-agent-fd="))) { - int fd; - - fd = deserialize_fd(fds, val); - if (fd >= 0) { - m->cgroups_agent_event_source = sd_event_source_disable_unref(m->cgroups_agent_event_source); - close_and_replace(m->cgroups_agent_fd, fd); - } - } else if ((val = startswith(l, "user-lookup="))) { m->user_lookup_event_source = sd_event_source_disable_unref(m->user_lookup_event_source); @@ -550,7 +535,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { if (q < _MANAGER_TIMESTAMP_MAX) /* found it */ (void) deserialize_dual_timestamp(val, m->timestamps + q); - else if (!STARTSWITH_SET(l, "kdbus-fd=", "honor-device-enumeration=", "ready-sent=")) /* ignore deprecated values */ + else if (!STARTSWITH_SET(l, "kdbus-fd=", "honor-device-enumeration=", "ready-sent=", "cgroups-agent-fd=")) /* ignore deprecated values */ log_notice("Unknown serialization item '%s', ignoring.", l); } } diff --git a/src/core/manager.c b/src/core/manager.c index 06d6f51a13b..f22bd415463 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -122,7 +122,6 @@ #define DEFAULT_TASKS_MAX ((CGroupTasksMax) { 15U, 100U }) /* 15% */ static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata); -static int manager_dispatch_cgroups_agent_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata); static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata); static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata); static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata); @@ -912,7 +911,6 @@ int manager_new(RuntimeScope runtime_scope, ManagerTestRunFlags test_run_flags, .show_status_overridden = _SHOW_STATUS_INVALID, .notify_fd = -EBADF, - .cgroups_agent_fd = -EBADF, .signal_fd = -EBADF, .user_lookup_fds = EBADF_PAIR, .handoff_timestamp_fds = EBADF_PAIR, @@ -1136,80 +1134,6 @@ static int manager_setup_notify(Manager *m) { return 0; } -static int manager_setup_cgroups_agent(Manager *m) { - - static const union sockaddr_union sa = { - .un.sun_family = AF_UNIX, - .un.sun_path = "/run/systemd/cgroups-agent", - }; - int r; - - /* This creates a listening socket we receive cgroups agent messages on. We do not use D-Bus for delivering - * these messages from the cgroups agent binary to PID 1, as the cgroups agent binary is very short-living, and - * each instance of it needs a new D-Bus connection. Since D-Bus connections are SOCK_STREAM/AF_UNIX, on - * overloaded systems the backlog of the D-Bus socket becomes relevant, as not more than the configured number - * of D-Bus connections may be queued until the kernel will start dropping further incoming connections, - * possibly resulting in lost cgroups agent messages. To avoid this, we'll use a private SOCK_DGRAM/AF_UNIX - * socket, where no backlog is relevant as communication may take place without an actual connect() cycle, and - * we thus won't lose messages. - * - * Note that PID 1 will forward the agent message to system bus, so that the user systemd instance may listen - * to it. The system instance hence listens on this special socket, but the user instances listen on the system - * bus for these messages. */ - - if (MANAGER_IS_TEST_RUN(m)) - return 0; - - if (!MANAGER_IS_SYSTEM(m)) - return 0; - - r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER); - if (r < 0) - return log_error_errno(r, "Failed to determine whether unified cgroups hierarchy is used: %m"); - if (r > 0) /* We don't need this anymore on the unified hierarchy */ - return 0; - - if (m->cgroups_agent_fd < 0) { - _cleanup_close_ int fd = -EBADF; - - /* First free all secondary fields */ - m->cgroups_agent_event_source = sd_event_source_disable_unref(m->cgroups_agent_event_source); - - fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); - if (fd < 0) - return log_error_errno(errno, "Failed to allocate cgroups agent socket: %m"); - - (void) fd_increase_rxbuf(fd, MANAGER_SOCKET_RCVBUF_SIZE); - - (void) sockaddr_un_unlink(&sa.un); - - /* Only allow root to connect to this socket */ - WITH_UMASK(0077) - r = bind(fd, &sa.sa, SOCKADDR_UN_LEN(sa.un)); - if (r < 0) - return log_error_errno(errno, "bind(%s) failed: %m", sa.un.sun_path); - - m->cgroups_agent_fd = TAKE_FD(fd); - } - - if (!m->cgroups_agent_event_source) { - r = sd_event_add_io(m->event, &m->cgroups_agent_event_source, m->cgroups_agent_fd, EPOLLIN, manager_dispatch_cgroups_agent_fd, m); - if (r < 0) - return log_error_errno(r, "Failed to allocate cgroups agent event source: %m"); - - /* Process cgroups notifications early. Note that when the agent notification is received - * we'll just enqueue the unit in the cgroup empty queue, hence pick a high priority than - * that. Also see handling of cgroup inotify for the unified cgroup stuff. */ - r = sd_event_source_set_priority(m->cgroups_agent_event_source, EVENT_PRIORITY_CGROUP_AGENT); - if (r < 0) - return log_error_errno(r, "Failed to set priority of cgroups agent event source: %m"); - - (void) sd_event_source_set_description(m->cgroups_agent_event_source, "manager-cgroups-agent"); - } - - return 0; -} - static int manager_setup_user_lookup_fd(Manager *m) { int r; @@ -1763,7 +1687,6 @@ Manager* manager_free(Manager *m) { sd_event_source_unref(m->signal_event_source); sd_event_source_unref(m->sigchld_event_source); sd_event_source_unref(m->notify_event_source); - sd_event_source_unref(m->cgroups_agent_event_source); sd_event_source_unref(m->time_change_event_source); sd_event_source_unref(m->timezone_change_event_source); sd_event_source_unref(m->jobs_in_progress_event_source); @@ -1775,7 +1698,6 @@ Manager* manager_free(Manager *m) { safe_close(m->signal_fd); safe_close(m->notify_fd); - safe_close(m->cgroups_agent_fd); safe_close_pair(m->user_lookup_fds); safe_close_pair(m->handoff_timestamp_fds); safe_close_pair(m->pidref_transport_fds); @@ -2137,11 +2059,6 @@ int manager_startup(Manager *m, FILE *serialization, FDSet *fds, const char *roo /* No sense to continue without notifications, our children would fail anyway. */ return r; - r = manager_setup_cgroups_agent(m); - if (r < 0) - /* Likewise, no sense to continue without empty cgroup notifications. */ - return r; - r = manager_setup_user_lookup_fd(m); if (r < 0) /* This shouldn't fail, except if things are really broken. */ @@ -2681,35 +2598,6 @@ static unsigned manager_dispatch_dbus_queue(Manager *m) { return n; } -static int manager_dispatch_cgroups_agent_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) { - Manager *m = userdata; - char buf[PATH_MAX]; - ssize_t n; - - n = recv(fd, buf, sizeof(buf), 0); - if (n < 0) - return log_error_errno(errno, "Failed to read cgroups agent message: %m"); - if (n == 0) { - log_error("Got zero-length cgroups agent message, ignoring."); - return 0; - } - if ((size_t) n >= sizeof(buf)) { - log_error("Got overly long cgroups agent message, ignoring."); - return 0; - } - - if (memchr(buf, 0, n)) { - log_error("Got cgroups agent message with embedded NUL byte, ignoring."); - return 0; - } - buf[n] = 0; - - manager_notify_cgroup_empty(m, buf); - (void) bus_forward_agent_released(m, buf); - - return 0; -} - static bool manager_process_barrier_fd(char * const *tags, FDSet *fds) { /* nothing else must be sent when using BARRIER=1 */ @@ -3713,7 +3601,6 @@ int manager_reload(Manager *m) { /* Re-register notify_fd as event source, and set up other sockets/communication channels we might need */ (void) manager_setup_notify(m); - (void) manager_setup_cgroups_agent(m); (void) manager_setup_user_lookup_fd(m); (void) manager_setup_handoff_timestamp_fd(m); (void) manager_setup_pidref_transport_fd(m); diff --git a/src/core/manager.h b/src/core/manager.h index 66ad04baf54..544089bcfc4 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -269,9 +269,6 @@ struct Manager { int notify_fd; sd_event_source *notify_event_source; - int cgroups_agent_fd; - sd_event_source *cgroups_agent_event_source; - int signal_fd; sd_event_source *signal_event_source; @@ -684,8 +681,7 @@ enum { EVENT_PRIORITY_USER_LOOKUP = SD_EVENT_PRIORITY_NORMAL-12, EVENT_PRIORITY_MOUNT_TABLE = SD_EVENT_PRIORITY_NORMAL-11, EVENT_PRIORITY_SWAP_TABLE = SD_EVENT_PRIORITY_NORMAL-11, - EVENT_PRIORITY_CGROUP_AGENT = SD_EVENT_PRIORITY_NORMAL-10, /* cgroupv1 */ - EVENT_PRIORITY_CGROUP_INOTIFY = SD_EVENT_PRIORITY_NORMAL-10, /* cgroupv2 */ + EVENT_PRIORITY_CGROUP_INOTIFY = SD_EVENT_PRIORITY_NORMAL-10, EVENT_PRIORITY_CGROUP_OOM = SD_EVENT_PRIORITY_NORMAL-9, EVENT_PRIORITY_PIDREF = SD_EVENT_PRIORITY_NORMAL-8, EVENT_PRIORITY_HANDOFF_TIMESTAMP = SD_EVENT_PRIORITY_NORMAL-7, diff --git a/src/shared/cgroup-setup.c b/src/shared/cgroup-setup.c index 76658df41af..269824dfc22 100644 --- a/src/shared/cgroup-setup.c +++ b/src/shared/cgroup-setup.c @@ -868,91 +868,6 @@ int cg_trim_v1_controllers(CGroupMask supported, CGroupMask mask, const char *pa return r; } -int cg_install_release_agent(const char *controller, const char *agent) { - _cleanup_free_ char *fs = NULL, *contents = NULL; - const char *sc; - int r; - - assert(agent); - - r = cg_unified_controller(controller); - if (r < 0) - return r; - if (r > 0) /* doesn't apply to unified hierarchy */ - return -EOPNOTSUPP; - - r = cg_get_path(controller, NULL, "release_agent", &fs); - if (r < 0) - return r; - - r = read_one_line_file(fs, &contents); - if (r < 0) - return r; - - sc = strstrip(contents); - if (isempty(sc)) { - r = write_string_file(fs, agent, WRITE_STRING_FILE_DISABLE_BUFFER); - if (r < 0) - return r; - } else if (!path_equal(sc, agent)) - return -EEXIST; - - fs = mfree(fs); - r = cg_get_path(controller, NULL, "notify_on_release", &fs); - if (r < 0) - return r; - - contents = mfree(contents); - r = read_one_line_file(fs, &contents); - if (r < 0) - return r; - - sc = strstrip(contents); - if (streq(sc, "0")) { - r = write_string_file(fs, "1", WRITE_STRING_FILE_DISABLE_BUFFER); - if (r < 0) - return r; - - return 1; - } - - if (!streq(sc, "1")) - return -EIO; - - return 0; -} - -int cg_uninstall_release_agent(const char *controller) { - _cleanup_free_ char *fs = NULL; - int r; - - r = cg_unified_controller(controller); - if (r < 0) - return r; - if (r > 0) /* Doesn't apply to unified hierarchy */ - return -EOPNOTSUPP; - - r = cg_get_path(controller, NULL, "notify_on_release", &fs); - if (r < 0) - return r; - - r = write_string_file(fs, "0", WRITE_STRING_FILE_DISABLE_BUFFER); - if (r < 0) - return r; - - fs = mfree(fs); - - r = cg_get_path(controller, NULL, "release_agent", &fs); - if (r < 0) - return r; - - r = write_string_file(fs, "", WRITE_STRING_FILE_DISABLE_BUFFER); - if (r < 0) - return r; - - return 0; -} - int cg_has_legacy(void) { struct statfs fs; diff --git a/src/shared/cgroup-setup.h b/src/shared/cgroup-setup.h index 7f0a8c73bb2..b20de46894c 100644 --- a/src/shared/cgroup-setup.h +++ b/src/shared/cgroup-setup.h @@ -38,7 +38,4 @@ int cg_migrate_recursive_fallback(const char *cfrom, const char *pfrom, const ch int cg_migrate_v1_controllers(CGroupMask supported, CGroupMask mask, const char *from, cg_migrate_callback_t to_callback, void *userdata); int cg_trim_v1_controllers(CGroupMask supported, CGroupMask mask, const char *path, bool delete_root); -int cg_install_release_agent(const char *controller, const char *agent); -int cg_uninstall_release_agent(const char *controller); - int cg_has_legacy(void);