fsnotify: send all event types to super block marks
authorAmir Goldstein <amir73il@gmail.com>
Thu, 10 Jan 2019 17:04:30 +0000 (19:04 +0200)
committerJan Kara <jack@suse.cz>
Wed, 6 Feb 2019 14:20:30 +0000 (15:20 +0100)
So far, existence of super block marks was checked only on events with
data type FSNOTIFY_EVENT_PATH. Use the super block of the "to_tell" inode
to report the events of all event types to super block marks.

This change has no effect on current backends. Soon, this will allow
fanotify backend to receive all event types on a super block mark.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/notify/fsnotify.c

index ecf09b6..df06f3d 100644 (file)
@@ -328,16 +328,15 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
             const unsigned char *file_name, u32 cookie)
 {
        struct fsnotify_iter_info iter_info = {};
-       struct super_block *sb = NULL;
+       struct super_block *sb = to_tell->i_sb;
        struct mount *mnt = NULL;
-       __u32 mnt_or_sb_mask = 0;
+       __u32 mnt_or_sb_mask = sb->s_fsnotify_mask;
        int ret = 0;
        __u32 test_mask = (mask & ALL_FSNOTIFY_EVENTS);
 
        if (data_is == FSNOTIFY_EVENT_PATH) {
                mnt = real_mount(((const struct path *)data)->mnt);
-               sb = mnt->mnt.mnt_sb;
-               mnt_or_sb_mask = mnt->mnt_fsnotify_mask | sb->s_fsnotify_mask;
+               mnt_or_sb_mask |= mnt->mnt_fsnotify_mask;
        }
        /* An event "on child" is not intended for a mount/sb mark */
        if (mask & FS_EVENT_ON_CHILD)
@@ -350,8 +349,8 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
         * SRCU because we have no references to any objects and do not
         * need SRCU to keep them "alive".
         */
-       if (!to_tell->i_fsnotify_marks &&
-           (!mnt || (!mnt->mnt_fsnotify_marks && !sb->s_fsnotify_marks)))
+       if (!to_tell->i_fsnotify_marks && !sb->s_fsnotify_marks &&
+           (!mnt || !mnt->mnt_fsnotify_marks))
                return 0;
        /*
         * if this is a modify event we may need to clear the ignored masks
@@ -366,11 +365,11 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
 
        iter_info.marks[FSNOTIFY_OBJ_TYPE_INODE] =
                fsnotify_first_mark(&to_tell->i_fsnotify_marks);
+       iter_info.marks[FSNOTIFY_OBJ_TYPE_SB] =
+               fsnotify_first_mark(&sb->s_fsnotify_marks);
        if (mnt) {
                iter_info.marks[FSNOTIFY_OBJ_TYPE_VFSMOUNT] =
                        fsnotify_first_mark(&mnt->mnt_fsnotify_marks);
-               iter_info.marks[FSNOTIFY_OBJ_TYPE_SB] =
-                       fsnotify_first_mark(&sb->s_fsnotify_marks);
        }
 
        /*