aboutsummaryrefslogtreecommitdiffstats
path: root/fs/notify/notification.c
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2009-12-17 21:24:34 -0500
committerEric Paris <eparis@redhat.com>2010-07-28 09:59:01 -0400
commit6e5f77b32e9097a8a68a8d453799676cacf70cad (patch)
tree2a0211ecd5d79648e74fdf9f851a0669c5e4cc8a /fs/notify/notification.c
parentcb2d429faf2cae62d3c51e28099a181d5fe8c244 (diff)
fsnotify: intoduce a notification merge argument
Each group can define their own notification (and secondary_q) merge function. Inotify does tail drop, fanotify does matching and drop which can actually allocate a completely new event. But for fanotify to properly deal with permissions events it needs to know the new event which was ultimately added to the notification queue. This patch just implements a void ** argument which is passed to the merge function. fanotify can use this field to pass the new event back to higher layers. Signed-off-by: Eric Paris <eparis@redhat.com> for fanotify to properly deal with permissions events
Diffstat (limited to 'fs/notify/notification.c')
-rw-r--r--fs/notify/notification.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/notify/notification.c b/fs/notify/notification.c
index 7fc8d004084c..2d50a40ab1e4 100644
--- a/fs/notify/notification.c
+++ b/fs/notify/notification.c
@@ -137,7 +137,10 @@ struct fsnotify_event_private_data *fsnotify_remove_priv_from_event(struct fsnot
137 */ 137 */
138int fsnotify_add_notify_event(struct fsnotify_group *group, struct fsnotify_event *event, 138int fsnotify_add_notify_event(struct fsnotify_group *group, struct fsnotify_event *event,
139 struct fsnotify_event_private_data *priv, 139 struct fsnotify_event_private_data *priv,
140 int (*merge)(struct list_head *, struct fsnotify_event *)) 140 int (*merge)(struct list_head *,
141 struct fsnotify_event *,
142 void **arg),
143 void **arg)
141{ 144{
142 struct fsnotify_event_holder *holder = NULL; 145 struct fsnotify_event_holder *holder = NULL;
143 struct list_head *list = &group->notification_list; 146 struct list_head *list = &group->notification_list;
@@ -170,7 +173,7 @@ alloc_holder:
170 if (!list_empty(list) && merge) { 173 if (!list_empty(list) && merge) {
171 int ret; 174 int ret;
172 175
173 ret = merge(list, event); 176 ret = merge(list, event, arg);
174 if (ret) { 177 if (ret) {
175 mutex_unlock(&group->notification_mutex); 178 mutex_unlock(&group->notification_mutex);
176 if (holder != &event->holder) 179 if (holder != &event->holder)