[CRIU] [PATCH 1/2] mount: fix parent shared group dependency in can_mount_now

Andrew Vagin avagin at virtuozzo.com
Fri Oct 20 20:39:23 MSK 2017


Pls, provide a test for this fix.

On Fri, Oct 20, 2017 at 10:24:27AM +0300, Pavel Tikhomirov wrote:
> What we do before patch:
> 
> 1) If we are NOT in the same shared group - if we have some parent's
> shared group member unmounted, we just wait for it.
> 2) If we are in the same group - we wait only for members with root
> path len shorter than ours.
> 
> That is done to make child mount propagate in all shared group,
> but I think it is wrong, e.g.:
> 
> mkdir -p /dir/a/b/c /d /e /f
> mount --bind /dir/a /d
> mount --bind /dir/a/b /e
> mount --bind /f /e/c
> 
> Before c/r we have:
> 
> 507 114 182:1017985 / / rw,relatime shared:63 master:60 - ext4 /dev/ploop63624p1 rw,data=ordered,balloon_ino=12
> 144 507 182:1017985 /dir/a /d rw,relatime shared:63 master:60 - ext4 /dev/ploop63624p1 rw,data=ordered,balloon_ino=12
> 146 507 182:1017985 /dir/a/b /e rw,relatime shared:63 master:60 - ext4 /dev/ploop63624p1 rw,data=ordered,balloon_ino=12
> 148 146 182:1017985 /f /e/c rw,relatime shared:63 master:60 - ext4 /dev/ploop63624p1 rw,data=ordered,balloon_ino=12
> 150 507 182:1017985 /f /dir/a/b/c rw,relatime shared:63 master:60 - ext4 /dev/ploop63624p1 rw,data=ordered,balloon_ino=12
> 149 144 182:1017985 /f /d/b/c rw,relatime shared:63 master:60 - ext4 /dev/ploop63624p1 rw,data=ordered,balloon_ino=12
> 
> After c/r we have:
> 
> 600 132 182:1017985 / / rw,relatime shared:63 master:60 - ext4 /dev/ploop63624p1 rw,data=ordered,balloon_ino=12
> 602 600 182:1017985 /f /dir/a/b/c rw,relatime shared:63 master:60 - ext4 /dev/ploop63624p1 rw,data=ordered,balloon_ino=12
> 603 600 182:1017985 /dir/a /d rw,relatime shared:63 master:60 - ext4 /dev/ploop63624p1 rw,data=ordered,balloon_ino=12
> 604 600 182:1017985 /dir/a/b /e rw,relatime shared:63 master:60 - ext4 /dev/ploop63624p1 rw,data=ordered,balloon_ino=12
> 
> There is no propagation as all mounts are in same shared group and
> 602(150) has shorter root than 603(144) and 604(146).
> 
> What we should do:
> 
> Wait member of our parent's shared group only if it has our 'sibling'
> mount in it. Sibling mount is the one which had propagated to shared
> mount of our parent for us when we were mounted. We need to enforce
> propagation only for these case.
> 
> https://jira.sw.ru/browse/PSBM-69501
> Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
> ---
>  criu/mount.c | 31 ++++++++++++++++++++-----------
>  1 file changed, 20 insertions(+), 11 deletions(-)
> 
> diff --git a/criu/mount.c b/criu/mount.c
> index 22497f52e..f2487fcfb 100644
> --- a/criu/mount.c
> +++ b/criu/mount.c
> @@ -2133,18 +2133,27 @@ static bool can_mount_now(struct mount_info *mi)
>  
>  shared:
>  	if (mi->parent->shared_id) {
> -		struct mount_info *p = mi->parent, *n;
> +		struct mount_info *n;
>  
> -		if (mi->parent->shared_id == mi->shared_id) {
> -			int rlen = strlen(mi->root);
> -			list_for_each_entry(n, &p->mnt_share, mnt_share)
> -				if (strlen(n->root) < rlen && !n->mounted)
> -					return false;
> -		} else {
> -			list_for_each_entry(n, &p->mnt_share, mnt_share)
> -				if (!n->mounted)
> -					return false;
> -		}
> +		list_for_each_entry(n, &mi->parent->mnt_share, mnt_share)
> +			/*
> +			 * All mounts from mi's parent shared group which
> +			 * have mi's 'sibling' should receive it through
> +			 * mount propagation, so all such mounts in parent
> +			 * shared group should be mounted beforehand.
> +			 */
> +			if (!n->mounted) {
> +				char path[PATH_MAX], *mp;
> +				struct mount_info *c;
> +
> +				mp = mnt_get_sibling_path(mi, n, path, sizeof(path));
> +				if (mp == NULL)
> +					continue;
> +
> +				list_for_each_entry(c, &n->children, siblings)
> +					if (mounts_equal(mi, c) && !strcmp(mp, c->mountpoint))
> +						return false;
> +			}
>  	}
>  
>  	return true;
> -- 
> 2.13.5
> 


More information about the CRIU mailing list