[CRIU] [PATCH 10/15] files: close_old_fds before forking children
Pavel Emelyanov
xemul at parallels.com
Thu Jan 10 06:25:33 EST 2013
On 01/10/2013 02:00 PM, Andrey Vagin wrote:
> A few processes can share one fd table. Each process has own set of
> service file descriptors and a process knows nothing about servic fds
> of another processes. So if two process share one fd table,
> close_old_fds will close servic descriptors of another process.
I don't understand this change. You will place a barrier into fds restore
so that all fdt owners will get synchronized. Next, you will repopulate the
fdt with new fds, so why the hell other sharing tasks should care about it?
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
> cr-restore.c | 1 +
> files.c | 2 +-
> include/files.h | 1 +
> 3 files changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/cr-restore.c b/cr-restore.c
> index fd2fe0d..210347e 100644
> --- a/cr-restore.c
> +++ b/cr-restore.c
> @@ -993,6 +993,7 @@ static int restore_task_with_children(void *_arg)
> sigset_t blockmask;
>
> close_safe(&ca->fd);
> + close_old_fds(current);
>
> current = ca->item;
>
> diff --git a/files.c b/files.c
> index 5bf4ffa..2e3c071 100644
> --- a/files.c
> +++ b/files.c
> @@ -496,7 +496,7 @@ static int open_fdinfos(int pid, struct list_head *list, int state)
> return ret;
> }
>
> -static int close_old_fds(struct pstree_item *me)
> +int close_old_fds(struct pstree_item *me)
> {
> DIR *dir;
> struct dirent *de;
> diff --git a/include/files.h b/include/files.h
> index 0c727aa..b33ae17 100644
> --- a/include/files.h
> +++ b/include/files.h
> @@ -94,6 +94,7 @@ extern int get_filemap_fd(int pid, VmaEntry *vma_entry);
> extern int prepare_fs(int pid);
> extern int set_fd_flags(int fd, int flags);
>
> +extern int close_old_fds(struct pstree_item *me);
> #ifndef AT_EMPTY_PATH
> #define AT_EMPTY_PATH 0x1000
> #endif
>
More information about the CRIU
mailing list