|
@@ -92,7 +92,7 @@ static bool fanotify_should_send_event(struct fsnotify_mark *inode_mark,
|
|
|
u32 event_mask,
|
|
|
const void *data, int data_type)
|
|
|
{
|
|
|
- __u32 marks_mask, marks_ignored_mask;
|
|
|
+ __u32 marks_mask = 0, marks_ignored_mask = 0;
|
|
|
const struct path *path = data;
|
|
|
|
|
|
pr_debug("%s: inode_mark=%p vfsmnt_mark=%p mask=%x data=%p"
|
|
@@ -108,24 +108,20 @@ static bool fanotify_should_send_event(struct fsnotify_mark *inode_mark,
|
|
|
!d_can_lookup(path->dentry))
|
|
|
return false;
|
|
|
|
|
|
- if (inode_mark && vfsmnt_mark) {
|
|
|
- marks_mask = (vfsmnt_mark->mask | inode_mark->mask);
|
|
|
- marks_ignored_mask = (vfsmnt_mark->ignored_mask | inode_mark->ignored_mask);
|
|
|
- } else if (inode_mark) {
|
|
|
- /*
|
|
|
- * if the event is for a child and this inode doesn't care about
|
|
|
- * events on the child, don't send it!
|
|
|
- */
|
|
|
- if ((event_mask & FS_EVENT_ON_CHILD) &&
|
|
|
- !(inode_mark->mask & FS_EVENT_ON_CHILD))
|
|
|
- return false;
|
|
|
- marks_mask = inode_mark->mask;
|
|
|
- marks_ignored_mask = inode_mark->ignored_mask;
|
|
|
- } else if (vfsmnt_mark) {
|
|
|
- marks_mask = vfsmnt_mark->mask;
|
|
|
- marks_ignored_mask = vfsmnt_mark->ignored_mask;
|
|
|
- } else {
|
|
|
- BUG();
|
|
|
+ /*
|
|
|
+ * if the event is for a child and this inode doesn't care about
|
|
|
+ * events on the child, don't send it!
|
|
|
+ */
|
|
|
+ if (inode_mark &&
|
|
|
+ (!(event_mask & FS_EVENT_ON_CHILD) ||
|
|
|
+ (inode_mark->mask & FS_EVENT_ON_CHILD))) {
|
|
|
+ marks_mask |= inode_mark->mask;
|
|
|
+ marks_ignored_mask |= inode_mark->ignored_mask;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (vfsmnt_mark) {
|
|
|
+ marks_mask |= vfsmnt_mark->mask;
|
|
|
+ marks_ignored_mask |= vfsmnt_mark->ignored_mask;
|
|
|
}
|
|
|
|
|
|
if (d_is_dir(path->dentry) &&
|