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: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user