@@ -338,6 +338,9 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
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;
+ } else if (data_is == FSNOTIFY_EVENT_DENTRY) {
+ sb = ((const struct dentry *)data)->d_sb;
+ mnt_or_sb_mask = sb->s_fsnotify_mask;
}
/* An event "on child" is not intended for a mount/sb mark */
if (mask & FS_EVENT_ON_CHILD)
@@ -350,8 +353,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 && (!mnt || !mnt->mnt_fsnotify_marks) &&
+ (!sb || !sb->s_fsnotify_marks))
return 0;
/*
* if this is a modify event we may need to clear the ignored masks
@@ -369,6 +372,8 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
if (mnt) {
iter_info.marks[FSNOTIFY_OBJ_TYPE_VFSMOUNT] =
fsnotify_first_mark(&mnt->mnt_fsnotify_marks);
+ }
+ if (sb) {
iter_info.marks[FSNOTIFY_OBJ_TYPE_SB] =
fsnotify_first_mark(&sb->s_fsnotify_marks);
}
So far, existence of super block marks could be checked only on events with data type FSNOTIFY_EVENT_PATH. Use d_sb field of dentry from events with data type FSNOTIFY_EVENT_DENTRY to send event on super block mark. This change has no effect on current backends. Soon, this will allow fanotify backend to receive dentry events on a super block mark. Signed-off-by: Amir Goldstein <amir73il@gmail.com> --- fs/notify/fsnotify.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)