Re: [PATCH v5 15/17] fanotify: support events with data type FSNOTIFY_EVENT_INODE

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.



[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux