]> git.proxmox.com Git - mirror_lxc.git/commitdiff
cgfsng: fix cgroup creation
authorChristian Brauner <christian.brauner@ubuntu.com>
Sun, 10 Feb 2019 09:53:06 +0000 (10:53 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sun, 10 Feb 2019 09:58:04 +0000 (10:58 +0100)
When cgroup creation failed we reset container_cgroup to NULL to avoid
issues with __cleanup__. Fix that logic:
- add steal_ptr() based on take_ptr()
- move stealing the pointer out of the loop

lxc ctImport 20190210050705.858 DEBUG    network - network.c:instantiate_veth:202 - Instantiated veth "vethGQMH7I/vethSPXNL3", index is "272"
lxc ctImport 20190210050705.858 ERROR    cgfsng - cgroups/cgfsng.c:mkdir_eexist_on_last:1262 - File exists - Failed to create directory "/sys/fs/cgroup/unified//lxc.payload/ctImport-0"
lxc ctImport 20190210050705.858 ERROR    cgfsng - cgroups/cgfsng.c:container_create_path_for_hierarchy:1302 - Failed to create cgroup "/sys/fs/cgroup/unified//lxc.payload/ctImport-0"
lxc ctImport 20190210050705.858 ERROR    cgfsng - cgroups/cgfsng.c:cgfsng_payload_create:1431 - Failed to create cgroup "/sys/fs/cgroup/unified//lxc.payload/ctImport-0"
lxc ctImport 20190210050705.858 INFO     cgfsng - cgroups/cgfsng.c:cgfsng_payload_create:1441 - The container uses "lxc.payload/ctImport-0" as cgroup
lxc ctImport 20190210050705.858 ERROR    cgfsng - cgroups/cgfsng.c:mkdir_eexist_on_last:1262 - File exists - Failed to create directory "/sys/fs/cgroup/unified/"
lxc ctImport 20190210050705.858 ERROR    cgfsng - cgroups/cgfsng.c:container_create_path_for_hierarchy:1302 - Failed to create cgroup "/sys/fs/cgroup/unified/"
lxc ctImport 20190210050705.858 ERROR    cgfsng - cgroups/cgfsng.c:cgfsng_payload_create:1431 - Failed to create cgroup "/sys/fs/cgroup/unified/"
lxc ctImport 20190210050705.858 INFO     cgfsng - cgroups/cgfsng.c:cgfsng_payload_create:1441 - The container uses "(null)" as cgroup

Fixes: d97919abf22 ("cgroups: partially switch to cleanup macros")
Reported-by: Stéphane Graber <stgraber@ubuntu.com>
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/cgroups/cgfsng.c
src/lxc/macro.h

index 76c7647b5ad994a3f0676f606cbe39371760af8f..971c6a5237601dd587b798c0e2410994bcebb6b3 100644 (file)
@@ -1426,9 +1426,11 @@ __cgfsng_ops static inline bool cgfsng_payload_create(struct cgroup_ops *ops,
        offset = container_cgroup + len - 5;
 
        do {
-               int ret = snprintf(offset, 5, "-%d", idx);
-               if (ret < 0 || (size_t)ret >= 5)
-                       return false;
+               if (idx) {
+                       int ret = snprintf(offset, 5, "-%d", idx);
+                       if (ret < 0 || (size_t)ret >= 5)
+                               return false;
+               }
 
                for (i = 0; ops->hierarchies[i]; i++) {
                        if (!container_create_path_for_hierarchy(ops->hierarchies[i],
@@ -1443,16 +1445,13 @@ __cgfsng_ops static inline bool cgfsng_payload_create(struct cgroup_ops *ops,
                                break;
                        }
                }
-
-               ops->container_cgroup = container_cgroup;
-               container_cgroup = NULL;
-               INFO("The container uses \"%s\" as cgroup", ops->container_cgroup);
        } while (ops->hierarchies[i] && idx > 0 && idx < 1000);
 
        if (idx == 1000)
                return false;
 
-       INFO("The container process uses \"%s\" as cgroup", ops->container_cgroup);
+       INFO("The container process uses \"%s\" as cgroup", container_cgroup);
+       ops->container_cgroup = steal_ptr(container_cgroup);
        return true;
 }
 
index 30aa2a5a59592246f0f107e254ea3b1b0d4e8a61..14e12670ea2e32a220a53bd5f019b57aae076bda 100644 (file)
@@ -392,4 +392,11 @@ enum {
 /* Maximum number of bytes sendfile() is able to send in one go. */
 #define LXC_SENDFILE_MAX 0x7ffff000
 
+#define steal_ptr(ptr)                     \
+       ({                                 \
+               typeof(ptr) _ptr_ = (ptr); \
+               (ptr) = NULL;              \
+               _ptr_;                     \
+       })
+
 #endif /* __LXC_MACRO_H */