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

Pavel Emelyanov xemul at virtuozzo.com
Fri Feb 12 05:32:53 PST 2016


On 02/12/2016 03:55 PM, Kirill Tkhai wrote:
> 
> 
> On 12.02.2016 15:13, Pavel Emelyanov wrote:
>> On 02/10/2016 02:58 PM, 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.
>>
>> Add test to zdtm that fails w/o this patch and passes with it.
> 
> A test on practice will differ to the mntns_root_bind test with one more mount() call only.
> 
> Are you OK if I modify mntns_root_bind instead?

Not modify, but extend. See how e.g. mntns_shared_bind.c and
mntns_shared_bind02.c are implemented.

>>> The patch fixes the problem.
>>>
>>> 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