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

Commit d507816b authored by Jan Kara's avatar Jan Kara Committed by Linus Torvalds
Browse files

fanotify: move unrelated handling from copy_event_to_user()



Move code moving event structure to access_list from copy_event_to_user()
to fanotify_read() where it is more logical (so that we can immediately
see in the main loop that we either move the event to a different list
or free it).  Also move special error handling for permission events
from copy_event_to_user() to the main loop to have it in one place with
error handling for normal events.  This makes copy_event_to_user()
really only copy the event to user without any side effects.

Signed-off-by: default avatarJan Kara <jack@suse.cz>
Cc: Eric Paris <eparis@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d8aaab4f
Loading
Loading
Loading
Loading
+19 −21
Original line number Original line Diff line number Diff line
@@ -199,7 +199,7 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group,


	ret = fill_event_metadata(group, &fanotify_event_metadata, event, &f);
	ret = fill_event_metadata(group, &fanotify_event_metadata, event, &f);
	if (ret < 0)
	if (ret < 0)
		goto out;
		return ret;


	fd = fanotify_event_metadata.fd;
	fd = fanotify_event_metadata.fd;
	ret = -EFAULT;
	ret = -EFAULT;
@@ -208,16 +208,8 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group,
		goto out_close_fd;
		goto out_close_fd;


#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
	if (event->mask & FAN_ALL_PERM_EVENTS) {
	if (event->mask & FAN_ALL_PERM_EVENTS)
		struct fanotify_perm_event_info *pevent;
		FANOTIFY_PE(event)->fd = fd;

		pevent = FANOTIFY_PE(event);
		pevent->fd = fd;
		spin_lock(&group->fanotify_data.access_lock);
		list_add_tail(&pevent->fae.fse.list,
			      &group->fanotify_data.access_list);
		spin_unlock(&group->fanotify_data.access_lock);
	}
#endif
#endif


	if (fd != FAN_NOFD)
	if (fd != FAN_NOFD)
@@ -229,13 +221,6 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group,
		put_unused_fd(fd);
		put_unused_fd(fd);
		fput(f);
		fput(f);
	}
	}
out:
#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
	if (event->mask & FAN_ALL_PERM_EVENTS) {
		FANOTIFY_PE(event)->response = FAN_DENY;
		wake_up(&group->fanotify_data.access_waitq);
	}
#endif
	return ret;
	return ret;
}
}


@@ -300,10 +285,23 @@ static ssize_t fanotify_read(struct file *file, char __user *buf,
		 * Permission events get queued to wait for response.  Other
		 * Permission events get queued to wait for response.  Other
		 * events can be destroyed now.
		 * events can be destroyed now.
		 */
		 */
		if (!(kevent->mask & FAN_ALL_PERM_EVENTS))
		if (!(kevent->mask & FAN_ALL_PERM_EVENTS)) {
			fsnotify_destroy_event(group, kevent);
			fsnotify_destroy_event(group, kevent);
			if (ret < 0)
			if (ret < 0)
				break;
				break;
		} else {
#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
			if (ret < 0) {
				FANOTIFY_PE(kevent)->response = FAN_DENY;
				wake_up(&group->fanotify_data.access_waitq);
				break;
			}
			spin_lock(&group->fanotify_data.access_lock);
			list_add_tail(&kevent->list,
				      &group->fanotify_data.access_list);
			spin_unlock(&group->fanotify_data.access_lock);
#endif
		}
		buf += ret;
		buf += ret;
		count -= ret;
		count -= ret;
	}
	}