[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