aboutsummaryrefslogtreecommitdiffstats
path: root/fs/notify
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2010-10-28 17:21:58 -0400
committerEric Paris <eparis@redhat.com>2010-10-28 17:22:15 -0400
commite1c048ba786789afdc66f32d8394bb5a0014bbba (patch)
tree03a8ca0e2ca11d40f175442338ab6c75d772940c /fs/notify
parent4afeff8505cb8a38e36c1ef2bd3447c4b8f87367 (diff)
fanotify: do not send events for irregular files
fanotify_should_send_event has a test to see if an object is a file or directory and does not send an event otherwise. The problem is that the test is actually checking if the object with a mark is a file or directory, not if the object the event happened on is a file or directory. We should check the latter. Signed-off-by: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'fs/notify')
-rw-r--r--fs/notify/fanotify/fanotify.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c
index 60c11c306fd9..8d98e1f5817b 100644
--- a/fs/notify/fanotify/fanotify.c
+++ b/fs/notify/fanotify/fanotify.c
@@ -160,20 +160,21 @@ static bool fanotify_should_send_event(struct fsnotify_group *group,
160 __u32 event_mask, void *data, int data_type) 160 __u32 event_mask, void *data, int data_type)
161{ 161{
162 __u32 marks_mask, marks_ignored_mask; 162 __u32 marks_mask, marks_ignored_mask;
163 struct path *path = data;
163 164
164 pr_debug("%s: group=%p to_tell=%p inode_mark=%p vfsmnt_mark=%p " 165 pr_debug("%s: group=%p to_tell=%p inode_mark=%p vfsmnt_mark=%p "
165 "mask=%x data=%p data_type=%d\n", __func__, group, to_tell, 166 "mask=%x data=%p data_type=%d\n", __func__, group, to_tell,
166 inode_mark, vfsmnt_mark, event_mask, data, data_type); 167 inode_mark, vfsmnt_mark, event_mask, data, data_type);
167 168
168 /* sorry, fanotify only gives a damn about files and dirs */
169 if (!S_ISREG(to_tell->i_mode) &&
170 !S_ISDIR(to_tell->i_mode))
171 return false;
172
173 /* if we don't have enough info to send an event to userspace say no */ 169 /* if we don't have enough info to send an event to userspace say no */
174 if (data_type != FSNOTIFY_EVENT_PATH) 170 if (data_type != FSNOTIFY_EVENT_PATH)
175 return false; 171 return false;
176 172
173 /* sorry, fanotify only gives a damn about files and dirs */
174 if (!S_ISREG(path->dentry->d_inode->i_mode) &&
175 !S_ISDIR(path->dentry->d_inode->i_mode))
176 return false;
177
177 if (inode_mark && vfsmnt_mark) { 178 if (inode_mark && vfsmnt_mark) {
178 marks_mask = (vfsmnt_mark->mask | inode_mark->mask); 179 marks_mask = (vfsmnt_mark->mask | inode_mark->mask);
179 marks_ignored_mask = (vfsmnt_mark->ignored_mask | inode_mark->ignored_mask); 180 marks_ignored_mask = (vfsmnt_mark->ignored_mask | inode_mark->ignored_mask);