diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-07 11:56:33 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-07 11:56:33 -0500 |
commit | b4a45f5fe8078bfc10837dbd5b98735058bc4698 (patch) | |
tree | df6f13a27610a3ec7eb4a661448cd779a8f84c79 /fs/notify/fsnotify.c | |
parent | 01539ba2a706ab7d35fc0667dff919ade7f87d63 (diff) | |
parent | b3e19d924b6eaf2ca7d22cba99a517c5171007b6 (diff) |
Merge branch 'vfs-scale-working' of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin
* 'vfs-scale-working' of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin: (57 commits)
fs: scale mntget/mntput
fs: rename vfsmount counter helpers
fs: implement faster dentry memcmp
fs: prefetch inode data in dcache lookup
fs: improve scalability of pseudo filesystems
fs: dcache per-inode inode alias locking
fs: dcache per-bucket dcache hash locking
bit_spinlock: add required includes
kernel: add bl_list
xfs: provide simple rcu-walk ACL implementation
btrfs: provide simple rcu-walk ACL implementation
ext2,3,4: provide simple rcu-walk ACL implementation
fs: provide simple rcu-walk generic_check_acl implementation
fs: provide rcu-walk aware permission i_ops
fs: rcu-walk aware d_revalidate method
fs: cache optimise dentry and inode for rcu-walk
fs: dcache reduce branches in lookup path
fs: dcache remove d_mounted
fs: fs_struct use seqlock
fs: rcu-walk for path lookup
...
Diffstat (limited to 'fs/notify/fsnotify.c')
-rw-r--r-- | fs/notify/fsnotify.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c index 20dc218707ca..79b47cbb5cd8 100644 --- a/fs/notify/fsnotify.c +++ b/fs/notify/fsnotify.c | |||
@@ -59,7 +59,7 @@ void __fsnotify_update_child_dentry_flags(struct inode *inode) | |||
59 | /* determine if the children should tell inode about their events */ | 59 | /* determine if the children should tell inode about their events */ |
60 | watched = fsnotify_inode_watches_children(inode); | 60 | watched = fsnotify_inode_watches_children(inode); |
61 | 61 | ||
62 | spin_lock(&dcache_lock); | 62 | spin_lock(&inode->i_lock); |
63 | /* run all of the dentries associated with this inode. Since this is a | 63 | /* run all of the dentries associated with this inode. Since this is a |
64 | * directory, there damn well better only be one item on this list */ | 64 | * directory, there damn well better only be one item on this list */ |
65 | list_for_each_entry(alias, &inode->i_dentry, d_alias) { | 65 | list_for_each_entry(alias, &inode->i_dentry, d_alias) { |
@@ -68,19 +68,21 @@ void __fsnotify_update_child_dentry_flags(struct inode *inode) | |||
68 | /* run all of the children of the original inode and fix their | 68 | /* run all of the children of the original inode and fix their |
69 | * d_flags to indicate parental interest (their parent is the | 69 | * d_flags to indicate parental interest (their parent is the |
70 | * original inode) */ | 70 | * original inode) */ |
71 | spin_lock(&alias->d_lock); | ||
71 | list_for_each_entry(child, &alias->d_subdirs, d_u.d_child) { | 72 | list_for_each_entry(child, &alias->d_subdirs, d_u.d_child) { |
72 | if (!child->d_inode) | 73 | if (!child->d_inode) |
73 | continue; | 74 | continue; |
74 | 75 | ||
75 | spin_lock(&child->d_lock); | 76 | spin_lock_nested(&child->d_lock, DENTRY_D_LOCK_NESTED); |
76 | if (watched) | 77 | if (watched) |
77 | child->d_flags |= DCACHE_FSNOTIFY_PARENT_WATCHED; | 78 | child->d_flags |= DCACHE_FSNOTIFY_PARENT_WATCHED; |
78 | else | 79 | else |
79 | child->d_flags &= ~DCACHE_FSNOTIFY_PARENT_WATCHED; | 80 | child->d_flags &= ~DCACHE_FSNOTIFY_PARENT_WATCHED; |
80 | spin_unlock(&child->d_lock); | 81 | spin_unlock(&child->d_lock); |
81 | } | 82 | } |
83 | spin_unlock(&alias->d_lock); | ||
82 | } | 84 | } |
83 | spin_unlock(&dcache_lock); | 85 | spin_unlock(&inode->i_lock); |
84 | } | 86 | } |
85 | 87 | ||
86 | /* Notify this dentry's parent about a child's events. */ | 88 | /* Notify this dentry's parent about a child's events. */ |