]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
stop cmd callback: unfreeze by path only
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Wed, 15 Jan 2014 19:40:53 +0000 (13:40 -0600)
committerStéphane Graber <stgraber@ubuntu.com>
Thu, 16 Jan 2014 04:56:43 +0000 (23:56 -0500)
in particular, regular unfreeze uses the cmd api to request the cgroup
of the container.  If we are already in the lxc-start monitor, we can't
use the cmd api.

(I knew when I started this would be a problem but then as it didn't
reliably crash, I forgot to handle it)

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
src/lxc/cgmanager.c
src/lxc/cgroup.c
src/lxc/cgroup.h
src/lxc/commands.c

index 53a180234d561a6695078f7a7505b83daa2acaac..21083da20595302b25a4ad12b4476c21f70cd0ae 100644 (file)
@@ -358,6 +358,18 @@ out_free:
        return false;
 }
 
+static int cgm_unfreeze_fromhandler(struct lxc_handler *handler)
+{
+       struct cgm_data *d = handler->cgroup_info->data;
+
+       if (cgmanager_set_value_sync(NULL, cgroup_manager, "freezer", d->cgroup_path,
+                       "freezer.state", "THAWED") != 0) {
+               ERROR("Error unfreezing %s", d->cgroup_path);
+               return false;
+       }
+       return true;
+}
+
 static struct cgroup_ops cgmanager_ops = {
        .destroy = cgm_destroy,
        .init = cgm_init,
@@ -367,6 +379,7 @@ static struct cgroup_ops cgmanager_ops = {
        .get_cgroup = cgm_get_cgroup,
        .get = cgm_get,
        .set = cgm_set,
+       .unfreeze_fromhandler = cgm_unfreeze_fromhandler,
        .name = "cgmanager"
 };
 #endif
index 9d38fb0d699913eb083447aa4e7c709b6198db76..c4022afbb22867608ca380c7991cb5f48b901437 100644 (file)
@@ -2168,6 +2168,21 @@ static char *cgfs_get_cgroup(struct lxc_handler *handler, const char *subsystem)
        return lxc_cgroup_get_hierarchy_path_handler(subsystem, handler);
 }
 
+static int cgfs_unfreeze_fromhandler(struct lxc_handler *handler)
+{
+       char *cgabspath, *cgrelpath;
+       int ret;
+
+       cgrelpath = lxc_cgroup_get_hierarchy_path_handler("freezer", handler);
+       cgabspath = lxc_cgroup_find_abs_path("freezer", cgrelpath, true, NULL);
+       if (!cgabspath)
+               return -1;
+
+       ret = do_cgroup_set(cgabspath, "freezer.state", "THAWED");
+       free(cgabspath);
+       return ret;
+}
+
 static struct cgroup_ops cgfs_ops = {
        .destroy = cgfs_destroy,
        .init = cgfs_init,
@@ -2177,6 +2192,7 @@ static struct cgroup_ops cgfs_ops = {
        .get_cgroup = cgfs_get_cgroup,
        .get = lxc_cgroupfs_get,
        .set = lxc_cgroupfs_set,
+       .unfreeze_fromhandler = cgfs_unfreeze_fromhandler,
        .name = "cgroupfs",
 };
 static void init_cg_ops(void)
@@ -2281,3 +2297,8 @@ int lxc_cgroup_get(const char *filename, char *value, size_t len, const char *na
        init_cg_ops();
        return active_cg_ops->get(filename, value, len, name, lxcpath);
 }
+
+int lxc_unfreeze_fromhandler(struct lxc_handler *handler)
+{
+       return active_cg_ops->unfreeze_fromhandler(handler);
+}
index 1dc459bdeacf1e695686415a519766441a4dfdaf..76dcbd13d15c41a66d8c8d546738c00047687806 100644 (file)
@@ -178,6 +178,7 @@ struct cgroup_ops {
        char *(*get_cgroup)(struct lxc_handler *handler, const char *subsystem);
        int (*set)(const char *filename, const char *value, const char *name, const char *lxcpath);
        int (*get)(const char *filename, char *value, size_t len, const char *name, const char *lxcpath);
+       int (*unfreeze_fromhandler)(struct lxc_handler *handler);
        const char *name;
 };
 
@@ -214,5 +215,6 @@ extern bool cgroup_create_legacy(struct lxc_handler *handler);
 extern char *cgroup_get_cgroup(struct lxc_handler *handler, const char *subsystem);
 extern int lxc_cgroup_set(const char *filename, const char *value, const char *name, const char *lxcpath);
 extern int lxc_cgroup_get(const char *filename, char *value, size_t len, const char *name, const char *lxcpath);
+extern int lxc_unfreeze_fromhandler(struct lxc_handler *handler);
 
 #endif
index 29aa905eb7ac1f16f7cc7df7bab5a91d386cea85..8b42c59395b57f39ffef1e19ff09b3c519666aaf 100644 (file)
@@ -591,7 +591,7 @@ static int lxc_cmd_stop_callback(int fd, struct lxc_cmd_req *req,
        memset(&rsp, 0, sizeof(rsp));
        rsp.ret = kill(handler->pid, stopsignal);
        if (!rsp.ret) {
-               ret = lxc_unfreeze(handler->name, handler->lxcpath);
+               ret = lxc_unfreeze_fromhandler(handler);
                if (!ret)
                        return 0;
                ERROR("Failed to unfreeze %s:%s", handler->lxcpath, handler->name);