Re: [PATCH v3 4/5] fanotify/fanotify_user.c: introduce a generic info record copying helper

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

 



On Tue, Jul 27, 2021 at 11:16:33AM +0300, Amir Goldstein wrote:
> On Wed, Jul 21, 2021 at 9:35 AM Amir Goldstein <amir73il@xxxxxxxxx> wrote:
> >
> > On Wed, Jul 21, 2021 at 9:18 AM Matthew Bobrowski <repnop@xxxxxxxxxx> wrote:
> > >
> > > The copy_info_records_to_user() helper allows for the separation of
> > > info record copying routines/conditionals from copy_event_to_user(),
> > > which reduces the overall clutter within this function. This becomes
> > > especially true as we start introducing additional info records in the
> > > future i.e. struct fanotify_event_info_pidfd. On success, this helper
> > > returns the total amount of bytes that have been copied into the user
> > > supplied buffer and on error, a negative value is returned to the
> > > caller.
> > >
> > > The newly defined macro FANOTIFY_INFO_MODES can be used to obtain info
> > > record types that have been enabled for a specific notification
> > > group. This macro becomes useful in the subsequent patch when the
> > > FAN_REPORT_PIDFD initialization flag is introduced.
> > >
> > > Signed-off-by: Matthew Bobrowski <repnop@xxxxxxxxxx>
> > Reviewed-by: Amir Goldstein <amir73il@xxxxxxxxx>
> >
> > > ---
> > >  fs/notify/fanotify/fanotify_user.c | 155 ++++++++++++++++-------------
> > >  include/linux/fanotify.h           |   2 +
> > >  2 files changed, 90 insertions(+), 67 deletions(-)
> > >
> > > diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
> > > index 182fea255376..d19f70b2c24c 100644
> > > --- a/fs/notify/fanotify/fanotify_user.c
> > > +++ b/fs/notify/fanotify/fanotify_user.c
> > > @@ -173,7 +173,7 @@ static struct fanotify_event *get_one_event(struct fsnotify_group *group,
> > >         size_t event_size = FAN_EVENT_METADATA_LEN;
> > >         struct fanotify_event *event = NULL;
> > >         struct fsnotify_event *fsn_event;
> > > -       unsigned int fid_mode = FAN_GROUP_FLAG(group, FANOTIFY_FID_BITS);
> > > +       unsigned int info_mode = FAN_GROUP_FLAG(group, FANOTIFY_INFO_MODES);
> > >
> > >         pr_debug("%s: group=%p count=%zd\n", __func__, group, count);
> > >
> > > @@ -183,8 +183,8 @@ static struct fanotify_event *get_one_event(struct fsnotify_group *group,
> > >                 goto out;
> > >
> > >         event = FANOTIFY_E(fsn_event);
> > > -       if (fid_mode)
> > > -               event_size += fanotify_event_info_len(fid_mode, event);
> > > +       if (info_mode)
> > > +               event_size += fanotify_event_info_len(info_mode, event);
> > >
> > >         if (event_size > count) {
> > >                 event = ERR_PTR(-EINVAL);
> > > @@ -401,6 +401,86 @@ static int copy_fid_info_to_user(__kernel_fsid_t *fsid, struct fanotify_fh *fh,
> > >         return info_len;
> > >  }
> > >
> > > +static int copy_info_records_to_user(struct fanotify_event *event,
> > > +                                    struct fanotify_info *info,
> > > +                                    unsigned int info_mode,
> > > +                                    char __user *buf, size_t count)
> > > +{
> > > +       int ret, total_bytes = 0, info_type = 0;
> > > +       unsigned int fid_mode = info_mode & FANOTIFY_FID_BITS;
> > > +
> > > +       /*
> > > +        * Event info records order is as follows: dir fid + name, child fid.
> > > +        */
> > > +       if (fanotify_event_dir_fh_len(event)) {
> > > +               info_type = info->name_len ? FAN_EVENT_INFO_TYPE_DFID_NAME :
> > > +                                            FAN_EVENT_INFO_TYPE_DFID;
> > > +               ret = copy_fid_info_to_user(fanotify_event_fsid(event),
> > > +                                           fanotify_info_dir_fh(info),
> > > +                                           info_type,
> > > +                                           fanotify_info_name(info),
> > > +                                           info->name_len, buf, count);
> > > +               if (ret < 0)
> > > +                       return ret;
> > > +
> > > +               buf += ret;
> > > +               count -= ret;
> > > +               total_bytes += ret;
> > > +       }
> > > +
> > > +       if (fanotify_event_object_fh_len(event)) {
> > > +               const char *dot = NULL;
> > > +               int dot_len = 0;
> > > +
> > > +               if (fid_mode == FAN_REPORT_FID || info_type) {
> > > +                       /*
> > > +                        * With only group flag FAN_REPORT_FID only type FID is
> > > +                        * reported. Second info record type is always FID.
> > > +                        */
> > > +                       info_type = FAN_EVENT_INFO_TYPE_FID;
> > > +               } else if ((fid_mode & FAN_REPORT_NAME) &&
> > > +                          (event->mask & FAN_ONDIR)) {
> > > +                       /*
> > > +                        * With group flag FAN_REPORT_NAME, if name was not
> > > +                        * recorded in an event on a directory, report the name
> > > +                        * "." with info type DFID_NAME.
> > > +                        */
> > > +                       info_type = FAN_EVENT_INFO_TYPE_DFID_NAME;
> > > +                       dot = ".";
> > > +                       dot_len = 1;
> > > +               } else if ((event->mask & ALL_FSNOTIFY_DIRENT_EVENTS) ||
> > > +                          (event->mask & FAN_ONDIR)) {
> > > +                       /*
> > > +                        * With group flag FAN_REPORT_DIR_FID, a single info
> > > +                        * record has type DFID for directory entry
> > > +                        * modificatio\ n event and for event on a directory.
> 
> Just notices this typo in the copied comment:
> modificatio\ n
> 
> And for the next posting, please remove the mention of fanotify_user.c from
> the commit title - it adds no information and clutters the git oneline log.
> This concerns patch 3/5 as well. It does NOT concern the kernel/pid.c patches.

Noted.

/M



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux