fanotify: report events with parent dir fid to sb/mount/non-dir marks
authorAmir Goldstein <amir73il@gmail.com>
Thu, 16 Jul 2020 08:42:27 +0000 (11:42 +0300)
committerJan Kara <jack@suse.cz>
Mon, 27 Jul 2020 21:24:00 +0000 (23:24 +0200)
In a group with flag FAN_REPORT_DIR_FID, when adding an inode mark with
FAN_EVENT_ON_CHILD, events on non-directory children are reported with
the fid of the parent.

When adding a filesystem or mount mark or mark on a non-dir inode, we
want to report events that are "possible on child" (e.g. open/close)
also with fid of the parent, as if the victim inode's parent is
interested in events "on child".

Some events, currently only FAN_MOVE_SELF, should be reported to a
sb/mount/non-dir mark with parent fid even though they are not
reported to a watching parent.

To get the desired behavior we set the flag FAN_EVENT_ON_CHILD on
all the sb/mount/non-dir mark masks in a group with FAN_REPORT_DIR_FID.

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

index e494400..7caa64d 100644 (file)
@@ -1220,6 +1220,13 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask,
        if (mnt || !S_ISDIR(inode->i_mode)) {
                mask &= ~FAN_EVENT_ON_CHILD;
                umask = FAN_EVENT_ON_CHILD;
+               /*
+                * If group needs to report parent fid, register for getting
+                * events with parent/name info for non-directory.
+                */
+               if ((fid_mode & FAN_REPORT_DIR_FID) &&
+                   (flags & FAN_MARK_ADD) && !ignored)
+                       mask |= FAN_EVENT_ON_CHILD;
        }
 
        /* create/update an inode mark */