]> err.no Git - linux-2.6/commitdiff
[PATCH] lock exclusively in collect_mounts() and drop_collected_mounts()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 22 Mar 2008 20:19:49 +0000 (16:19 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 22 Apr 2008 03:11:09 +0000 (23:11 -0400)
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>
fs/namespace.c

index 678f7ce060f2d69addc3af5110f6048b322dead7..af2fb3707d0ac93e4a5c18f142c2424299a610a4 100644 (file)
@@ -1091,20 +1091,20 @@ Enomem:
 struct vfsmount *collect_mounts(struct vfsmount *mnt, struct dentry *dentry)
 {
        struct vfsmount *tree;
-       down_read(&namespace_sem);
+       down_write(&namespace_sem);
        tree = copy_tree(mnt, dentry, CL_COPY_ALL | CL_PRIVATE);
-       up_read(&namespace_sem);
+       up_write(&namespace_sem);
        return tree;
 }
 
 void drop_collected_mounts(struct vfsmount *mnt)
 {
        LIST_HEAD(umount_list);
-       down_read(&namespace_sem);
+       down_write(&namespace_sem);
        spin_lock(&vfsmount_lock);
        umount_tree(mnt, 0, &umount_list);
        spin_unlock(&vfsmount_lock);
-       up_read(&namespace_sem);
+       up_write(&namespace_sem);
        release_mounts(&umount_list);
 }