231 int ret = 0;
232 struct vfsmount *prev_dest_mnt = dest_mnt;
233 struct vfsmount *prev_src_mnt = source_mnt;
234 LIST_HEAD(tmp_list);
235 LIST_HEAD(umount_list);
236
237 for (m = propagation_next(dest_mnt, dest_mnt); m;
238 m = propagation_next(m, dest_mnt)) {
239 int type;
240 struct vfsmount *source;
241
242 if (IS_MNT_NEW(m))
243 continue;
244
245 source = get_source(m, prev_dest_mnt, prev_src_mnt, &type);
246
247 if (!(child = copy_tree(source, source->mnt_root, type))) {
248 ret = -ENOMEM;
249 list_splice(tree_list, tmp_list.prev);
250 goto out;
251 }
252
253 if (is_subdir(dest_dentry, m->mnt_root)) {
254 mnt_set_mountpoint(m, dest_dentry, child);
255 list_add_tail(&child->mnt_hash, tree_list);
256 } else {
257
258
259
260
261 list_add_tail(&child->mnt_hash, &tmp_list);
262 }
263 prev_dest_mnt = m;
264 prev_src_mnt = child;
265 }
266out:
267 spin_lock(&vfsmount_lock);
268 while (!list_empty(&tmp_list)) {
269 child = list_first_entry(&tmp_list, struct vfsmount, mnt_hash);
270 umount_tree(child, 0, &umount_list);
271 }