[CRIU] [PATCH 3/3] mount: Umount forced mounts on restore

Andrew Vagin avagin at virtuozzo.com
Wed Jun 22 22:09:47 PDT 2016


On Wed, Jun 22, 2016 at 05:19:26PM +0300, Kirill Tkhai wrote:
> Umount mountpoints, which was forced mounted at dump.
> 
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
>  criu/include/mount.h |    1 +
>  criu/mount.c         |   23 +++++++++++++++++++++++
>  images/mnt.proto     |    1 +
>  3 files changed, 25 insertions(+)
> 
> diff --git a/criu/include/mount.h b/criu/include/mount.h
> index 191f6a3..4554b2d 100644
> --- a/criu/include/mount.h
> +++ b/criu/include/mount.h
> @@ -70,6 +70,7 @@ struct mount_info {
>  
>  	struct ext_mount	*external;
>  	bool			internal_sharing;
> +	bool			forced_mounted;
>  
>  	/* tree linkage */
>  	struct mount_info	*parent;
> diff --git a/criu/mount.c b/criu/mount.c
> index f91654c..c08d217 100644
> --- a/criu/mount.c
> +++ b/criu/mount.c
> @@ -1832,9 +1832,19 @@ static struct fstype *decode_fstype(u32 fst)
>  static int dump_one_fs(struct mount_info *mi)
>  {
>  	struct mount_info *pm = mi;
> +	struct forced_mount *fm;
>  	struct mount_info *t;
>  	bool first = true;
>  
> +	list_for_each_entry(fm, &forced_mounts_list, list) {
> +		if (fm->mnt_id == mi->mnt_id &&
> +		    fm->ns_id == mi->nsid->kid) {
> +			pr_info("Mark forced mount %u in ns %u\n", fm->mnt_id, fm->ns_id);
> +			mi->forced_mounted = true;
> +			break;
> +		}
> +	}
> +
>  	if (mi->is_ns_root || mi->need_plugin || mi->external || !mi->fstype->dump)
>  		return 0;
>  
> @@ -1902,6 +1912,11 @@ static int dump_one_mountpoint(struct mount_info *pm, struct cr_img *img)
>  		me.deleted	= true;
>  	}
>  
> +	if (pm->forced_mounted) {
> +		me.forced_mounted	= pm->forced_mounted;
> +		me.has_forced_mounted	= true;
> +	}
> +
>  	if (pm->internal_sharing) {
>  		me.has_internal_sharing = true;
>  		me.internal_sharing = true;
> @@ -2684,6 +2699,12 @@ static int do_mount_one(struct mount_info *mi)
>  			mi->fstype = find_fstype_by_name("btrfs");
>  	}
>  
> +	if (mi->forced_mounted) {
> +		ret = umount(mi->mountpoint);

Who will umount it if criu dump doesn't kill processes (error cases or
--leave-running)? Maybe it's better to dump binfmt-misc without adding a
fake mount point?

> +		if (ret)
> +			pr_perror("Can't umount %s\n", mi->mountpoint);
> +	}
> +
>  	return ret;
>  }
>  
> @@ -2998,6 +3019,8 @@ static int collect_mnt_from_image(struct mount_info **pms, struct ns_id *nsid)
>  		pm->is_ns_root		= is_root(me->mountpoint);
>  		if (me->has_internal_sharing)
>  			pm->internal_sharing = me->internal_sharing;
> +		if (me->has_forced_mounted)
> +			pm->forced_mounted = me->forced_mounted;
>  
>  		pm->source = xstrdup(me->source);
>  		if (!pm->source)
> diff --git a/images/mnt.proto b/images/mnt.proto
> index 9338ecb..4e56201 100644
> --- a/images/mnt.proto
> +++ b/images/mnt.proto
> @@ -46,4 +46,5 @@ message mnt_entry {
>  
>  	optional bool		deleted			= 16;
>  	optional uint32		sb_flags		= 17 [(criu).hex = true];
> +	optional bool		forced_mounted		= 18;
>  }
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list