/* destroy all events sitting in this groups notification queue */
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 */
extern void fsnotify_final_destroy_group(struct fsnotify_group *group);
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;
- list_add_tail_rcu(&group->inode_group_list, &fsnotify_inode_groups);
+
+ mutex_unlock(&fsnotify_grp_mutex);
}
/*
*/
atomic_set(&group->num_marks, 1);
-
mutex_init(&group->notification_mutex);
INIT_LIST_HEAD(&group->notification_list);
init_waitqueue_head(&group->notification_waitq);
group->max_events = UINT_MAX;
+ INIT_LIST_HEAD(&group->inode_group_list);
+
spin_lock_init(&group->mark_lock);
INIT_LIST_HEAD(&group->mark_entries);
group->ops = ops;
- mutex_lock(&fsnotify_grp_mutex);
-
- fsnotify_add_group(group);
-
- mutex_unlock(&fsnotify_grp_mutex);
-
return group;
}