[CRIU] [PATCH] mounts: Skip already bound siblings in propagate_siblings()
Kirill Tkhai
ktkhai at virtuozzo.com
Fri Feb 12 04:55:17 PST 2016
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?
>> 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