This commit is in preparation for the cgroups create work, since we will need
the handler in both the parent and the child. This commit also re-works how
errors are propagated to be less verbose.

Signed-off-by: Tycho Andersen <tycho.ander...@canonical.com>
---
 src/lxc/lxccontainer.c | 70 +++++++++++++++++++++++---------------------------
 1 file changed, 32 insertions(+), 38 deletions(-)

diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 4f90f35..7e3a6b2 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -3805,6 +3805,8 @@ static bool lxcapi_restore(struct lxc_container *c, char 
*directory, bool verbos
        struct lxc_list *it;
        struct lxc_rootfs *rootfs;
        char pidfile[L_tmpnam];
+       struct lxc_handler *handler;
+       bool error = false;
 
        if (!criu_ok(c))
                return false;
@@ -3817,9 +3819,18 @@ static bool lxcapi_restore(struct lxc_container *c, char 
*directory, bool verbos
        if (!tmpnam(pidfile))
                return false;
 
+       handler = lxc_init(c->name, c->lxc_conf, c->config_path);
+       if (!handler)
+               return false;
+
+       if (!cgroup_init(handler)) {
+               ERROR("failed initing cgroups");
+               goto out_fini_handler;
+       }
+
        pid = fork();
        if (pid < 0)
-               return false;
+               goto out_fini_handler;
 
        if (pid == 0) {
                struct criu_opts os;
@@ -3858,30 +3869,22 @@ static bool lxcapi_restore(struct lxc_container *c, 
char *directory, bool verbos
                exit(1);
        } else {
                int status;
-               struct lxc_handler *handler;
-               bool error = false;
 
                pid_t w = waitpid(pid, &status, 0);
 
                if (w == -1) {
                        perror("waitpid");
-                       return false;
+                       goto out_fini_handler;
                }
 
-               handler = lxc_init(c->name, c->lxc_conf, c->config_path);
-               if (!handler)
-                       return false;
-
                if (WIFEXITED(status)) {
                        if (WEXITSTATUS(status)) {
-                               error = true;
                                goto out_fini_handler;
                        }
                        else {
                                int netnr = 0, ret;
                                FILE *f = fopen(pidfile, "r");
                                if (!f) {
-                                       error = true;
                                        perror("reading pidfile");
                                        ERROR("couldn't read restore's init 
pidfile %s\n", pidfile);
                                        goto out_fini_handler;
@@ -3890,71 +3893,62 @@ static bool lxcapi_restore(struct lxc_container *c, 
char *directory, bool verbos
                                ret = fscanf(f, "%d", (int*) &handler->pid);
                                fclose(f);
                                if (ret != 1) {
-                                       error = true;
                                        ERROR("reading restore pid failed");
                                        goto out_fini_handler;
                                }
 
-                               if (!cgroup_init(handler)) {
-                                       error = true;
-                                       ERROR("failed initing cgroups");
-                                       goto out_fini_handler;
-                               }
-
                                if (!cgroup_parse_existing_cgroups(handler)) {
-                                       ERROR("failed creating cgroups");
+                                       ERROR("failed creating groups");
                                        goto out_fini_handler;
                                }
 
-                               if (container_mem_lock(c)) {
-                                       error = true;
+                               if (container_mem_lock(c))
                                        goto out_fini_handler;
-                               }
 
                                lxc_list_for_each(it, &c->lxc_conf->network) {
                                        char eth[128], veth[128];
                                        struct lxc_netdev *netdev = it->elem;
 
                                        if (read_criu_file(directory, "veth", 
netnr, veth)) {
-                                               error = true;
-                                               goto out_unlock;
+                                               container_mem_unlock(c);
+                                               goto out_fini_handler;
                                        }
+
                                        if (read_criu_file(directory, "eth", 
netnr, eth)) {
-                                               error = true;
-                                               goto out_unlock;
+                                               container_mem_unlock(c);
+                                               goto out_fini_handler;
                                        }
+
                                        netdev->priv.veth_attr.pair = 
strdup(veth);
                                        if (!netdev->priv.veth_attr.pair) {
-                                               error = true;
-                                               goto out_unlock;
+                                               container_mem_unlock(c);
+                                               goto out_fini_handler;
                                        }
+
                                        netnr++;
                                }
-out_unlock:
+
                                container_mem_unlock(c);
-                               if (error)
-                                       goto out_fini_handler;
 
-                               if (lxc_set_state(c->name, handler, RUNNING)) {
-                                       error = true;
+                               if (lxc_set_state(c->name, handler, RUNNING))
                                        goto out_fini_handler;
-                               }
                        }
                } else {
                        ERROR("CRIU was killed with signal %d\n", 
WTERMSIG(status));
-                       error = true;
                        goto out_fini_handler;
                }
 
                if (lxc_poll(c->name, handler)) {
                        lxc_abort(c->name, handler);
-                       return false;
+                       goto out_fini_handler;
                }
+       }
+
+       error = false;
 
 out_fini_handler:
-               lxc_fini(c->name, handler);
-               return !error;
-       }
+       lxc_fini(c->name, handler);
+       return !error;
 }
 
 static int lxcapi_attach_run_waitl(struct lxc_container *c, 
lxc_attach_options_t *options, const char *program, const char *arg, ...)
-- 
1.9.1

_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to