diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-18 12:35:08 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-18 12:35:08 -0400 |
| commit | 145c3ae46b37993b0debb0b3da6256daea4a6ec5 (patch) | |
| tree | 0dbff382ce36b23b3d2dbff87d3eaab73a07a2a4 /fs/pnode.c | |
| parent | 81ca03a0e2ea0207b2df80e0edcf4c775c07a505 (diff) | |
| parent | 99b7db7b8ffd6bb755eb0a175596421a0b581cb2 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
fs: brlock vfsmount_lock
fs: scale files_lock
lglock: introduce special lglock and brlock spin locks
tty: fix fu_list abuse
fs: cleanup files_lock locking
fs: remove extra lookup in __lookup_hash
fs: fs_struct rwlock to spinlock
apparmor: use task path helpers
fs: dentry allocation consolidation
fs: fix do_lookup false negative
mbcache: Limit the maximum number of cache entries
hostfs ->follow_link() braino
hostfs: dumb (and usually harmless) tpyo - strncpy instead of strlcpy
remove SWRITE* I/O types
kill BH_Ordered flag
vfs: update ctime when changing the file's permission by setfacl
cramfs: only unlock new inodes
fix reiserfs_evict_inode end_writeback second call
Diffstat (limited to 'fs/pnode.c')
| -rw-r--r-- | fs/pnode.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/pnode.c b/fs/pnode.c index 5cc564a83149..8066b8dd748f 100644 --- a/fs/pnode.c +++ b/fs/pnode.c | |||
| @@ -126,6 +126,9 @@ static int do_make_slave(struct vfsmount *mnt) | |||
| 126 | return 0; | 126 | return 0; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | /* | ||
| 130 | * vfsmount lock must be held for write | ||
| 131 | */ | ||
| 129 | void change_mnt_propagation(struct vfsmount *mnt, int type) | 132 | void change_mnt_propagation(struct vfsmount *mnt, int type) |
| 130 | { | 133 | { |
| 131 | if (type == MS_SHARED) { | 134 | if (type == MS_SHARED) { |
| @@ -270,12 +273,12 @@ int propagate_mnt(struct vfsmount *dest_mnt, struct dentry *dest_dentry, | |||
| 270 | prev_src_mnt = child; | 273 | prev_src_mnt = child; |
| 271 | } | 274 | } |
| 272 | out: | 275 | out: |
| 273 | spin_lock(&vfsmount_lock); | 276 | br_write_lock(vfsmount_lock); |
| 274 | while (!list_empty(&tmp_list)) { | 277 | while (!list_empty(&tmp_list)) { |
| 275 | child = list_first_entry(&tmp_list, struct vfsmount, mnt_hash); | 278 | child = list_first_entry(&tmp_list, struct vfsmount, mnt_hash); |
| 276 | umount_tree(child, 0, &umount_list); | 279 | umount_tree(child, 0, &umount_list); |
| 277 | } | 280 | } |
| 278 | spin_unlock(&vfsmount_lock); | 281 | br_write_unlock(vfsmount_lock); |
| 279 | release_mounts(&umount_list); | 282 | release_mounts(&umount_list); |
| 280 | return ret; | 283 | return ret; |
| 281 | } | 284 | } |
| @@ -296,6 +299,8 @@ static inline int do_refcount_check(struct vfsmount *mnt, int count) | |||
| 296 | * other mounts its parent propagates to. | 299 | * other mounts its parent propagates to. |
| 297 | * Check if any of these mounts that **do not have submounts** | 300 | * Check if any of these mounts that **do not have submounts** |
| 298 | * have more references than 'refcnt'. If so return busy. | 301 | * have more references than 'refcnt'. If so return busy. |
| 302 | * | ||
| 303 | * vfsmount lock must be held for read or write | ||
| 299 | */ | 304 | */ |
| 300 | int propagate_mount_busy(struct vfsmount *mnt, int refcnt) | 305 | int propagate_mount_busy(struct vfsmount *mnt, int refcnt) |
| 301 | { | 306 | { |
| @@ -353,6 +358,8 @@ static void __propagate_umount(struct vfsmount *mnt) | |||
| 353 | * collect all mounts that receive propagation from the mount in @list, | 358 | * collect all mounts that receive propagation from the mount in @list, |
| 354 | * and return these additional mounts in the same list. | 359 | * and return these additional mounts in the same list. |
| 355 | * @list: the list of mounts to be unmounted. | 360 | * @list: the list of mounts to be unmounted. |
| 361 | * | ||
| 362 | * vfsmount lock must be held for write | ||
| 356 | */ | 363 | */ |
| 357 | int propagate_umount(struct list_head *list) | 364 | int propagate_umount(struct list_head *list) |
| 358 | { | 365 | { |
