diff options
Diffstat (limited to 'fs/notify')
-rw-r--r-- | fs/notify/fanotify/fanotify.c | 10 | ||||
-rw-r--r-- | fs/notify/fsnotify.c | 7 |
2 files changed, 10 insertions, 7 deletions
diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index 5769cf3ff035..e08a6647267b 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c | |||
@@ -115,12 +115,12 @@ static bool fanotify_should_send_event(struct fsnotify_iter_info *iter_info, | |||
115 | continue; | 115 | continue; |
116 | mark = iter_info->marks[type]; | 116 | mark = iter_info->marks[type]; |
117 | /* | 117 | /* |
118 | * if the event is for a child and this inode doesn't care about | 118 | * If the event is for a child and this mark doesn't care about |
119 | * events on the child, don't send it! | 119 | * events on a child, don't send it! |
120 | */ | 120 | */ |
121 | if (type == FSNOTIFY_OBJ_TYPE_INODE && | 121 | if (event_mask & FS_EVENT_ON_CHILD && |
122 | (event_mask & FS_EVENT_ON_CHILD) && | 122 | (type != FSNOTIFY_OBJ_TYPE_INODE || |
123 | !(mark->mask & FS_EVENT_ON_CHILD)) | 123 | !(mark->mask & FS_EVENT_ON_CHILD))) |
124 | continue; | 124 | continue; |
125 | 125 | ||
126 | marks_mask |= mark->mask; | 126 | marks_mask |= mark->mask; |
diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c index 2172ba516c61..d2c34900ae05 100644 --- a/fs/notify/fsnotify.c +++ b/fs/notify/fsnotify.c | |||
@@ -167,9 +167,9 @@ int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask | |||
167 | parent = dget_parent(dentry); | 167 | parent = dget_parent(dentry); |
168 | p_inode = parent->d_inode; | 168 | p_inode = parent->d_inode; |
169 | 169 | ||
170 | if (unlikely(!fsnotify_inode_watches_children(p_inode))) | 170 | if (unlikely(!fsnotify_inode_watches_children(p_inode))) { |
171 | __fsnotify_update_child_dentry_flags(p_inode); | 171 | __fsnotify_update_child_dentry_flags(p_inode); |
172 | else if (p_inode->i_fsnotify_mask & mask) { | 172 | } else if (p_inode->i_fsnotify_mask & mask & ALL_FSNOTIFY_EVENTS) { |
173 | struct name_snapshot name; | 173 | struct name_snapshot name; |
174 | 174 | ||
175 | /* we are notifying a parent so come up with the new mask which | 175 | /* we are notifying a parent so come up with the new mask which |
@@ -339,6 +339,9 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is, | |||
339 | sb = mnt->mnt.mnt_sb; | 339 | sb = mnt->mnt.mnt_sb; |
340 | mnt_or_sb_mask = mnt->mnt_fsnotify_mask | sb->s_fsnotify_mask; | 340 | mnt_or_sb_mask = mnt->mnt_fsnotify_mask | sb->s_fsnotify_mask; |
341 | } | 341 | } |
342 | /* An event "on child" is not intended for a mount/sb mark */ | ||
343 | if (mask & FS_EVENT_ON_CHILD) | ||
344 | mnt_or_sb_mask = 0; | ||
342 | 345 | ||
343 | /* | 346 | /* |
344 | * Optimization: srcu_read_lock() has a memory barrier which can | 347 | * Optimization: srcu_read_lock() has a memory barrier which can |