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