Patch "fanotify: merge duplicate events on parent and child" has been added to the 5.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    fanotify: merge duplicate events on parent and child

to the 5.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     fanotify-merge-duplicate-events-on-parent-and-child.patch
and it can be found in the queue-5.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit d301556142fe790ee058083d2672b8415ac9d2f2
Author: Amir Goldstein <amir73il@xxxxxxxxx>
Date:   Thu Mar 19 17:10:16 2020 +0200

    fanotify: merge duplicate events on parent and child
    
    [ Upstream commit f367a62a7cad2447d835a9f14fc63997a9137246 ]
    
    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@xxxxxxxxx
    Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx>
    Signed-off-by: Jan Kara <jack@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c
index 14d0ac4664595..f5d30573f4a99 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, (unsigned long)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));



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux