[CRIU] Re: [PATCH v2] dump: do not destroy global dump files on
reopen
Pavel Emelyanov
xemul at parallels.com
Thu Mar 15 12:25:59 EDT 2012
On 03/14/2012 07:27 PM, Kinsbursky Stanislav wrote:
> v2: added close of fdset for processes tree.
>
> Currently cr_dump_fdset_open() destroys existent file.
> Thus for sockets queues new less cruel cr_dump_fdset_open() helper is
> used.
What for? These files are per-task and theirs unlink() should happen
if the same file exists before dump.
> Oalso, processes tree dump moved outside tasks dump loop.
>
> Signed-off-by: Stanislav Kinsbursky <skinsbursky at openvz.org>
>
> ---
> cr-dump.c | 17 +++++++++--------
> crtools.c | 7 +++++++
> include/crtools.h | 1 +
> 3 files changed, 17 insertions(+), 8 deletions(-)
>
> diff --git a/cr-dump.c b/cr-dump.c
> index 6c71c84..9431c7f 100644
> --- a/cr-dump.c
> +++ b/cr-dump.c
> @@ -1434,26 +1434,27 @@ int cr_dump_tasks(pid_t pid, const struct cr_options *opts)
>
> collect_sockets();
>
> + cr_fdset = cr_dump_fdset_open(pid, CR_FD_DESC_USE(CR_FD_PSTREE), NULL);
> + if (!cr_fdset)
> + goto err;
> + if (dump_pstree(pid, &pstree_list, cr_fdset))
> + goto err;
> + close_cr_fdset(&cr_fdset);
> +
> list_for_each_entry(item, &pstree_list, list) {
> cr_fdset = cr_dump_fdset_open(item->pid, CR_FD_DESC_NONE, NULL);
> if (!cr_fdset)
> goto err;
>
> - if (item->pid == pid) {
> - if (!cr_dump_fdset_open(item->pid, CR_FD_DESC_USE(CR_FD_PSTREE), cr_fdset))
> - goto err;
> - if (dump_pstree(pid, &pstree_list, cr_fdset))
> - goto err;
> - }
> -
> /*
> * Prepare for socket queues in advance. They are not per-task,
> * but per-someother-task which makes restore tricky. Thus save
> * them in "global" image.
> * That's why we open the file with tree leader's pid for any
> * of it's children.
> + * The file will be created only if it's not exist.
> */
> - if (!cr_dump_fdset_open(pid, CR_FD_DESC_USE(CR_FD_SK_QUEUES), cr_fdset))
> + if (!cr_glob_fdset_open(pid, CR_FD_DESC_USE(CR_FD_SK_QUEUES), cr_fdset))
> goto err;
>
> if (dump_one_task(item, cr_fdset))
> diff --git a/crtools.c b/crtools.c
> index 469a7b3..395fdc9 100644
> --- a/crtools.c
> +++ b/crtools.c
> @@ -265,6 +265,13 @@ struct cr_fdset *cr_show_fdset_open(int pid, unsigned long use_mask)
> return cr_fdset_open(pid, use_mask, O_RDONLY, NULL);
> }
>
> +struct cr_fdset *cr_glob_fdset_open(int pid, unsigned long use_mask,
> + struct cr_fdset *cr_fdset)
> +{
> + return cr_fdset_open(pid, use_mask, O_RDWR | O_CREAT, cr_fdset);
> +}
> +
> +
> static int parse_ns_string(const char *ptr, unsigned int *flags)
> {
> const char *end = ptr + strlen(ptr);
> diff --git a/include/crtools.h b/include/crtools.h
> index ee35cc7..c09546b 100644
> --- a/include/crtools.h
> +++ b/include/crtools.h
> @@ -129,6 +129,7 @@ int cr_check(void);
>
> struct cr_fdset *cr_dump_fdset_open(int pid, unsigned long use_mask, struct cr_fdset *);
> struct cr_fdset *cr_show_fdset_open(int pid, unsigned long use_mask);
> +struct cr_fdset *cr_glob_fdset_open(int pid, unsigned long use_mask, struct cr_fdset *);
> void close_cr_fdset(struct cr_fdset **cr_fdset);
>
> void free_mappings(struct list_head *vma_area_list);
>
More information about the CRIU
mailing list