Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 837a3934 authored by Amir Goldstein's avatar Amir Goldstein Committed by Jan Kara
Browse files

fanotify: generalize fanotify_should_send_event()



Use fsnotify_foreach_obj_type macros to generalize the code that filters
events by marks mask and ignored_mask.

This is going to be used for adding mark of super block object type.

Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 3dca1a74
Loading
Loading
Loading
Loading
+18 −18
Original line number Diff line number Diff line
@@ -91,14 +91,13 @@ static bool fanotify_should_send_event(struct fsnotify_iter_info *iter_info,
				       u32 event_mask, const void *data,
				       int data_type)
{
	struct fsnotify_mark *inode_mark = fsnotify_iter_inode_mark(iter_info);
	struct fsnotify_mark *vfsmnt_mark = fsnotify_iter_vfsmount_mark(iter_info);
	__u32 marks_mask = 0, marks_ignored_mask = 0;
	const struct path *path = data;
	struct fsnotify_mark *mark;
	int type;

	pr_debug("%s: inode_mark=%p vfsmnt_mark=%p mask=%x data=%p"
		 " data_type=%d\n", __func__, inode_mark, vfsmnt_mark,
		 event_mask, data, data_type);
	pr_debug("%s: report_mask=%x mask=%x data=%p data_type=%d\n",
		 __func__, iter_info->report_mask, event_mask, data, data_type);

	/* if we don't have enough info to send an event to userspace say no */
	if (data_type != FSNOTIFY_EVENT_PATH)
@@ -109,20 +108,21 @@ static bool fanotify_should_send_event(struct fsnotify_iter_info *iter_info,
	    !d_can_lookup(path->dentry))
		return false;

	fsnotify_foreach_obj_type(type) {
		if (!fsnotify_iter_should_report_type(iter_info, type))
			continue;
		mark = iter_info->marks[type];
		/*
		 * if the event is for a child and this inode doesn't care about
		 * events on the child, don't send it!
		 */
	if (inode_mark &&
	    (!(event_mask & FS_EVENT_ON_CHILD) ||
	     (inode_mark->mask & FS_EVENT_ON_CHILD))) {
		marks_mask |= inode_mark->mask;
		marks_ignored_mask |= inode_mark->ignored_mask;
	}
		if (type == FSNOTIFY_OBJ_TYPE_INODE &&
		    (event_mask & FS_EVENT_ON_CHILD) &&
		    !(mark->mask & FS_EVENT_ON_CHILD))
			continue;

	if (vfsmnt_mark) {
		marks_mask |= vfsmnt_mark->mask;
		marks_ignored_mask |= vfsmnt_mark->ignored_mask;
		marks_mask |= mark->mask;
		marks_ignored_mask |= mark->ignored_mask;
	}

	if (d_is_dir(path->dentry) &&