[Devel] [PATCH criu] files: Allow to dump ploopX files opened
Pavel Emelyanov
xemul at virtuozzo.com
Thu Aug 4 06:34:57 PDT 2016
On 07/17/2016 11:01 AM, Cyrill Gorcunov wrote:
> Sometimes container's systemd-udevd opens ploop device
> for some reason. Since it's not forbidden allow it
> to do so.
>
> | (13.131338) Dumping task (pid: 270073 comm: systemd-udevd)
> | (13.131343) ========================================
> | ...
> | (13.173422) 270073 fdinfo 8: pos: 0x 0 flags: 2504000/0x1
> | (13.173439) Error (files-ext.c:91): Can't dump file 8 (/dev/ploop18098) of that type [60600] (unknown (null))
> | (13.173444) ----------------------------------------
> | (13.352711) Error (cr-dump.c:1317): Dump files (pid: 270073) failed with -1
> | (13.583663) Waiting for 270073 to trap
>
> https://jira.sw.ru/browse/PSBM-49723
>
> Signed-off-by: Cyrill Gorcunov <gorcunov at virtuozzo.com>
> ---
> criu/files.c | 32 +++++++++++++++++++++++++++++++-
> 1 file changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/criu/files.c b/criu/files.c
> index dfa3603..453993d 100644
> --- a/criu/files.c
> +++ b/criu/files.c
> @@ -387,6 +387,30 @@ static int dump_chrdev(struct fd_parms *p, int lfd, struct cr_img *img)
> return do_dump_gen_file(p, lfd, ops, img);
> }
>
> +static int check_blkdev(struct fd_parms *p, int lfd)
> +{
> + /*
> + * @ploop_major is module parameter actually,
> + * set to PLOOP_DEVICE_MAJOR by default. We may
> + * need to scan module params or access
> + * /sys/block/ploopX/dev to fetch major.
> + *
> + * For a while simply use predefined @major.
> + */
> + static const int ploop_major = 182;
Major numbers are typically macro-defined and sit in some header ;)
> + int maj = major(p->stat.st_rdev);
> +
> + /*
> + * It's been found that systemd-udevd sometimes
> + * opens-up ploop device from inside of container,
> + * so allow him to do that.
> + */
> + if (maj == ploop_major)
> + return 0;
This worries me :( Ploop has some internal state, so if we catch a proggie
that configures that state, live migrate it and just re-open the ploop it
will __continue__ configuring that state and, since we've re-opened the
ploop from the beginning, this configuration will continue with an error...
> +
> + return -1;
> +}
> +
> static int dump_one_file(struct parasite_ctl *ctl, int fd, int lfd, struct fd_opts *opts,
> struct cr_img *img)
> {
> @@ -431,9 +455,15 @@ static int dump_one_file(struct parasite_ctl *ctl, int fd, int lfd, struct fd_op
> return do_dump_gen_file(&p, lfd, ops, img);
> }
>
> - if (S_ISREG(p.stat.st_mode) || S_ISDIR(p.stat.st_mode)) {
> + if (S_ISREG(p.stat.st_mode) || S_ISDIR(p.stat.st_mode) ||
> + S_ISBLK(p.stat.st_mode)) {
> struct fd_link link;
>
> + if (S_ISBLK(p.stat.st_mode)) {
> + if (check_blkdev(&p, lfd))
> + return -1;
> + }
> +
> if (fill_fdlink(lfd, &p, &link))
> return -1;
>
>
More information about the Devel
mailing list