On Thu 16-07-20 11:42:29, Amir Goldstein wrote: > For a group with fanotify_init() flag FAN_REPORT_DFID_NAME, the parent > fid and name are reported for events on non-directory objects with an > info record of type FAN_EVENT_INFO_TYPE_DFID_NAME. > > If the group also has the init flag FAN_REPORT_FID, the child fid > is also reported with another info record that follows the first info > record. The second info record is the same info record that would have > been reported to a group with only FAN_REPORT_FID flag. > > When the child fid needs to be recorded, the variable size struct > fanotify_name_event is preallocated with enough space to store the > child fh between the dir fh and the name. > > Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx> > --- > fs/notify/fanotify/fanotify.c | 30 ++++++++++++++++++++++++++---- > fs/notify/fanotify/fanotify.h | 8 +++++++- > fs/notify/fanotify/fanotify_user.c | 3 ++- > 3 files changed, 35 insertions(+), 6 deletions(-) > > diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c > index c77b37eb33a9..1d8eb886fe08 100644 > --- a/fs/notify/fanotify/fanotify.c > +++ b/fs/notify/fanotify/fanotify.c > @@ -479,15 +479,22 @@ static struct fanotify_event *fanotify_alloc_fid_event(struct inode *id, > static struct fanotify_event *fanotify_alloc_name_event(struct inode *id, > __kernel_fsid_t *fsid, > const struct qstr *file_name, > + struct inode *child, > gfp_t gfp) > { > struct fanotify_name_event *fne; > struct fanotify_info *info; > - struct fanotify_fh *dfh; > + struct fanotify_fh *dfh, *ffh; > unsigned int dir_fh_len = fanotify_encode_fh_len(id); > + unsigned int child_fh_len = fanotify_encode_fh_len(child); > unsigned int size; > > + if (WARN_ON_ONCE(dir_fh_len % FANOTIFY_FH_HDR_LEN)) > + child_fh_len = 0; > + Why this check? Do you want to check everything is 4-byte aligned? But then FANOTIFY_FH_HDR_LEN works mostly by accident... Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR