fanotify: Add helpers to decide whether to report FID/DFID

Now that there is an event that reports FID records even for a zeroed
file handle, wrap the logic that deides whether to issue the records
into helper functions.  This shouldn't have any impact on the code, but
simplifies further patches.

Link: https://lore.kernel.org/r/20211025192746.66445-24-krisman@collabora.com
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
Gabriel Krisman Bertazi 2021-10-25 16:27:38 -03:00 коммит произвёл Jan Kara
Родитель 2c5069433a
Коммит 4bd5a5c8e6
2 изменённых файлов: 17 добавлений и 6 удалений

Просмотреть файл

@ -264,6 +264,16 @@ static inline int fanotify_event_dir_fh_len(struct fanotify_event *event)
return info ? fanotify_info_dir_fh_len(info) : 0; return info ? fanotify_info_dir_fh_len(info) : 0;
} }
static inline bool fanotify_event_has_object_fh(struct fanotify_event *event)
{
return fanotify_event_object_fh_len(event) > 0;
}
static inline bool fanotify_event_has_dir_fh(struct fanotify_event *event)
{
return fanotify_event_dir_fh_len(event) > 0;
}
struct fanotify_path_event { struct fanotify_path_event {
struct fanotify_event fae; struct fanotify_event fae;
struct path path; struct path path;

Просмотреть файл

@ -140,10 +140,9 @@ static size_t fanotify_event_len(unsigned int info_mode,
return event_len; return event_len;
info = fanotify_event_info(event); info = fanotify_event_info(event);
dir_fh_len = fanotify_event_dir_fh_len(event);
fh_len = fanotify_event_object_fh_len(event);
if (dir_fh_len) { if (fanotify_event_has_dir_fh(event)) {
dir_fh_len = fanotify_event_dir_fh_len(event);
event_len += fanotify_fid_info_len(dir_fh_len, info->name_len); event_len += fanotify_fid_info_len(dir_fh_len, info->name_len);
} else if ((info_mode & FAN_REPORT_NAME) && } else if ((info_mode & FAN_REPORT_NAME) &&
(event->mask & FAN_ONDIR)) { (event->mask & FAN_ONDIR)) {
@ -157,8 +156,10 @@ static size_t fanotify_event_len(unsigned int info_mode,
if (info_mode & FAN_REPORT_PIDFD) if (info_mode & FAN_REPORT_PIDFD)
event_len += FANOTIFY_PIDFD_INFO_HDR_LEN; event_len += FANOTIFY_PIDFD_INFO_HDR_LEN;
if (fh_len) if (fanotify_event_has_object_fh(event)) {
fh_len = fanotify_event_object_fh_len(event);
event_len += fanotify_fid_info_len(fh_len, dot_len); event_len += fanotify_fid_info_len(fh_len, dot_len);
}
return event_len; return event_len;
} }
@ -451,7 +452,7 @@ static int copy_info_records_to_user(struct fanotify_event *event,
/* /*
* Event info records order is as follows: dir fid + name, child fid. * Event info records order is as follows: dir fid + name, child fid.
*/ */
if (fanotify_event_dir_fh_len(event)) { if (fanotify_event_has_dir_fh(event)) {
info_type = info->name_len ? FAN_EVENT_INFO_TYPE_DFID_NAME : info_type = info->name_len ? FAN_EVENT_INFO_TYPE_DFID_NAME :
FAN_EVENT_INFO_TYPE_DFID; FAN_EVENT_INFO_TYPE_DFID;
ret = copy_fid_info_to_user(fanotify_event_fsid(event), ret = copy_fid_info_to_user(fanotify_event_fsid(event),
@ -467,7 +468,7 @@ static int copy_info_records_to_user(struct fanotify_event *event,
total_bytes += ret; total_bytes += ret;
} }
if (fanotify_event_object_fh_len(event)) { if (fanotify_event_has_object_fh(event)) {
const char *dot = NULL; const char *dot = NULL;
int dot_len = 0; int dot_len = 0;