-----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEq1nRK9aeMoq1VSgcnJ2qBz9kQNkFAlvukbUACgkQnJ2qBz9k QNkJnggAriAyO72fH7nfh2AzvwnkqLi9uE4JQk+ZxQFW9W6a32Y+qIRBsaiau++w /lOVSGLCCVewzAa4b/lYPdyOS/yG4w6UuEsg5HQPux4JsOccalYudB5ONdeZGd/P 5FPxcsixDQQHP9mhz1gIn2wV7bbytH2DduIHxuKbJfX//xnO3jS/gnJq82rnxb4R IzqewVjbFiqYQKtyuzIqKqI3yOVqESJhyQ96j6chj5YKNUkMuwU9akhQGR4Zcqen /cxh+mK+ZzCybgu2Sfgx3noZb5RFYePpcSSpDG5OKJc04IY4m76fyHIi2flBE9AX HCN60y+VyKFOiNxzsSLXgsE9aj40OA== =UcJO -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
1ce80e0fe9
|
@ -115,12 +115,12 @@ static bool fanotify_should_send_event(struct fsnotify_iter_info *iter_info,
|
|||
continue;
|
||||
mark = iter_info->marks[type];
|
||||
/*
|
||||
* if the event is for a child and this inode doesn't care about
|
||||
* events on the child, don't send it!
|
||||
* If the event is for a child and this mark doesn't care about
|
||||
* events on a child, don't send it!
|
||||
*/
|
||||
if (type == FSNOTIFY_OBJ_TYPE_INODE &&
|
||||
(event_mask & FS_EVENT_ON_CHILD) &&
|
||||
!(mark->mask & FS_EVENT_ON_CHILD))
|
||||
if (event_mask & FS_EVENT_ON_CHILD &&
|
||||
(type != FSNOTIFY_OBJ_TYPE_INODE ||
|
||||
!(mark->mask & FS_EVENT_ON_CHILD)))
|
||||
continue;
|
||||
|
||||
marks_mask |= mark->mask;
|
||||
|
|
|
@ -167,9 +167,9 @@ int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask
|
|||
parent = dget_parent(dentry);
|
||||
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);
|
||||
else if (p_inode->i_fsnotify_mask & mask) {
|
||||
} else if (p_inode->i_fsnotify_mask & mask & ALL_FSNOTIFY_EVENTS) {
|
||||
struct name_snapshot name;
|
||||
|
||||
/* 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,
|
|||
sb = mnt->mnt.mnt_sb;
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue