[CRIU] [PATCH 3/8] cr-restore: set cr_error to EEXIST if such pid already exists, v2
Pavel Emelyanov
xemul at parallels.com
Tue Dec 2 05:20:19 PST 2014
On 12/02/2014 03:29 PM, Ruslan Kuprieiev wrote:
> This is a very common error when using criu.
>
> The problem here is that we need to somehow transfer cr_errno
> from one process to another. I suggest using pipe to give
> one end to children and read cr_errno on other after restore
> is finished.
>
> v2, Pavel suggested putting errno into shared task_entries.
>
> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
> ---
> cr-restore.c | 7 ++++++-
> include/cr-errno.h | 1 +
> include/rst_info.h | 1 +
> 3 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/cr-restore.c b/cr-restore.c
> index 93a6ca6..60641d9 100644
> --- a/cr-restore.c
> +++ b/cr-restore.c
> @@ -85,6 +85,8 @@
>
> #include "asm/restore.h"
>
> +#include "cr-errno.h"
> +
> static struct pstree_item *current;
>
> static int restore_task_with_children(void *);
> @@ -1412,6 +1414,7 @@ static int restore_task_with_children(void *_arg)
> pid = getpid();
> if (current->pid.virt != pid) {
> pr_err("Pid %d do not match expected %d\n", pid, current->pid.virt);
> + task_entries->cr_err = EEXIST;
This is racy. Presumably we want to get the very first error from
children, thus we need the cmpxchg() here (wrapped in a helper).
> goto err;
> }
>
> @@ -1535,8 +1538,10 @@ static int restore_wait_inprogress_tasks()
>
> futex_wait_while_gt(np, 0);
> ret = (int)futex_get(np);
> - if (ret < 0)
> + if (ret < 0) {
> + cr_errno = task_entries->cr_err;
> return ret;
> + }
>
> return 0;
> }
> diff --git a/include/cr-errno.h b/include/cr-errno.h
> index bec72a8..f86bba8 100644
> --- a/include/cr-errno.h
> +++ b/include/cr-errno.h
> @@ -4,6 +4,7 @@ extern int cr_errno;
> /*
> * List of symbolic error names:
> * ESRCH - no process can be found corresponding to that specified by pid
> + * EEXIST - process with such pid already exists
> */
>
> #endif /* __CR_ERRNO_H__ */
> diff --git a/include/rst_info.h b/include/rst_info.h
> index 6b00c50..cec0144 100644
> --- a/include/rst_info.h
> +++ b/include/rst_info.h
> @@ -10,6 +10,7 @@ struct task_entries {
> futex_t nr_in_progress;
> futex_t start;
> mutex_t zombie_lock;
> + int cr_err;
> };
>
> struct fdt {
>
More information about the CRIU
mailing list