[CRIU] [PATCH 11/14] files: dump fdinfo per files_id instead of pid (v2)
Pavel Emelyanov
xemul at parallels.com
Fri Jan 11 05:50:19 EST 2013
On 01/11/2013 01:22 PM, Andrey Vagin wrote:
> A few processes can share one fdtable.
>
> v2: fix backward compatiability
>
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
> cr-dump.c | 26 ++++++++++++++++----------
> cr-restore.c | 5 ++++-
> files.c | 23 ++++++++++++++++++-----
> image.c | 6 ++++++
> include/crtools.h | 2 +-
> include/files.h | 2 +-
> include/image.h | 2 ++
> protobuf/inventory.proto | 1 +
> 8 files changed, 49 insertions(+), 18 deletions(-)
>
> diff --git a/cr-dump.c b/cr-dump.c
> index 25ff91e..fb81bc4 100644
> --- a/cr-dump.c
> +++ b/cr-dump.c
> @@ -354,10 +354,10 @@ static int dump_one_file(struct parasite_ctl *ctl, int fd, int lfd, struct fd_op
> return dump_unsupp_fd(&p);
> }
>
> -static int dump_task_files_seized(struct parasite_ctl *ctl, const int fdinfo,
> +static int dump_task_files_seized(struct parasite_ctl *ctl, struct pstree_item *item,
> struct parasite_drain_fd *dfds)
> {
> - int *lfds;
> + int *lfds, fdinfo;
> struct fd_opts *opts;
> int i, ret = -1;
>
> @@ -377,13 +377,19 @@ static int dump_task_files_seized(struct parasite_ctl *ctl, const int fdinfo,
> if (ret)
> goto err2;
>
> + fdinfo = open_image(CR_FD_FDINFO, O_DUMP, item->ids->files_id);
> + if (fdinfo < 0)
> + goto err2;
> +
> for (i = 0; i < dfds->nr_fds; i++) {
> ret = dump_one_file(ctl, dfds->fds[i], lfds[i], opts + i, fdinfo);
> close(lfds[i]);
> if (ret)
> - goto err2;
> + break;
> }
>
> + close(fdinfo);
> +
> pr_info("----------------------------------------\n");
> err2:
> xfree(opts);
> @@ -1422,7 +1428,13 @@ static int dump_one_task(struct pstree_item *item)
> if (!cr_fdset)
> goto err_cure;
>
> - ret = dump_task_files_seized(parasite_ctl, fdset_fd(cr_fdset, CR_FD_FDINFO), dfds);
> + ret = dump_task_ids(item, cr_fdset);
> + if (ret) {
> + pr_err("Dump ids (pid: %d) failed with %d\n", pid, ret);
> + goto err_cure;
> + }
> +
> + ret = dump_task_files_seized(parasite_ctl, item, dfds);
> if (ret) {
> pr_err("Dump files (pid: %d) failed with %d\n", pid, ret);
> goto err_cure;
> @@ -1453,12 +1465,6 @@ static int dump_one_task(struct pstree_item *item)
> goto err_cure;
> }
>
> - ret = dump_task_ids(item, cr_fdset);
> - if (ret) {
> - pr_err("Dump ids (pid: %d) failed with %d\n", pid, ret);
> - goto err_cure;
> - }
> -
> ret = dump_task_threads(parasite_ctl, item);
> if (ret) {
> pr_err("Can't dump threads\n");
> diff --git a/cr-restore.c b/cr-restore.c
> index 210347e..ccc404d 100644
> --- a/cr-restore.c
> +++ b/cr-restore.c
> @@ -155,7 +155,7 @@ static int root_prepare_shared(void)
> if (ret < 0)
> break;
>
> - ret = prepare_fd_pid(pi->pid.virt, pi->rst);
> + ret = prepare_fd_pid(pi);
> if (ret < 0)
> break;
> }
> @@ -715,6 +715,9 @@ static int check_core(CoreEntry *core)
> goto out;
> }
>
> + if (!current->ids && core->ids)
> + current->ids = core->ids;
> +
> if (core->tc->task_state != TASK_DEAD) {
> if (!current->ids) {
> pr_err("Core IDS data missed for non-zombie\n");
> diff --git a/files.c b/files.c
> index 34eabfb..2a22c3a 100644
> --- a/files.c
> +++ b/files.c
> @@ -217,19 +217,32 @@ int prepare_ctl_tty(int pid, struct rst_info *rst_info, u32 ctl_tty_id)
> return 0;
> }
>
> -int prepare_fd_pid(int pid, struct rst_info *rst_info)
> +int prepare_fd_pid(struct pstree_item *item)
> {
> int fdinfo_fd, ret = 0;
> + pid_t pid = item->pid.virt;
> + struct rst_info *rst_info = item->rst;
>
> INIT_LIST_HEAD(&rst_info->fds);
> INIT_LIST_HEAD(&rst_info->eventpoll);
> INIT_LIST_HEAD(&rst_info->tty_slaves);
>
> - fdinfo_fd = open_image_ro(CR_FD_FDINFO, pid);
> - if (fdinfo_fd < 0) {
> - if (errno == ENOENT)
> + if (!fdinfo_per_id) {
> + fdinfo_fd = open_image_ro(CR_FD_FDINFO, pid);
> + if (fdinfo_fd < 0) {
> + if (errno == ENOENT)
> + return 0;
> + return -1;
> + }
> + } else {
> + if (item->ids == NULL) /* zombie */
> return 0;
Check for zombie should be using item->state and precede both open models.
Thus the ENOENT check above will go away.
> - else
> +
> + if (item->rst->fdt && item->rst->fdt->pid != item->pid.virt)
> + return 0;
> +
> + fdinfo_fd = open_image_ro(CR_FD_FDINFO, item->ids->files_id);
> + if (fdinfo_fd < 0)
> return -1;
> }
>
> diff --git a/image.c b/image.c
> index d94c3de..fe85613 100644
> --- a/image.c
> +++ b/image.c
> @@ -15,6 +15,8 @@
> #include "protobuf.h"
> #include "protobuf/inventory.pb-c.h"
>
> +bool fdinfo_per_id = false;
> +
> int check_img_inventory(void)
> {
> int fd, ret;
> @@ -29,6 +31,8 @@ int check_img_inventory(void)
> if (ret < 0)
> return ret;
>
> + fdinfo_per_id = he->has_fdinfo_per_id ? he->fdinfo_per_id : false;
> +
> ret = he->img_version;
> inventory_entry__free_unpacked(he, NULL);
>
> @@ -52,6 +56,8 @@ int write_img_inventory(void)
> return -1;
>
> he.img_version = CRTOOLS_IMAGES_V1;
> + he.fdinfo_per_id = true;
> + he.has_fdinfo_per_id = true;
>
> if (pb_write_one(fd, &he, PB_INVENTORY) < 0)
> return -1;
> diff --git a/include/crtools.h b/include/crtools.h
> index 0afa2a1..00c917d 100644
> --- a/include/crtools.h
> +++ b/include/crtools.h
> @@ -24,7 +24,6 @@ enum {
> */
>
> _CR_FD_TASK_FROM,
> - CR_FD_FDINFO,
> CR_FD_PAGES,
> CR_FD_CORE,
> CR_FD_IDS,
> @@ -56,6 +55,7 @@ enum {
> CR_FD_SHMEM_PAGES,
> CR_FD_GHOST_FILE,
> CR_FD_TCP_STREAM,
> + CR_FD_FDINFO,
>
> _CR_FD_GLOB_FROM,
> CR_FD_SK_QUEUES,
> diff --git a/include/files.h b/include/files.h
> index 9d829f2..f246da4 100644
> --- a/include/files.h
> +++ b/include/files.h
> @@ -87,7 +87,7 @@ extern int rst_file_params(int fd, FownEntry *fown, int flags);
> extern void show_saved_files(void);
>
> extern int prepare_fds(struct pstree_item *me);
> -extern int prepare_fd_pid(int pid, struct rst_info *rst_info);
> +extern int prepare_fd_pid(struct pstree_item *me);
> extern int prepare_ctl_tty(int pid, struct rst_info *rst_info, u32 ctl_tty_id);
> extern int prepare_shared_fdinfo(void);
> extern int get_filemap_fd(int pid, VmaEntry *vma_entry);
> diff --git a/include/image.h b/include/image.h
> index ee75a5d..8ba25df 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -134,4 +134,6 @@ struct page_entry {
> #define GET_FILE_OFF(s, m) (offsetof(s,m) + MAGIC_OFFSET)
> #define GET_FILE_OFF_AFTER(s) (sizeof(s) + MAGIC_OFFSET)
>
> +extern bool fdinfo_per_id;
> +
> #endif /* __CR_IMAGE_H__ */
> diff --git a/protobuf/inventory.proto b/protobuf/inventory.proto
> index e9a40ee..9dff72c 100644
> --- a/protobuf/inventory.proto
> +++ b/protobuf/inventory.proto
> @@ -1,3 +1,4 @@
> message inventory_entry {
> required uint32 img_version = 1;
> + optional bool fdinfo_per_id = 2;
> }
>
More information about the CRIU
mailing list