[CRIU] [PATCH] mounts: Skip already bound siblings in propagate_siblings()

Andrew Vagin avagin at virtuozzo.com
Fri Feb 12 10:01:47 PST 2016


On Wed, Feb 10, 2016 at 02:58:37PM +0300, Kirill Tkhai wrote:
> This function may be called several times for a mnt_share family.
> The second call with a mi, which was not a bind source during the
> first call, leads to double dependence:
> 
> a <-> b <-> c
> 
> 1)propagate_siblings(a)
> 
> b->bind = a;
> c->bind = a;
> 
> 2)propagate_siblings(b)
> 
> c->bind = b;
> (a is not set, because its mounted is 1).
> 
> So during c's bind mount criu use b's root and refers to a wrong
> directory.
> 
> The reproduction: mntns_root_bind and bind-mount test together.
> 
> The patch fixes the problem.
>

Acked-by: Andrew Vagin <avagin at virtuozzo.com>

> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
>  mount.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/mount.c b/mount.c
> index 05cf6cf..bf07133 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -2118,7 +2118,7 @@ static int propagate_siblings(struct mount_info *mi)
>  	 * to inherite shared group or master id
>  	 */
>  	list_for_each_entry(t, &mi->mnt_share, mnt_share) {
> -		if (t->mounted)
> +		if (t->mounted || t->bind)
>  			continue;
>  		pr_debug("\t\tBind share %s\n", t->mountpoint);
>  		t->bind = mi;
> @@ -2126,7 +2126,7 @@ static int propagate_siblings(struct mount_info *mi)
>  	}
>  
>  	list_for_each_entry(t, &mi->mnt_slave_list, mnt_slave) {
> -		if (t->mounted)
> +		if (t->mounted || t->bind)
>  			continue;
>  		pr_debug("\t\tBind slave %s\n", t->mountpoint);
>  		t->bind = mi;
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list