[CRIU] [PATCH v3 12/16] files: new "used" files introduced

Pavel Emelyanov xemul at parallels.com
Mon Dec 14 03:21:29 PST 2015


On 12/10/2015 06:17 PM, Stanislav Kinsburskiy wrote:
> This list contains all per-process used file fdinfo's, sorted by fd number.
> Will be used to safely create new artificial file descriptors and also allow
> to recreate temporary descriptors with original number, if possible, like
> AutoFS tries to preserve original pipe write end descriptor, when it was
> closed.

AFAIU you only need this to find the first unused descriptor number. Why
not just have max_fd number in the rst_info and update one in every place
a new fd is added?

> Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
> ---
>  eventpoll.c        |    1 +
>  files.c            |    1 +
>  include/files.h    |   14 ++++++++++++++
>  include/rst_info.h |    1 +
>  tty.c              |    1 +
>  5 files changed, 18 insertions(+)
> 
> diff --git a/eventpoll.c b/eventpoll.c
> index c414c35..8d3a001 100644
> --- a/eventpoll.c
> +++ b/eventpoll.c
> @@ -185,6 +185,7 @@ static void eventpoll_collect_fd(struct file_desc *d,
>  		struct fdinfo_list_entry *fle, struct rst_info *ri)
>  {
>  	list_add_tail(&fle->ps_list, &ri->eventpoll);
> +	collect_used_fd(fle, ri);
>  }
>  
>  static struct file_desc_ops desc_ops = {
> diff --git a/files.c b/files.c
> index 5df9e68..a27667d 100644
> --- a/files.c
> +++ b/files.c
> @@ -686,6 +686,7 @@ int prepare_fd_pid(struct pstree_item *item)
>  	pid_t pid = item->pid.virt;
>  	struct rst_info *rst_info = rsti(item);
>  
> +	INIT_LIST_HEAD(&rst_info->used);
>  	INIT_LIST_HEAD(&rst_info->fds);
>  	INIT_LIST_HEAD(&rst_info->eventpoll);
>  	INIT_LIST_HEAD(&rst_info->tty_slaves);
> diff --git a/include/files.h b/include/files.h
> index db7e108..fdfd641 100644
> --- a/include/files.h
> +++ b/include/files.h
> @@ -67,6 +67,7 @@ struct fdinfo_list_entry {
>  	struct list_head	desc_list;	/* To chain on  @fd_info_head */
>  	struct file_desc	*desc;		/* Associated file descriptor */
>  	struct list_head	ps_list;	/* To chain  per-task files */
> +	struct list_head	used_list;	/* To chain per-task used fds */
>  	int			pid;
>  	futex_t			real_pid;
>  	FdinfoEntry		*fe;
> @@ -108,9 +109,22 @@ struct file_desc_ops {
>  	char *			(*name)(struct file_desc *, char *b, size_t s);
>  };
>  
> +static inline void collect_used_fd(struct fdinfo_list_entry *new_fle, struct rst_info *ri)
> +{
> +	struct fdinfo_list_entry *fle;
> +
> +	list_for_each_entry(fle, &ri->used, used_list) {
> +		if (new_fle->fe->fd < fle->fe->fd)
> +			break;
> +	}
> +
> +	list_add_tail(&new_fle->used_list, &fle->used_list);
> +}
> +
>  static inline void collect_gen_fd(struct fdinfo_list_entry *fle, struct rst_info *ri)
>  {
>  	list_add_tail(&fle->ps_list, &ri->fds);
> +	collect_used_fd(fle, ri);
>  }
>  
>  struct file_desc {
> diff --git a/include/rst_info.h b/include/rst_info.h
> index 74e01ee..f72025b 100644
> --- a/include/rst_info.h
> +++ b/include/rst_info.h
> @@ -27,6 +27,7 @@ struct fdt {
>  struct _MmEntry;
>  
>  struct rst_info {
> +	struct list_head	used;
>  	struct list_head	fds;
>  	struct list_head	eventpoll;
>  	struct list_head	tty_slaves;
> diff --git a/tty.c b/tty.c
> index 1286742..e441f80 100644
> --- a/tty.c
> +++ b/tty.c
> @@ -1006,6 +1006,7 @@ static void tty_collect_fd(struct file_desc *d, struct fdinfo_list_entry *fle,
>  		tgt = &ri->tty_slaves;
>  
>  	list_add_tail(&fle->ps_list, tgt);
> +	collect_used_fd(fle, ri);
>  }
>  
>  static struct file_desc_ops tty_desc_ops = {
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
> .
> 



More information about the CRIU mailing list