chiark / gitweb /
unit: make unit casts typesafe
[elogind.git] / src / cgroup.c
index 301fc949dada5c8fa590ee90723cc7b7716ba9a3..291db4e6c9cf5682ddaf0bc81d2eba278346705a 100644 (file)
@@ -70,12 +70,7 @@ int cgroup_bonding_realize(CGroupBonding *b) {
                 goto fail;
         }
 
-        if (b->inherit)
-                r = cgroup_create_cgroup_from_parent(b->cgroup, true);
-        else
-                r = cgroup_create_cgroup(b->cgroup, true);
-
-        if (r != 0) {
+        if ((r = cgroup_create_cgroup(b->cgroup, true)) != 0) {
                 r = translate_error(r, errno);
                 goto fail;
         }
@@ -194,7 +189,10 @@ int cgroup_bonding_kill(CGroupBonding *b, int sig) {
                                 r = 0;
                                 goto kill_done;
                         } else {
-                                r = translate_error(r, errno);
+                                if (r == ECGOTHER && errno == ENOENT)
+                                        r = ESRCH;
+                                else
+                                        r = translate_error(r, errno);
                                 break;
                         }
                 }
@@ -409,7 +407,7 @@ finish:
 }
 
 int manager_setup_cgroup(Manager *m) {
-        char *mp, *cp;
+        char *cp;
         int r;
         pid_t pid;
         char suffix[32];
@@ -422,18 +420,18 @@ int manager_setup_cgroup(Manager *m) {
         }
 
         free(m->cgroup_controller);
-        if (!(m->cgroup_controller = strdup("debug")))
+        if (!(m->cgroup_controller = strdup("name=systemd")))
                 return -ENOMEM;
 
-        if ((r = cgroup_get_subsys_mount_point(m->cgroup_controller, &mp)))
+        free(m->cgroup_mount_point);
+        m->cgroup_mount_point = NULL;
+        if ((r = cgroup_get_subsys_mount_point(m->cgroup_controller, &m->cgroup_mount_point)))
                 return translate_error(r, errno);
 
         pid = getpid();
 
-        if ((r = cgroup_get_current_controller_path(pid, m->cgroup_controller, &cp))) {
-                free(mp);
+        if ((r = cgroup_get_current_controller_path(pid, m->cgroup_controller, &cp)))
                 return translate_error(r, errno);
-        }
 
         snprintf(suffix, sizeof(suffix), "/systemd-%u", (unsigned) pid);
         char_array_0(suffix);
@@ -450,24 +448,20 @@ int manager_setup_cgroup(Manager *m) {
                 r = asprintf(&m->cgroup_hierarchy, "%s%s", streq(cp, "/") ? "" : cp, suffix);
                 free(cp);
 
-                if (r < 0) {
-                        free(mp);
+                if (r < 0)
                         return -ENOMEM;
-                }
         }
 
         log_debug("Using cgroup controller <%s>, hierarchy mounted at <%s>, using root group <%s>.",
                   m->cgroup_controller,
-                  mp,
+                  m->cgroup_mount_point,
                   m->cgroup_hierarchy);
 
-        if ((r = install_release_agent(m, mp)) < 0)
+        if ((r = install_release_agent(m, m->cgroup_mount_point)) < 0)
                 log_warning("Failed to install release agent, ignoring: %s", strerror(-r));
         else
                 log_debug("Installed release agent, or already installed.");
 
-        free(mp);
-
         if ((r = create_hierarchy_cgroup(m)) < 0)
                 log_error("Failed to create root cgroup hierarchy: %s", strerror(-r));
         else
@@ -537,6 +531,37 @@ int cgroup_notify_empty(Manager *m, const char *group) {
         return 0;
 }
 
+Unit* cgroup_unit_by_pid(Manager *m, pid_t pid) {
+        CGroupBonding *l, *b;
+        char *group = NULL;
+        int r;
+
+        assert(m);
+
+        if (pid <= 1)
+                return NULL;
+
+        if ((r = cgroup_get_current_controller_path(pid, m->cgroup_controller, &group)))
+                return NULL;
+
+        l = hashmap_get(m->cgroup_bondings, group);
+        free(group);
+
+        if (!l)
+                return NULL;
+
+        LIST_FOREACH(by_path, b, l) {
+
+                if (!b->unit)
+                        continue;
+
+                if (b->only_us)
+                        return b->unit;
+        }
+
+        return NULL;
+}
+
 CGroupBonding *cgroup_bonding_find_list(CGroupBonding *first, const char *controller) {
         CGroupBonding *b;