diff options
author | Eric Paris <eparis@redhat.com> | 2009-12-17 21:24:23 -0500 |
---|---|---|
committer | Eric Paris <eparis@redhat.com> | 2010-07-28 09:58:51 -0400 |
commit | 4ca763523e040dc61191d4866a82981a5d30a4e9 (patch) | |
tree | 9b02105e7c84853dd89eff16837a9b7fba2a1050 /fs/notify/group.c | |
parent | 36fddebaa8a9186d4f5817ab798a83400b2fb2e7 (diff) |
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: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'fs/notify/group.c')
-rw-r--r-- | fs/notify/group.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/fs/notify/group.c b/fs/notify/group.c index 656c534ffb66..34fccbd2809c 100644 --- a/fs/notify/group.c +++ b/fs/notify/group.c | |||
@@ -77,12 +77,15 @@ void fsnotify_recalc_group_mask(struct fsnotify_group *group) | |||
77 | fsnotify_recalc_global_mask(); | 77 | fsnotify_recalc_global_mask(); |
78 | } | 78 | } |
79 | 79 | ||
80 | static void fsnotify_add_group(struct fsnotify_group *group) | 80 | void fsnotify_add_inode_group(struct fsnotify_group *group) |
81 | { | 81 | { |
82 | BUG_ON(!mutex_is_locked(&fsnotify_grp_mutex)); | 82 | mutex_lock(&fsnotify_grp_mutex); |
83 | 83 | ||
84 | if (!group->on_inode_group_list) | ||
85 | list_add_tail_rcu(&group->inode_group_list, &fsnotify_inode_groups); | ||
84 | group->on_inode_group_list = 1; | 86 | group->on_inode_group_list = 1; |
85 | list_add_tail_rcu(&group->inode_group_list, &fsnotify_inode_groups); | 87 | |
88 | mutex_unlock(&fsnotify_grp_mutex); | ||
86 | } | 89 | } |
87 | 90 | ||
88 | /* | 91 | /* |
@@ -188,22 +191,17 @@ struct fsnotify_group *fsnotify_alloc_group(const struct fsnotify_ops *ops) | |||
188 | */ | 191 | */ |
189 | atomic_set(&group->num_marks, 1); | 192 | atomic_set(&group->num_marks, 1); |
190 | 193 | ||
191 | |||
192 | mutex_init(&group->notification_mutex); | 194 | mutex_init(&group->notification_mutex); |
193 | INIT_LIST_HEAD(&group->notification_list); | 195 | INIT_LIST_HEAD(&group->notification_list); |
194 | init_waitqueue_head(&group->notification_waitq); | 196 | init_waitqueue_head(&group->notification_waitq); |
195 | group->max_events = UINT_MAX; | 197 | group->max_events = UINT_MAX; |
196 | 198 | ||
199 | INIT_LIST_HEAD(&group->inode_group_list); | ||
200 | |||
197 | spin_lock_init(&group->mark_lock); | 201 | spin_lock_init(&group->mark_lock); |
198 | INIT_LIST_HEAD(&group->mark_entries); | 202 | INIT_LIST_HEAD(&group->mark_entries); |
199 | 203 | ||
200 | group->ops = ops; | 204 | group->ops = ops; |
201 | 205 | ||
202 | mutex_lock(&fsnotify_grp_mutex); | ||
203 | |||
204 | fsnotify_add_group(group); | ||
205 | |||
206 | mutex_unlock(&fsnotify_grp_mutex); | ||
207 | |||
208 | return group; | 206 | return group; |
209 | } | 207 | } |