Commit 1ce80e0f authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'fsnotify_for_v4.20-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs

Pull fsnotify fix from Jan Kara:
 "One small fsnotify fix for duplicate events"

* tag 'fsnotify_for_v4.20-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
  fanotify: fix handling of events on child sub-directory
parents e6a2562f b469e7e4
...@@ -115,12 +115,12 @@ static bool fanotify_should_send_event(struct fsnotify_iter_info *iter_info, ...@@ -115,12 +115,12 @@ static bool fanotify_should_send_event(struct fsnotify_iter_info *iter_info,
continue; continue;
mark = iter_info->marks[type]; mark = iter_info->marks[type];
/* /*
* if the event is for a child and this inode doesn't care about * If the event is for a child and this mark doesn't care about
* events on the child, don't send it! * events on a child, don't send it!
*/ */
if (type == FSNOTIFY_OBJ_TYPE_INODE && if (event_mask & FS_EVENT_ON_CHILD &&
(event_mask & FS_EVENT_ON_CHILD) && (type != FSNOTIFY_OBJ_TYPE_INODE ||
!(mark->mask & FS_EVENT_ON_CHILD)) !(mark->mask & FS_EVENT_ON_CHILD)))
continue; continue;
marks_mask |= mark->mask; marks_mask |= mark->mask;
......
...@@ -167,9 +167,9 @@ int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask ...@@ -167,9 +167,9 @@ int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask
parent = dget_parent(dentry); parent = dget_parent(dentry);
p_inode = parent->d_inode; p_inode = parent->d_inode;
if (unlikely(!fsnotify_inode_watches_children(p_inode))) if (unlikely(!fsnotify_inode_watches_children(p_inode))) {
__fsnotify_update_child_dentry_flags(p_inode); __fsnotify_update_child_dentry_flags(p_inode);
else if (p_inode->i_fsnotify_mask & mask) { } else if (p_inode->i_fsnotify_mask & mask & ALL_FSNOTIFY_EVENTS) {
struct name_snapshot name; struct name_snapshot name;
/* we are notifying a parent so come up with the new mask which /* 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,6 +339,9 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
sb = mnt->mnt.mnt_sb; sb = mnt->mnt.mnt_sb;
mnt_or_sb_mask = mnt->mnt_fsnotify_mask | sb->s_fsnotify_mask; mnt_or_sb_mask = mnt->mnt_fsnotify_mask | sb->s_fsnotify_mask;
} }
/* An event "on child" is not intended for a mount/sb mark */
if (mask & FS_EVENT_ON_CHILD)
mnt_or_sb_mask = 0;
/* /*
* Optimization: srcu_read_lock() has a memory barrier which can * Optimization: srcu_read_lock() has a memory barrier which can
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment