fanotify: generalize the handling of extra event flags
authorAmir Goldstein <amir73il@gmail.com>
Thu, 16 Jul 2020 08:42:09 +0000 (11:42 +0300)
committerJan Kara <jack@suse.cz>
Mon, 27 Jul 2020 19:23:36 +0000 (21:23 +0200)
In fanotify_group_event_mask() there is logic in place to make sure we
are not going to handle an event with no type and just FAN_ONDIR flag.
Generalize this logic to any FANOTIFY_EVENT_FLAGS.

There is only one more flag in this group at the moment -
FAN_EVENT_ON_CHILD. We never report it to user, but we do pass it in to
fanotify_alloc_event() when group is reporting fid as indication that
event happened on child. We will have use for this indication later on.

Link: https://lore.kernel.org/r/20200716084230.30611-2-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 e6ba605..110835a 100644 (file)
@@ -211,7 +211,8 @@ static u32 fanotify_group_event_mask(struct fsnotify_group *group,
                                     int data_type)
 {
        __u32 marks_mask = 0, marks_ignored_mask = 0;
-       __u32 test_mask, user_mask = FANOTIFY_OUTGOING_EVENTS;
+       __u32 test_mask, user_mask = FANOTIFY_OUTGOING_EVENTS |
+                                    FANOTIFY_EVENT_FLAGS;
        const struct path *path = fsnotify_data_path(data, data_type);
        struct fsnotify_mark *mark;
        int type;
@@ -264,14 +265,18 @@ static u32 fanotify_group_event_mask(struct fsnotify_group *group,
         *
         * For backward compatibility and consistency, do not report FAN_ONDIR
         * to user in legacy fanotify mode (reporting fd) and report FAN_ONDIR
-        * to user in FAN_REPORT_FID mode for all event types.
+        * to user in fid mode for all event types.
+        *
+        * We never report FAN_EVENT_ON_CHILD to user, but we do pass it in to
+        * fanotify_alloc_event() when group is reporting fid as indication
+        * that event happened on child.
         */
        if (FAN_GROUP_FLAG(group, FAN_REPORT_FID)) {
-               /* Do not report FAN_ONDIR without any event */
-               if (!(test_mask & ~FAN_ONDIR))
+               /* Do not report event flags without any event */
+               if (!(test_mask & ~FANOTIFY_EVENT_FLAGS))
                        return 0;
        } else {
-               user_mask &= ~FAN_ONDIR;
+               user_mask &= ~FANOTIFY_EVENT_FLAGS;
        }
 
        return test_mask & user_mask;