On Tue, Feb 16, 2016 at 11:45:33AM -0800, Maxim Patlasov wrote: > propagate_one(m) calculates "type" argument for copy_tree() like this: > > > if (m->mnt_group_id == last_dest->mnt_group_id) { > > type = CL_MAKE_SHARED; > > } else { > > type = CL_SLAVE; > > if (IS_MNT_SHARED(m)) > > type |= CL_MAKE_SHARED; > > } > > The "type" argument then governs clone_mnt() behavior with respect to flags > and mnt_master of new mount. When we iterate through a slave group, it is > possible that both current "m" and "last_dest" are not shared (although, > both are slaves, i.e. have non-NULL mnt_master-s). Then the comparison > above erroneously makes new mount shared and sets its mnt_master to > last_source->mnt_master. The patch fixes the problem by handling zero > mnt_group_id-s as though they are unequal. > > The similar problem exists in the implementation of "else" clause above > when we have to ascend upward in the master/slave tree by calling: > > > last_source = last_source->mnt_master; > > last_dest = last_source->mnt_parent; > > proper number of times. The last step is governed by > "n->mnt_group_id != last_dest->mnt_group_id" condition that may lie if > both are zero. The patch fixes this case in the same way as the former one. > Acked-by: Andrei Vagin <avagin@xxxxxxxxxxxxx> > Signed-off-by: Maxim Patlasov <mpatlasov@xxxxxxxxxxxxx> > --- > fs/pnode.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/fs/pnode.c b/fs/pnode.c > index 6367e1e..abf156a 100644 > --- a/fs/pnode.c > +++ b/fs/pnode.c > @@ -212,7 +212,7 @@ static int propagate_one(struct mount *m) > /* skip if mountpoint isn't covered by it */ > if (!is_subdir(mp->m_dentry, m->mnt.mnt_root)) > return 0; > - if (m->mnt_group_id == last_dest->mnt_group_id) { > + if (m->mnt_group_id && m->mnt_group_id == last_dest->mnt_group_id) { > type = CL_MAKE_SHARED; > } else { > struct mount *n, *p; > @@ -223,7 +223,9 @@ static int propagate_one(struct mount *m) > last_source = last_source->mnt_master; > last_dest = last_source->mnt_parent; > } > - if (n->mnt_group_id != last_dest->mnt_group_id) { > + if (n->mnt_group_id != last_dest->mnt_group_id || > + (!n->mnt_group_id && > + !last_dest->mnt_group_id)) { > last_source = last_source->mnt_master; > last_dest = last_source->mnt_parent; > } > > _______________________________________________ > Devel mailing list > Devel@xxxxxxxxxx > https://lists.openvz.org/mailman/listinfo/devel -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html