On Thu, Feb 7, 2019 at 5:18 PM Jan Kara <jack@xxxxxxx> wrote: > > On Thu 10-01-19 19:04:42, Amir Goldstein wrote: > > When event data type is FSNOTIFY_EVENT_INODE, we don't have a refernece > > to the mount, so we will not be able to open a file descriptor when user > > reads the event. However, if the listener has enabled reporting file > > identifier with the FAN_REPORT_FID init flag, we allow reporting those > > events and we use an identifier inode to encode fid. > > > > The inode to use as identifier when reporting fid depends on the event. > > For dirent modification events, we report the modified directory inode > > and we report the "victim" inode otherwise. > > For example: > > FS_ATTRIB reports the child inode even if reported on a watched parent. > > FS_CREATE reports the modified dir inode and not the created inode. > > > > Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx> > > --- > > fs/notify/fanotify/fanotify.c | 67 ++++++++++++++++++++---------- > > fs/notify/fanotify/fanotify.h | 2 +- > > fs/notify/fanotify/fanotify_user.c | 3 +- > > 3 files changed, 48 insertions(+), 24 deletions(-) > > > > diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c > > index fcb98ea99508..e3ca1632feb8 100644 > > --- a/fs/notify/fanotify/fanotify.c > > +++ b/fs/notify/fanotify/fanotify.c > > @@ -96,7 +96,7 @@ static int fanotify_get_response(struct fsnotify_group *group, > > > > pr_debug("%s: group=%p event=%p about to return ret=%d\n", __func__, > > group, event, ret); > > - > > + > > return ret; > > } > > > > @@ -106,9 +106,10 @@ static int fanotify_get_response(struct fsnotify_group *group, > > * been included within the event mask, but have not been explicitly > > * requested by the user, will not be present in the returned mask. > > */ > > -static u32 fanotify_group_event_mask(struct fsnotify_iter_info *iter_info, > > - u32 event_mask, const void *data, > > - int data_type) > > +static u32 fanotify_group_event_mask(struct fsnotify_group *group, > > + struct fsnotify_iter_info *iter_info, > > + u32 event_mask, const void *data, > > + int data_type) > > { > > __u32 marks_mask = 0, marks_ignored_mask = 0; > > const struct path *path = data; > > @@ -118,14 +119,14 @@ static u32 fanotify_group_event_mask(struct fsnotify_iter_info *iter_info, > > pr_debug("%s: report_mask=%x mask=%x data=%p data_type=%d\n", > > __func__, iter_info->report_mask, event_mask, data, data_type); > > > > - /* If we don't have enough info to send an event to userspace say no */ > > - if (data_type != FSNOTIFY_EVENT_PATH) > > - return 0; > > - > > - /* Sorry, fanotify only gives a damn about files and dirs */ > > - if (!d_is_reg(path->dentry) && > > - !d_can_lookup(path->dentry)) > > + if (data_type == FSNOTIFY_EVENT_PATH) { > > + /* Path type events are only relevant for files and dirs */ > > + if (!d_is_reg(path->dentry) && !d_can_lookup(path->dentry)) > > + return 0; > > Hum, does this mean that fanotify won't report O_PATH open on symlink > unlike inotify? So shouldn't the condition rather be: > > if (!FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { > if (data_type != FSNOTIFY_EVENT_PATH) > return 0; > if (!d_is_reg(path->dentry) && !d_can_lookup(path->dentry)) > return 0; > } > > ? Makes sense. Thanks, Amir.