--- x/fs/namespace.c +++ y/fs/namespace.c @@ -4126,6 +4126,7 @@ static int do_mount_setattr(struct path { struct mount *mnt = real_mount(path->mnt); int err = 0; + int changed = 0; if (path->dentry != mnt->mnt.mnt_root) return -EINVAL; @@ -4146,11 +4147,14 @@ static int do_mount_setattr(struct path */ namespace_lock(); if (kattr->propagation == MS_SHARED) { + int old = mnt->mnt_group_id; err = invent_group_ids(mnt, kattr->recurse); if (err) { namespace_unlock(); return err; } + if (old != mnt->mnt_group_id) + changed = 1; } } @@ -4184,7 +4188,7 @@ out: if (kattr->propagation) { namespace_unlock(); - if (err) + if (err && changed) cleanup_group_ids(mnt, NULL); }