Commit 4bd5a5c8 authored by Gabriel Krisman Bertazi's avatar Gabriel Krisman Bertazi Committed by Jan Kara
Browse files

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: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarGabriel Krisman Bertazi <krisman@collabora.com>
Reviewed-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 2c506943
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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;
}

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_event fae;
	struct path path;
+7 −6
Original line number Diff line number Diff line
@@ -140,10 +140,9 @@ static size_t fanotify_event_len(unsigned int info_mode,
		return event_len;

	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);
	} else if ((info_mode & FAN_REPORT_NAME) &&
		   (event->mask & FAN_ONDIR)) {
@@ -157,8 +156,10 @@ static size_t fanotify_event_len(unsigned int info_mode,
	if (info_mode & FAN_REPORT_PIDFD)
		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);
	}

	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.
	 */
	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 :
					     FAN_EVENT_INFO_TYPE_DFID;
		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;
	}

	if (fanotify_event_object_fh_len(event)) {
	if (fanotify_event_has_object_fh(event)) {
		const char *dot = NULL;
		int dot_len = 0;