[E][SRU][PATCH 1/1] fanotify: merge duplicate events on parent and child

Stefan Bader stefan.bader at canonical.com
Wed May 20 07:41:15 UTC 2020


On 20.05.20 09:32, Po-Hsu Lin wrote:
> From: Amir Goldstein <amir73il at gmail.com>
> 
> 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>
> ---

I can see no BugLink in there or the cover email.

-Stefan

>  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));
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20200520/146d101f/attachment.sig>


More information about the kernel-team mailing list