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; } ? Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR