Commit 1a60a280 authored by Al Viro's avatar Al Viro

[PATCH] lock exclusively in collect_mounts() and drop_collected_mounts()

Taking namespace_sem shared there isn't worth the trouble, especially with
vfsmount ID allocation about to be added.  That way we know that umount_tree(),
copy_tree() and clone_mnt() are _always_ serialized by namespace_sem.
umount_tree() still needs vfsmount_lock (it manipulates hash chains, among
other things), but that's a separate story.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 6d59e7f5
...@@ -1091,20 +1091,20 @@ Enomem: ...@@ -1091,20 +1091,20 @@ Enomem:
struct vfsmount *collect_mounts(struct vfsmount *mnt, struct dentry *dentry) struct vfsmount *collect_mounts(struct vfsmount *mnt, struct dentry *dentry)
{ {
struct vfsmount *tree; struct vfsmount *tree;
down_read(&namespace_sem); down_write(&namespace_sem);
tree = copy_tree(mnt, dentry, CL_COPY_ALL | CL_PRIVATE); tree = copy_tree(mnt, dentry, CL_COPY_ALL | CL_PRIVATE);
up_read(&namespace_sem); up_write(&namespace_sem);
return tree; return tree;
} }
void drop_collected_mounts(struct vfsmount *mnt) void drop_collected_mounts(struct vfsmount *mnt)
{ {
LIST_HEAD(umount_list); LIST_HEAD(umount_list);
down_read(&namespace_sem); down_write(&namespace_sem);
spin_lock(&vfsmount_lock); spin_lock(&vfsmount_lock);
umount_tree(mnt, 0, &umount_list); umount_tree(mnt, 0, &umount_list);
spin_unlock(&vfsmount_lock); spin_unlock(&vfsmount_lock);
up_read(&namespace_sem); up_write(&namespace_sem);
release_mounts(&umount_list); release_mounts(&umount_list);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment