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

fsnotify: move mask out of struct fsnotify_event



Common fsnotify_event helpers have no need for the mask field.
It is only used by backend code, so move the field out of the
abstract fsnotify_event struct and into the concrete backend
event structs.

This change packs struct inotify_event_info better on 64bit
machine and will allow us to cram some more fields into
struct fanotify_event_info.

Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 45a9fb37
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -36,20 +36,22 @@ static bool should_merge(struct fsnotify_event *old_fsn,
static int fanotify_merge(struct list_head *list, struct fsnotify_event *event)
{
	struct fsnotify_event *test_event;
	struct fanotify_event_info *new;

	pr_debug("%s: list=%p event=%p\n", __func__, list, event);
	new = FANOTIFY_E(event);

	/*
	 * Don't merge a permission event with any other event so that we know
	 * the event structure we have created in fanotify_handle_event() is the
	 * one we should check for permission response.
	 */
	if (fanotify_is_perm_event(event->mask))
	if (fanotify_is_perm_event(new->mask))
		return 0;

	list_for_each_entry_reverse(test_event, list, list) {
		if (should_merge(test_event, event)) {
			test_event->mask |= event->mask;
			FANOTIFY_E(test_event)->mask |= new->mask;
			return 1;
		}
	}
@@ -173,7 +175,8 @@ struct fanotify_event_info *fanotify_alloc_event(struct fsnotify_group *group,
	if (!event)
		goto out;
init: __maybe_unused
	fsnotify_init_event(&event->fse, inode, mask);
	fsnotify_init_event(&event->fse, inode);
	event->mask = mask;
	if (FAN_GROUP_FLAG(group, FAN_REPORT_TID))
		event->pid = get_pid(task_pid(current));
	else
@@ -280,7 +283,7 @@ static void fanotify_free_event(struct fsnotify_event *fsn_event)
	event = FANOTIFY_E(fsn_event);
	path_put(&event->path);
	put_pid(event->pid);
	if (fanotify_is_perm_event(fsn_event->mask)) {
	if (fanotify_is_perm_event(event->mask)) {
		kmem_cache_free(fanotify_perm_event_cachep,
				FANOTIFY_PE(fsn_event));
		return;
+1 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ extern struct kmem_cache *fanotify_perm_event_cachep;
 */
struct fanotify_event_info {
	struct fsnotify_event fse;
	u32 mask;
	/*
	 * We hold ref to this path so it may be dereferenced at any point
	 * during this object's lifetime
+5 −5
Original line number Diff line number Diff line
@@ -131,9 +131,9 @@ static int fill_event_metadata(struct fsnotify_group *group,
	metadata->metadata_len = FAN_EVENT_METADATA_LEN;
	metadata->vers = FANOTIFY_METADATA_VERSION;
	metadata->reserved = 0;
	metadata->mask = fsn_event->mask & FANOTIFY_OUTGOING_EVENTS;
	metadata->mask = event->mask & FANOTIFY_OUTGOING_EVENTS;
	metadata->pid = pid_vnr(event->pid);
	if (unlikely(fsn_event->mask & FAN_Q_OVERFLOW))
	if (unlikely(event->mask & FAN_Q_OVERFLOW))
		metadata->fd = FAN_NOFD;
	else {
		metadata->fd = create_fd(group, event, file);
@@ -230,7 +230,7 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group,
			 fanotify_event_metadata.event_len))
		goto out_close_fd;

	if (fanotify_is_perm_event(event->mask))
	if (fanotify_is_perm_event(FANOTIFY_E(event)->mask))
		FANOTIFY_PE(event)->fd = fd;

	if (fd != FAN_NOFD)
@@ -316,7 +316,7 @@ static ssize_t fanotify_read(struct file *file, char __user *buf,
		 * Permission events get queued to wait for response.  Other
		 * events can be destroyed now.
		 */
		if (!fanotify_is_perm_event(kevent->mask)) {
		if (!fanotify_is_perm_event(FANOTIFY_E(kevent)->mask)) {
			fsnotify_destroy_event(group, kevent);
		} else {
			if (ret <= 0) {
@@ -401,7 +401,7 @@ static int fanotify_release(struct inode *ignored, struct file *file)
	 */
	while (!fsnotify_notify_queue_is_empty(group)) {
		fsn_event = fsnotify_remove_first_event(group);
		if (!(fsn_event->mask & FANOTIFY_PERM_EVENTS)) {
		if (!(FANOTIFY_E(fsn_event)->mask & FANOTIFY_PERM_EVENTS)) {
			spin_unlock(&group->notification_lock);
			fsnotify_destroy_event(group, fsn_event);
			spin_lock(&group->notification_lock);
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@

struct inotify_event_info {
	struct fsnotify_event fse;
	u32 mask;
	int wd;
	u32 sync_cookie;
	int name_len;
+5 −4
Original line number Diff line number Diff line
@@ -43,11 +43,11 @@ static bool event_compare(struct fsnotify_event *old_fsn,
{
	struct inotify_event_info *old, *new;

	if (old_fsn->mask & FS_IN_IGNORED)
		return false;
	old = INOTIFY_E(old_fsn);
	new = INOTIFY_E(new_fsn);
	if ((old_fsn->mask == new_fsn->mask) &&
	if (old->mask & FS_IN_IGNORED)
		return false;
	if ((old->mask == new->mask) &&
	    (old_fsn->inode == new_fsn->inode) &&
	    (old->name_len == new->name_len) &&
	    (!old->name_len || !strcmp(old->name, new->name)))
@@ -114,7 +114,8 @@ int inotify_handle_event(struct fsnotify_group *group,
	}

	fsn_event = &event->fse;
	fsnotify_init_event(fsn_event, inode, mask);
	fsnotify_init_event(fsn_event, inode);
	event->mask = mask;
	event->wd = i_mark->wd;
	event->sync_cookie = cookie;
	event->name_len = len;
Loading