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