fanotify: generalize merge logic of events on dir
authorAmir Goldstein <amir73il@gmail.com>
Thu, 16 Jul 2020 08:42:10 +0000 (11:42 +0300)
committerJan Kara <jack@suse.cz>
Mon, 27 Jul 2020 19:23:36 +0000 (21:23 +0200)
An event on directory should never be merged with an event on
non-directory regardless of the event struct type.

This change has no visible effect, because currently, with struct
fanotify_path_event, the relevant events will not be merged because
event path of dir will be different than event path of non-dir.

Link: https://lore.kernel.org/r/20200716084230.30611-3-amir73il@gmail.com
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/notify/fanotify/fanotify.c

index 110835a..84c86a4 100644 (file)
@@ -83,22 +83,22 @@ static bool fanotify_should_merge(struct fsnotify_event *old_fsn,
            old->type != new->type || old->pid != new->pid)
                return false;
 
+       /*
+        * We want to merge many dirent events in the same dir (i.e.
+        * creates/unlinks/renames), but we do not want to merge dirent
+        * events referring to subdirs with dirent events referring to
+        * non subdirs, otherwise, user won't be able to tell from a
+        * mask FAN_CREATE|FAN_DELETE|FAN_ONDIR if it describes mkdir+
+        * unlink pair or rmdir+create pair of events.
+        */
+       if ((old->mask & FS_ISDIR) != (new->mask & FS_ISDIR))
+               return false;
+
        switch (old->type) {
        case FANOTIFY_EVENT_TYPE_PATH:
                return fanotify_path_equal(fanotify_event_path(old),
                                           fanotify_event_path(new));
        case FANOTIFY_EVENT_TYPE_FID:
-               /*
-                * We want to merge many dirent events in the same dir (i.e.
-                * creates/unlinks/renames), but we do not want to merge dirent
-                * events referring to subdirs with dirent events referring to
-                * non subdirs, otherwise, user won't be able to tell from a
-                * mask FAN_CREATE|FAN_DELETE|FAN_ONDIR if it describes mkdir+
-                * unlink pair or rmdir+create pair of events.
-                */
-               if ((old->mask & FS_ISDIR) != (new->mask & FS_ISDIR))
-                       return false;
-
                return fanotify_fid_event_equal(FANOTIFY_FE(old),
                                                FANOTIFY_FE(new));
        case FANOTIFY_EVENT_TYPE_FID_NAME: