[CRIU] [PATCH v8 06/15] files: new "used" files list introduced
Stanislav Kinsburskiy
skinsbursky at virtuozzo.com
Thu May 26 06:21:51 PDT 2016
26.05.2016 15:20, Kirill Tkhai пишет:
> В Ср, 16/03/2016 в 16:17 +0300, Stanislav Kinsburskiy пишет:
>> 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.
>> This patch also adds a couple of simple helpers to find unused file
>> descriptor:
>> 1) fd_is_used() does exactly what it is named
>> 2) find_unused_fd() returns "hint_fd" if unused or last used
>> descriptor plus
>> one.
>>
>> Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
>> ---
>> criu/files.c | 3 +++
>> criu/include/files.h | 33 +++++++++++++++++++++++++++++++++
>> criu/include/rst_info.h | 1 +
>> 3 files changed, 37 insertions(+)
>>
>> diff --git a/criu/files.c b/criu/files.c
>> index 8a7d85f..40bb13a 100644
>> --- a/criu/files.c
>> +++ b/criu/files.c
>> @@ -646,6 +646,8 @@ static int collect_fd(int pid, FdinfoEntry *e,
>> struct rst_info *rst_info)
>> else
>> collect_gen_fd(new_le, rst_info);
>>
>> + collect_used_fd(new_le, rst_info);
>> +
>> list_add_tail(&new_le->desc_list, &le->desc_list);
>> new_le->desc = fdesc;
>>
>> @@ -686,6 +688,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/criu/include/files.h b/criu/include/files.h
>> index 5db6ab1..d38dbfd 100644
>> --- a/criu/include/files.h
>> +++ b/criu/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,11 +109,43 @@ 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);
>> }
>>
>> +static inline bool fd_is_used(struct list_head *head, int fd)
>> +{
>> + struct fdinfo_list_entry *fle;
>> +
>> + list_for_each_entry(fle, head, used_list) {
>> + if (fle->fe->fd == fd)
>> + return true;
>> + }
>> +
>> + return false;
>> +}
>> +
>> +static inline unsigned int find_unused_fd(struct list_head *head,
>> int hint_fd)
>> +{
>> + if ((hint_fd >= 0) && (!fd_is_used(head, hint_fd)))
>> + return hint_fd;
>> + /* Return last used fd +1 */
>> + return list_entry(head->prev, typeof(struct
>> fdinfo_list_entry), used_list)->fe->fd + 1;
> What is guarantee that we have a space between the last fd and
> INT/UINT_MAX?
>
Frankly speaking, there is no garantee.
>> +}
>> +
>> struct file_desc {
>> u32 id; /* File id,
>> unique */
>> struct hlist_node hash; /* Descriptor
>> hashing and lookup */
>> diff --git a/criu/include/rst_info.h b/criu/include/rst_info.h
>> index b6d378e..562e2f0 100644
>> --- a/criu/include/rst_info.h
>> +++ b/criu/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;
>>
>> _______________________________________________
>> CRIU mailing list
>> CRIU at openvz.org
>> https://lists.openvz.org/mailman/listinfo/criu
More information about the CRIU
mailing list