[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