Skip to content

Commit

Permalink
Merge pull request #1152 from tych0/fix-migration-2.0.4
Browse files Browse the repository at this point in the history
c/r: use /proc/self/tid/children instead of pidfile
  • Loading branch information
Christian Brauner committed Aug 26, 2016
2 parents e854c5e + 75d219f commit 69dffc9
Showing 1 changed file with 14 additions and 24 deletions.
38 changes: 14 additions & 24 deletions src/lxc/criu.c
Expand Up @@ -69,7 +69,6 @@ struct criu_opts {
char tty_id[32]; /* the criu tty id for /dev/console, i.e. "tty[${rdev}:${dev}]" */

/* restore: the file to write the init process' pid into */
char *pidfile;
const char *cgroup_path;
int console_fd;
/* The path that is bind mounted from /dev/console, if any. We don't
Expand Down Expand Up @@ -176,10 +175,10 @@ static void exec_criu(struct criu_opts *opts)
static_args += 2;
} else if (strcmp(opts->action, "restore") == 0) {
/* --root $(lxc_mount_point) --restore-detached
* --restore-sibling --pidfile $foo --cgroup-root $foo
* --restore-sibling --cgroup-root $foo
* --lsm-profile apparmor:whatever
*/
static_args += 10;
static_args += 8;

tty_info[0] = 0;
if (load_tty_major_minor(opts->user->directory, tty_info, sizeof(tty_info)))
Expand Down Expand Up @@ -330,8 +329,6 @@ static void exec_criu(struct criu_opts *opts)
DECLARE_ARG(opts->c->lxc_conf->rootfs.mount);
DECLARE_ARG("--restore-detached");
DECLARE_ARG("--restore-sibling");
DECLARE_ARG("--pidfile");
DECLARE_ARG(opts->pidfile);
DECLARE_ARG("--cgroup-root");
DECLARE_ARG(opts->cgroup_path);

Expand Down Expand Up @@ -604,13 +601,8 @@ static void do_restore(struct lxc_container *c, int status_pipe, struct migrate_
{
pid_t pid;
struct lxc_handler *handler;
int fd, status;
int status;
int pipes[2] = {-1, -1};
char pidfile[] = "criu_restore_XXXXXX";

fd = mkstemp(pidfile);
if (fd < 0)
goto out;

handler = lxc_init(c->name, c->lxc_conf, c->config_path);
if (!handler)
Expand Down Expand Up @@ -690,7 +682,6 @@ static void do_restore(struct lxc_container *c, int status_pipe, struct migrate_
os.action = "restore";
os.user = opts;
os.c = c;
os.pidfile = pidfile;
os.cgroup_path = cgroup_canonical_path(handler);
os.console_fd = c->lxc_conf->console.slave;
os.criu_version = criu_version;
Expand Down Expand Up @@ -742,8 +733,9 @@ static void do_restore(struct lxc_container *c, int status_pipe, struct migrate_
}

if (WIFEXITED(status)) {
char buf[4096];

if (WEXITSTATUS(status)) {
char buf[4096];
int n;

n = read(pipes[0], buf, sizeof(buf));
Expand All @@ -758,18 +750,21 @@ static void do_restore(struct lxc_container *c, int status_pipe, struct migrate_
goto out_fini_handler;
} else {
int ret;
FILE *f = fdopen(fd, "r");

ret = snprintf(buf, sizeof(buf), "/proc/self/task/%" PRId64 "/children", syscall(__NR_gettid));
if (ret < 0 || ret >= sizeof(buf)) {
ERROR("snprintf'd too many characters: %d", ret);
goto out_fini_handler;
}

FILE *f = fopen(buf, "r");
if (!f) {
SYSERROR("couldn't read restore's init pidfile %s\n", pidfile);
SYSERROR("couldn't read restore's children file %s\n", buf);
goto out_fini_handler;
}
fd = -1;

ret = fscanf(f, "%d", (int*) &handler->pid);
fclose(f);
if (unlink(pidfile) < 0 && errno != ENOENT)
SYSERROR("unlinking pidfile failed");

if (ret != 1) {
ERROR("reading restore pid failed");
goto out_fini_handler;
Expand Down Expand Up @@ -809,8 +804,6 @@ static void do_restore(struct lxc_container *c, int status_pipe, struct migrate_
close(pipes[1]);

lxc_fini(c->name, handler);
if (unlink(pidfile) < 0 && errno != ENOENT)
SYSERROR("unlinking pidfile failed");

out:
if (status_pipe >= 0) {
Expand All @@ -821,9 +814,6 @@ static void do_restore(struct lxc_container *c, int status_pipe, struct migrate_
close(status_pipe);
}

if (fd > 0)
close(fd);

exit(1);
}

Expand Down

0 comments on commit 69dffc9

Please sign in to comment.