aboutsummaryrefslogtreecommitdiffstats
path: root/fs/notify/fsnotify.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/notify/fsnotify.c')
-rw-r--r--fs/notify/fsnotify.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c
index f11d75f02368..ec2f7bd76818 100644
--- a/fs/notify/fsnotify.c
+++ b/fs/notify/fsnotify.c
@@ -137,14 +137,16 @@ void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, const
137 struct fsnotify_group *group; 137 struct fsnotify_group *group;
138 struct fsnotify_event *event = NULL; 138 struct fsnotify_event *event = NULL;
139 int idx; 139 int idx;
140 /* global tests shouldn't care about events on child only the specific event */
141 __u32 test_mask = (mask & ~FS_EVENT_ON_CHILD);
140 142
141 if (list_empty(&fsnotify_groups)) 143 if (list_empty(&fsnotify_groups))
142 return; 144 return;
143 145
144 if (!(mask & fsnotify_mask)) 146 if (!(test_mask & fsnotify_mask))
145 return; 147 return;
146 148
147 if (!(mask & to_tell->i_fsnotify_mask)) 149 if (!(test_mask & to_tell->i_fsnotify_mask))
148 return; 150 return;
149 /* 151 /*
150 * SRCU!! the groups list is very very much read only and the path is 152 * SRCU!! the groups list is very very much read only and the path is
@@ -153,7 +155,7 @@ void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, const
153 */ 155 */
154 idx = srcu_read_lock(&fsnotify_grp_srcu); 156 idx = srcu_read_lock(&fsnotify_grp_srcu);
155 list_for_each_entry_rcu(group, &fsnotify_groups, group_list) { 157 list_for_each_entry_rcu(group, &fsnotify_groups, group_list) {
156 if (mask & group->mask) { 158 if (test_mask & group->mask) {
157 if (!group->ops->should_send_event(group, to_tell, mask)) 159 if (!group->ops->should_send_event(group, to_tell, mask))
158 continue; 160 continue;
159 if (!event) { 161 if (!event) {