[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: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
6d59e7f582
commit
1a60a28077
1 changed files with 4 additions and 4 deletions
|
@ -1091,20 +1091,20 @@ struct vfsmount *copy_tree(struct vfsmount *mnt, struct dentry *dentry,
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue