[CRIU] [PATCH v5 16/33] files: Add fdinfo_list_entry::stage
Pavel Emelyanov
xemul at virtuozzo.com
Wed Jan 18 00:43:20 PST 2017
On 12/26/2016 05:27 PM, Kirill Tkhai wrote:
> Add fle open stages. Set a stage after every operation.
>
> v2: Do not merge filetype specific state with generic.
>
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
> criu/files.c | 13 ++++++++++---
> criu/include/files.h | 9 +++++++++
> 2 files changed, 19 insertions(+), 3 deletions(-)
>
> diff --git a/criu/files.c b/criu/files.c
> index 87d8fc655..8e04309b6 100644
> --- a/criu/files.c
> +++ b/criu/files.c
> @@ -1005,12 +1005,16 @@ static int post_open_fd(int pid, struct fdinfo_list_entry *fle)
> return -1;
> }
> if (!is_service_fd(fle->fe->fd, CTL_TTY_OFF))
> - return 0;
> + goto out;
> }
>
> if (!d->ops->post_open)
> - return 0;
> - return d->ops->post_open(d, fle->fe->fd);
> + goto out;
> + if (d->ops->post_open(d, fle->fe->fd))
> + return -1;
> +out:
> + fle->stage = FLE_RESTORED;
> + return 0;
> }
>
>
> @@ -1058,6 +1062,9 @@ static int open_fd(int pid, struct fdinfo_list_entry *fle)
> return -1;
> }
>
> + if (fle->stage < FLE_OPEN)
Why is this if here?
> + fle->stage = FLE_OPEN;
> +
> return serve_out_fd(pid, fle->fe->fd, d);
> }
>
> diff --git a/criu/include/files.h b/criu/include/files.h
> index 1b44960de..5fffed6a8 100644
> --- a/criu/include/files.h
> +++ b/criu/include/files.h
> @@ -64,6 +64,13 @@ extern int fill_fdlink(int lfd, const struct fd_parms *p, struct fd_link *link);
>
> struct file_desc;
>
> +enum {
> + FLE_INITIALIZED,
> + FLE_OPEN,
> + FLE_RESTORING,
State not used in this set.
> + FLE_RESTORED,
> +};
> +
> struct fdinfo_list_entry {
> struct list_head desc_list; /* To chain on @fd_info_head */
> struct file_desc *desc; /* Associated file descriptor */
> @@ -72,6 +79,7 @@ struct fdinfo_list_entry {
> int pid;
> FdinfoEntry *fe;
> u8 received:1;
> + u8 stage:3;
> };
>
> static inline void fle_init(struct fdinfo_list_entry *fle, int pid, FdinfoEntry *fe)
> @@ -79,6 +87,7 @@ static inline void fle_init(struct fdinfo_list_entry *fle, int pid, FdinfoEntry
> fle->pid = pid;
> fle->fe = fe;
> fle->received = 0;
> + fle->stage = FLE_INITIALIZED;
> }
>
> /* reports whether fd_a takes prio over fd_b */
>
> .
>
More information about the CRIU
mailing list