Commit 4ca76352 authored by Eric Paris's avatar Eric Paris

fsnotify: add groups to fsnotify_inode_groups when registering inode watch

Currently all fsnotify groups are added immediately to the
fsnotify_inode_groups list upon creation.  This means, even groups with no
watches (common for audit) will be on the global tracking list and will
get checked for every event.  This patch adds groups to the global list on
when the first inode mark is added to the group.
Signed-of-by: default avatarEric Paris <eparis@redhat.com>
parent 36fddeba
...@@ -16,6 +16,8 @@ extern __u32 fsnotify_inode_mask; ...@@ -16,6 +16,8 @@ extern __u32 fsnotify_inode_mask;
/* destroy all events sitting in this groups notification queue */ /* destroy all events sitting in this groups notification queue */
extern void fsnotify_flush_notify(struct fsnotify_group *group); extern void fsnotify_flush_notify(struct fsnotify_group *group);
/* add a group to the inode group list */
extern void fsnotify_add_inode_group(struct fsnotify_group *group);
/* final kfree of a group */ /* final kfree of a group */
extern void fsnotify_final_destroy_group(struct fsnotify_group *group); extern void fsnotify_final_destroy_group(struct fsnotify_group *group);
......
...@@ -77,12 +77,15 @@ void fsnotify_recalc_group_mask(struct fsnotify_group *group) ...@@ -77,12 +77,15 @@ void fsnotify_recalc_group_mask(struct fsnotify_group *group)
fsnotify_recalc_global_mask(); fsnotify_recalc_global_mask();
} }
static void fsnotify_add_group(struct fsnotify_group *group) void fsnotify_add_inode_group(struct fsnotify_group *group)
{ {
BUG_ON(!mutex_is_locked(&fsnotify_grp_mutex)); mutex_lock(&fsnotify_grp_mutex);
if (!group->on_inode_group_list)
list_add_tail_rcu(&group->inode_group_list, &fsnotify_inode_groups);
group->on_inode_group_list = 1; group->on_inode_group_list = 1;
list_add_tail_rcu(&group->inode_group_list, &fsnotify_inode_groups);
mutex_unlock(&fsnotify_grp_mutex);
} }
/* /*
...@@ -188,22 +191,17 @@ struct fsnotify_group *fsnotify_alloc_group(const struct fsnotify_ops *ops) ...@@ -188,22 +191,17 @@ struct fsnotify_group *fsnotify_alloc_group(const struct fsnotify_ops *ops)
*/ */
atomic_set(&group->num_marks, 1); atomic_set(&group->num_marks, 1);
mutex_init(&group->notification_mutex); mutex_init(&group->notification_mutex);
INIT_LIST_HEAD(&group->notification_list); INIT_LIST_HEAD(&group->notification_list);
init_waitqueue_head(&group->notification_waitq); init_waitqueue_head(&group->notification_waitq);
group->max_events = UINT_MAX; group->max_events = UINT_MAX;
INIT_LIST_HEAD(&group->inode_group_list);
spin_lock_init(&group->mark_lock); spin_lock_init(&group->mark_lock);
INIT_LIST_HEAD(&group->mark_entries); INIT_LIST_HEAD(&group->mark_entries);
group->ops = ops; group->ops = ops;
mutex_lock(&fsnotify_grp_mutex);
fsnotify_add_group(group);
mutex_unlock(&fsnotify_grp_mutex);
return group; return group;
} }
...@@ -322,6 +322,13 @@ int fsnotify_add_mark(struct fsnotify_mark_entry *entry, ...@@ -322,6 +322,13 @@ int fsnotify_add_mark(struct fsnotify_mark_entry *entry,
if (unlikely(!inode)) if (unlikely(!inode))
return -EINVAL; return -EINVAL;
/*
* if this group isn't being testing for inode type events we need
* to start testing
*/
if (unlikely(list_empty(&group->inode_group_list)))
fsnotify_add_inode_group(group);
/* /*
* LOCKING ORDER!!!! * LOCKING ORDER!!!!
* entry->lock * entry->lock
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment