Source
207
207
if (master->mnt_slave.next == &m->mnt_slave)
208
208
break;
209
209
m = master;
210
210
}
211
211
if (m == origin)
212
212
return NULL;
213
213
}
214
214
}
215
215
216
216
/* all accesses are serialized by namespace_sem */
217
-
static struct user_namespace *user_ns;
218
217
static struct mount *last_dest, *first_source, *last_source, *dest_master;
219
218
static struct mountpoint *mp;
220
219
static struct hlist_head *list;
221
220
222
221
static inline bool peers(struct mount *m1, struct mount *m2)
223
222
{
224
223
return m1->mnt_group_id == m2->mnt_group_id && m1->mnt_group_id;
225
224
}
226
225
227
226
static int propagate_one(struct mount *m)
253
252
break;
254
253
last_source = last_source->mnt_master;
255
254
} while (!done);
256
255
257
256
type = CL_SLAVE;
258
257
/* beginning of peer group among the slaves? */
259
258
if (IS_MNT_SHARED(m))
260
259
type |= CL_MAKE_SHARED;
261
260
}
262
261
263
-
/* Notice when we are propagating across user namespaces */
264
-
if (m->mnt_ns->user_ns != user_ns)
265
-
type |= CL_UNPRIVILEGED;
266
262
child = copy_tree(last_source, last_source->mnt.mnt_root, type);
267
263
if (IS_ERR(child))
268
264
return PTR_ERR(child);
269
265
child->mnt.mnt_flags &= ~MNT_LOCKED;
270
266
mnt_set_mountpoint(m, mp, child);
271
267
last_dest = m;
272
268
last_source = child;
273
269
if (m->mnt_master != dest_master) {
274
270
read_seqlock_excl(&mount_lock);
275
271
SET_MNT_MARK(m->mnt_master);
296
292
struct mount *source_mnt, struct hlist_head *tree_list)
297
293
{
298
294
struct mount *m, *n;
299
295
int ret = 0;
300
296
301
297
/*
302
298
* we don't want to bother passing tons of arguments to
303
299
* propagate_one(); everything is serialized by namespace_sem,
304
300
* so globals will do just fine.
305
301
*/
306
-
user_ns = current->nsproxy->mnt_ns->user_ns;
307
302
last_dest = dest_mnt;
308
303
first_source = source_mnt;
309
304
last_source = source_mnt;
310
305
mp = dest_mp;
311
306
list = tree_list;
312
307
dest_master = dest_mnt->mnt_master;
313
308
314
309
/* all peers of dest_mnt, except dest_mnt itself */
315
310
for (n = next_peer(dest_mnt); n != dest_mnt; n = next_peer(n)) {
316
311
ret = propagate_one(n);