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

Stanislav Kinsburskiy skinsbursky at odin.com
Mon Dec 14 03:24:30 PST 2015



14.12.2015 12:21, Pavel Emelyanov пишет:
> 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?

This can be done like this, yes.
One of the intentions was to try to keep autofs restored options as 
close to original as possible.
The actual idea was to try to reopen write end of the pipe with the same 
fd, as it was originally.
To be able to do so, loop over all the descriptor is required to make 
sure, that fd is not busy.

>> 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