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

Kirill Tkhai ktkhai at virtuozzo.com
Thu Jun 23 02:15:50 PDT 2016


On 23.06.2016 08:09, Andrew Vagin wrote:
> 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?

I'll add umounting code in cr_dump_finish(), like we do for link remaps.
 
>> +		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;
>>  }


More information about the CRIU mailing list