ACK: [E][SRU][PATCHv2 1/1] fanotify: merge duplicate events on parent and child
Thadeu Lima de Souza Cascardo
cascardo at canonical.com
Wed May 20 10:34:55 UTC 2020
On Wed, May 20, 2020 at 03:59:43PM +0800, Po-Hsu Lin wrote:
> From: Amir Goldstein <amir73il at gmail.com>
>
> BugLink: https://bugs.launchpad.net/bugs/1878748
>
> With inotify, when a watch is set on a directory and on its child, an
> event on the child is reported twice, once with wd of the parent watch
> and once with wd of the child watch without the filename.
>
> With fanotify, when a watch is set on a directory and on its child, an
> event on the child is reported twice, but it has the exact same
> information - either an open file descriptor of the child or an encoded
> fid of the child.
>
> The reason that the two identical events are not merged is because the
> object id used for merging events in the queue is the child inode in one
> event and parent inode in the other.
>
> For events with path or dentry data, use the victim inode instead of the
> watched inode as the object id for event merging, so that the event
> reported on parent will be merged with the event reported on the child.
>
> Link: https://lore.kernel.org/r/20200319151022.31456-9-amir73il@gmail.com
> Signed-off-by: Amir Goldstein <amir73il at gmail.com>
> Signed-off-by: Jan Kara <jack at suse.cz>
> (backported from commit f367a62a7cad2447d835a9f14fc63997a9137246)
> [PHLin: backported with the same logic]
> Signed-off-by: Po-Hsu Lin <po-hsu.lin at canonical.com>
> ---
> fs/notify/fanotify/fanotify.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c
> index 5778d13..f1ca308 100644
> --- a/fs/notify/fanotify/fanotify.c
> +++ b/fs/notify/fanotify/fanotify.c
> @@ -314,7 +314,12 @@ struct fanotify_event *fanotify_alloc_event(struct fsnotify_group *group,
> if (!event)
> goto out;
> init: __maybe_unused
> - fsnotify_init_event(&event->fse, inode);
> + /*
> + * Use the victim inode instead of the watching inode as the id for
> + * event queue, so event reported on parent is merged with event
> + * reported on child when both directory and child watches exist.
> + */
> + fsnotify_init_event(&event->fse, (unsigned long)id);
> event->mask = mask;
> if (FAN_GROUP_FLAG(group, FAN_REPORT_TID))
> event->pid = get_pid(task_pid(current));
Though fsnotify_init_event expects an inode before commit
dfc2d2594e4a79204a3967585245f00644b8f838, id is an inode, and it is only used
for comparisons, as pointed out by that same commit.
As it has been tested, I am acking.
Acked-by: Thadeu Lima de Souza Cascardo <cascardo at canonical.com>
> --
> 2.7.4
>
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
More information about the kernel-team
mailing list