[lxc-devel] [lxc/master] cgfsng: set errno to ENOENT on get_hierarchy()

brauner on Github lxc-bot at linuxcontainers.org
Mon Sep 24 21:00:46 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180924/9a1849ae/attachment.bin>
-------------- next part --------------
From 27a5132c2221d44d293c4e8313732c6460b0e290 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 24 Sep 2018 22:58:45 +0200
Subject: [PATCH] cgfsng: set errno to ENOENT on get_hierarchy()

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/cgroups/cgfsng.c | 17 +++++++++++++----
 src/lxc/cgroups/cgroup.h |  1 +
 src/lxc/commands.c       |  2 +-
 3 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c
index 3df279377..5475f7eff 100644
--- a/src/lxc/cgroups/cgfsng.c
+++ b/src/lxc/cgroups/cgfsng.c
@@ -179,15 +179,19 @@ static void must_append_controller(char **klist, char **nlist, char ***clist,
 /* Given a handler's cgroup data, return the struct hierarchy for the controller
  * @c, or NULL if there is none.
  */
-struct hierarchy *get_hierarchy(struct cgroup_ops *ops, const char *c)
+struct hierarchy *get_hierarchy(struct cgroup_ops *ops, const char *controller)
 {
 	int i;
 
-	if (!ops->hierarchies)
+	errno = ENOENT;
+
+	if (!ops->hierarchies) {
+		TRACE("There are no useable cgroup controllers");
 		return NULL;
+	}
 
 	for (i = 0; ops->hierarchies[i]; i++) {
-		if (!c) {
+		if (!controller) {
 			/* This is the empty unified hierarchy. */
 			if (ops->hierarchies[i]->controllers &&
 			    !ops->hierarchies[i]->controllers[0])
@@ -196,10 +200,15 @@ struct hierarchy *get_hierarchy(struct cgroup_ops *ops, const char *c)
 			continue;
 		}
 
-		if (string_in_list(ops->hierarchies[i]->controllers, c))
+		if (string_in_list(ops->hierarchies[i]->controllers, controller))
 			return ops->hierarchies[i];
 	}
 
+	if (controller)
+		WARN("There is no useable %s controller", controller);
+	else
+		WARN("There is no empty unified cgroup hierarchy");
+
 	return NULL;
 }
 
diff --git a/src/lxc/cgroups/cgroup.h b/src/lxc/cgroups/cgroup.h
index 16b880942..292fa1c92 100644
--- a/src/lxc/cgroups/cgroup.h
+++ b/src/lxc/cgroups/cgroup.h
@@ -104,6 +104,7 @@ struct cgroup_ops {
 	 *   hierarchy wins.
 	 */
 	struct hierarchy **hierarchies;
+	/* Pointer to the unified hierarchy. Do not free! */
 	struct hierarchy *unified;
 
 	/*
diff --git a/src/lxc/commands.c b/src/lxc/commands.c
index 09379dec9..4d542eb94 100644
--- a/src/lxc/commands.c
+++ b/src/lxc/commands.c
@@ -654,7 +654,7 @@ static int lxc_cmd_stop_callback(int fd, struct lxc_cmd_req *req,
 		 * lxc_unfreeze() would do another cmd (GET_CGROUP) which would
 		 * deadlock us.
 		 */
-		if (cgroup_ops->get_cgroup(cgroup_ops, "freezer") == NULL)
+		if (!cgroup_ops->get_cgroup(cgroup_ops, "freezer"))
 			return 0;
 
 		if (cgroup_ops->unfreeze(cgroup_ops))


More information about the lxc-devel mailing list