CRIU requires a pid of the init. Signed-off-by: Andrey Vagin <ava...@openvz.org> --- include/types.h | 2 ++ include/util.h | 1 + src/lib/hooks_ct.c | 20 ++++++++++++++++++-- src/lib/util.c | 5 +++++ 4 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/include/types.h b/include/types.h index a4bce73..79e22ca 100644 --- a/include/types.h +++ b/include/types.h @@ -61,6 +61,8 @@ typedef unsigned envid_t; #define DEF_DUMPDIR VZDIR "/dump" #define DEF_DUMPFILE "Dump.%d" +#define DEF_STATEDIR VZDIR "/state" + /* CT states */ enum { STATE_STARTING = 1, diff --git a/include/util.h b/include/util.h index 0f87e6e..4136245 100644 --- a/include/util.h +++ b/include/util.h @@ -57,6 +57,7 @@ int get_num_cpu(void); int get_lowmem(unsigned long long *mem); unsigned long max_ul(unsigned long val1, unsigned long val2); int get_dump_file(unsigned veid, const char *dumpdir, char *buf, int size); +int get_state_file(unsigned veid, char *buf, int size); int set_not_blk(int fd); void close_fds(int close_std, ...); int move_config(int veid, int action); diff --git a/src/lib/hooks_ct.c b/src/lib/hooks_ct.c index 83ef20a..8c98289 100644 --- a/src/lib/hooks_ct.c +++ b/src/lib/hooks_ct.c @@ -86,6 +86,10 @@ static int ct_destroy(vps_handler *h, envid_t veid) snprintf(ctpath, STR_SIZE, "%s/%d", NETNS_RUN_DIR, veid); unlink(ctpath); + + get_state_file(veid, ctpath, sizeof(ctpath)); + unlink(ctpath); + return destroy_container(veid); } @@ -230,7 +234,8 @@ static int ct_env_create_real(struct arg_start *arg) long stack_size; char *child_stack; int clone_flags; - int ret; + int ret, fd; + char pidpath[STR_SIZE]; stack_size = get_pagesize(); if (stack_size < 0) @@ -251,15 +256,26 @@ static int ct_env_create_real(struct arg_start *arg) clone_flags |= CLONE_NEWUTS|CLONE_NEWPID|CLONE_NEWIPC; clone_flags |= CLONE_NEWNET|CLONE_NEWNS; + get_state_file(arg->veid, pidpath, sizeof(pidpath)); + fd = open(pidpath, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, 0600); + if (fd == -1) { + logger(-1, errno, "Unable to create a state file %s", pidpath); + return VZ_RESOURCE_ERROR; + } + ret = clone(_env_create, child_stack, clone_flags, arg); if (ret < 0) { logger(-1, errno, "Unable to clone"); + close(fd); /* FIXME: remove ourselves from container first */ destroy_container(arg->veid); return -1; } - return 0; + dprintf(fd, "%d", ret); + close(fd); + + return ret; } int ct_env_create(struct arg_start *arg) diff --git a/src/lib/util.c b/src/lib/util.c index df410ff..f58f7e4 100644 --- a/src/lib/util.c +++ b/src/lib/util.c @@ -589,6 +589,11 @@ int get_dump_file(unsigned veid, const char *dumpdir, char *buf, int size) dumpdir != NULL ? dumpdir : DEF_DUMPDIR, veid); } +int get_state_file(unsigned veid, char *buf, int size) +{ + return snprintf(buf, size, DEF_STATEDIR "/%d.pid", veid); +} + int set_not_blk(int fd) { int oldfl, ret; -- 1.8.2 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel