aboutsummaryrefslogtreecommitdiffstats
path: root/fs/notify/notification.c
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2009-05-21 17:01:47 -0400
committerEric Paris <eparis@redhat.com>2009-06-11 14:57:54 -0400
commit47882c6f51e8ef41fbbe2bbb746a1ea3228dd7ca (patch)
treed3dd3e8d0e4d3e3793f32107077839f787e35fcd /fs/notify/notification.c
parent62ffe5dfba056f7ba81d710fee9f28c58a42fdd6 (diff)
fsnotify: add correlations between events
As part of the standard inotify events it includes a correlation cookie between two dentry move operations. This patch includes the same behaviour in fsnotify events. It is needed so that inotify userspace can be implemented on top of fsnotify. Signed-off-by: Eric Paris <eparis@redhat.com> Acked-by: Al Viro <viro@zeniv.linux.org.uk> Cc: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'fs/notify/notification.c')
-rw-r--r--fs/notify/notification.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/fs/notify/notification.c b/fs/notify/notification.c
index c69b18b9aba5..346f6e5c3553 100644
--- a/fs/notify/notification.c
+++ b/fs/notify/notification.c
@@ -35,6 +35,7 @@
35#include <linux/init.h> 35#include <linux/init.h>
36#include <linux/kernel.h> 36#include <linux/kernel.h>
37#include <linux/list.h> 37#include <linux/list.h>
38#include <linux/module.h>
38#include <linux/mount.h> 39#include <linux/mount.h>
39#include <linux/mutex.h> 40#include <linux/mutex.h>
40#include <linux/namei.h> 41#include <linux/namei.h>
@@ -56,6 +57,17 @@ static struct kmem_cache *fsnotify_event_holder_cachep;
56 * get set to 0 so it will never get 'freed' 57 * get set to 0 so it will never get 'freed'
57 */ 58 */
58static struct fsnotify_event q_overflow_event; 59static struct fsnotify_event q_overflow_event;
60static atomic_t fsnotify_sync_cookie = ATOMIC_INIT(0);
61
62/**
63 * fsnotify_get_cookie - return a unique cookie for use in synchronizing events.
64 * Called from fsnotify_move, which is inlined into filesystem modules.
65 */
66u32 fsnotify_get_cookie(void)
67{
68 return atomic_inc_return(&fsnotify_sync_cookie);
69}
70EXPORT_SYMBOL_GPL(fsnotify_get_cookie);
59 71
60/* return true if the notify queue is empty, false otherwise */ 72/* return true if the notify queue is empty, false otherwise */
61bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group) 73bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group)
@@ -266,6 +278,8 @@ static void initialize_event(struct fsnotify_event *event)
266 278
267 event->file_name = NULL; 279 event->file_name = NULL;
268 event->name_len = 0; 280 event->name_len = 0;
281
282 event->sync_cookie = 0;
269} 283}
270 284
271/* 285/*
@@ -280,8 +294,8 @@ static void initialize_event(struct fsnotify_event *event)
280 * @data_type flag indication if the data is a file, path, inode, nothing... 294 * @data_type flag indication if the data is a file, path, inode, nothing...
281 * @name the filename, if available 295 * @name the filename, if available
282 */ 296 */
283struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, 297struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, void *data,
284 void *data, int data_type, const char *name) 298 int data_type, const char *name, u32 cookie)
285{ 299{
286 struct fsnotify_event *event; 300 struct fsnotify_event *event;
287 301
@@ -299,6 +313,8 @@ struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask,
299 } 313 }
300 event->name_len = strlen(event->file_name); 314 event->name_len = strlen(event->file_name);
301 } 315 }
316
317 event->sync_cookie = cookie;
302 event->to_tell = to_tell; 318 event->to_tell = to_tell;
303 319
304 switch (data_type) { 320 switch (data_type) {