diff options
author | Eric Paris <eparis@redhat.com> | 2009-05-21 17:01:47 -0400 |
---|---|---|
committer | Eric Paris <eparis@redhat.com> | 2009-06-11 14:57:54 -0400 |
commit | 47882c6f51e8ef41fbbe2bbb746a1ea3228dd7ca (patch) | |
tree | d3dd3e8d0e4d3e3793f32107077839f787e35fcd /include/linux | |
parent | 62ffe5dfba056f7ba81d710fee9f28c58a42fdd6 (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 'include/linux')
-rw-r--r-- | include/linux/fsnotify.h | 35 | ||||
-rw-r--r-- | include/linux/fsnotify_backend.h | 15 |
2 files changed, 30 insertions, 20 deletions
diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 180740e9ec82..c25b39ddd62a 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h | |||
@@ -58,7 +58,7 @@ static inline void fsnotify_link_count(struct inode *inode) | |||
58 | { | 58 | { |
59 | inotify_inode_queue_event(inode, IN_ATTRIB, 0, NULL, NULL); | 59 | inotify_inode_queue_event(inode, IN_ATTRIB, 0, NULL, NULL); |
60 | 60 | ||
61 | fsnotify(inode, FS_ATTRIB, inode, FSNOTIFY_EVENT_INODE, NULL); | 61 | fsnotify(inode, FS_ATTRIB, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
62 | } | 62 | } |
63 | 63 | ||
64 | /* | 64 | /* |
@@ -69,7 +69,8 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, | |||
69 | int isdir, struct inode *target, struct dentry *moved) | 69 | int isdir, struct inode *target, struct dentry *moved) |
70 | { | 70 | { |
71 | struct inode *source = moved->d_inode; | 71 | struct inode *source = moved->d_inode; |
72 | u32 cookie = inotify_get_cookie(); | 72 | u32 in_cookie = inotify_get_cookie(); |
73 | u32 fs_cookie = fsnotify_get_cookie(); | ||
73 | __u32 old_dir_mask = 0; | 74 | __u32 old_dir_mask = 0; |
74 | __u32 new_dir_mask = 0; | 75 | __u32 new_dir_mask = 0; |
75 | 76 | ||
@@ -86,13 +87,13 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, | |||
86 | old_dir_mask |= FS_MOVED_FROM; | 87 | old_dir_mask |= FS_MOVED_FROM; |
87 | new_dir_mask |= FS_MOVED_TO; | 88 | new_dir_mask |= FS_MOVED_TO; |
88 | 89 | ||
89 | inotify_inode_queue_event(old_dir, IN_MOVED_FROM|isdir,cookie,old_name, | 90 | inotify_inode_queue_event(old_dir, IN_MOVED_FROM|isdir, in_cookie, old_name, |
90 | source); | 91 | source); |
91 | inotify_inode_queue_event(new_dir, IN_MOVED_TO|isdir, cookie, new_name, | 92 | inotify_inode_queue_event(new_dir, IN_MOVED_TO|isdir, in_cookie, new_name, |
92 | source); | 93 | source); |
93 | 94 | ||
94 | fsnotify(old_dir, old_dir_mask, old_dir, FSNOTIFY_EVENT_INODE, old_name); | 95 | fsnotify(old_dir, old_dir_mask, old_dir, FSNOTIFY_EVENT_INODE, old_name, fs_cookie); |
95 | fsnotify(new_dir, new_dir_mask, new_dir, FSNOTIFY_EVENT_INODE, new_name); | 96 | fsnotify(new_dir, new_dir_mask, new_dir, FSNOTIFY_EVENT_INODE, new_name, fs_cookie); |
96 | 97 | ||
97 | if (target) { | 98 | if (target) { |
98 | inotify_inode_queue_event(target, IN_DELETE_SELF, 0, NULL, NULL); | 99 | inotify_inode_queue_event(target, IN_DELETE_SELF, 0, NULL, NULL); |
@@ -104,7 +105,7 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, | |||
104 | 105 | ||
105 | if (source) { | 106 | if (source) { |
106 | inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL, NULL); | 107 | inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL, NULL); |
107 | fsnotify(source, FS_MOVE_SELF, moved->d_inode, FSNOTIFY_EVENT_INODE, NULL); | 108 | fsnotify(source, FS_MOVE_SELF, moved->d_inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
108 | } | 109 | } |
109 | audit_inode_child(new_name, moved, new_dir); | 110 | audit_inode_child(new_name, moved, new_dir); |
110 | } | 111 | } |
@@ -138,7 +139,7 @@ static inline void fsnotify_inoderemove(struct inode *inode) | |||
138 | inotify_inode_queue_event(inode, IN_DELETE_SELF, 0, NULL, NULL); | 139 | inotify_inode_queue_event(inode, IN_DELETE_SELF, 0, NULL, NULL); |
139 | inotify_inode_is_dead(inode); | 140 | inotify_inode_is_dead(inode); |
140 | 141 | ||
141 | fsnotify(inode, FS_DELETE_SELF, inode, FSNOTIFY_EVENT_INODE, NULL); | 142 | fsnotify(inode, FS_DELETE_SELF, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
142 | __fsnotify_inode_delete(inode); | 143 | __fsnotify_inode_delete(inode); |
143 | } | 144 | } |
144 | 145 | ||
@@ -151,7 +152,7 @@ static inline void fsnotify_create(struct inode *inode, struct dentry *dentry) | |||
151 | dentry->d_inode); | 152 | dentry->d_inode); |
152 | audit_inode_child(dentry->d_name.name, dentry, inode); | 153 | audit_inode_child(dentry->d_name.name, dentry, inode); |
153 | 154 | ||
154 | fsnotify(inode, FS_CREATE, dentry->d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name); | 155 | fsnotify(inode, FS_CREATE, dentry->d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0); |
155 | } | 156 | } |
156 | 157 | ||
157 | /* | 158 | /* |
@@ -166,7 +167,7 @@ static inline void fsnotify_link(struct inode *dir, struct inode *inode, struct | |||
166 | fsnotify_link_count(inode); | 167 | fsnotify_link_count(inode); |
167 | audit_inode_child(new_dentry->d_name.name, new_dentry, dir); | 168 | audit_inode_child(new_dentry->d_name.name, new_dentry, dir); |
168 | 169 | ||
169 | fsnotify(dir, FS_CREATE, inode, FSNOTIFY_EVENT_INODE, new_dentry->d_name.name); | 170 | fsnotify(dir, FS_CREATE, inode, FSNOTIFY_EVENT_INODE, new_dentry->d_name.name, 0); |
170 | } | 171 | } |
171 | 172 | ||
172 | /* | 173 | /* |
@@ -180,7 +181,7 @@ static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry) | |||
180 | inotify_inode_queue_event(inode, mask, 0, dentry->d_name.name, d_inode); | 181 | inotify_inode_queue_event(inode, mask, 0, dentry->d_name.name, d_inode); |
181 | audit_inode_child(dentry->d_name.name, dentry, inode); | 182 | audit_inode_child(dentry->d_name.name, dentry, inode); |
182 | 183 | ||
183 | fsnotify(inode, mask, d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name); | 184 | fsnotify(inode, mask, d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0); |
184 | } | 185 | } |
185 | 186 | ||
186 | /* | 187 | /* |
@@ -197,7 +198,7 @@ static inline void fsnotify_access(struct dentry *dentry) | |||
197 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | 198 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); |
198 | 199 | ||
199 | fsnotify_parent(dentry, mask); | 200 | fsnotify_parent(dentry, mask); |
200 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL); | 201 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
201 | } | 202 | } |
202 | 203 | ||
203 | /* | 204 | /* |
@@ -214,7 +215,7 @@ static inline void fsnotify_modify(struct dentry *dentry) | |||
214 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | 215 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); |
215 | 216 | ||
216 | fsnotify_parent(dentry, mask); | 217 | fsnotify_parent(dentry, mask); |
217 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL); | 218 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
218 | } | 219 | } |
219 | 220 | ||
220 | /* | 221 | /* |
@@ -231,7 +232,7 @@ static inline void fsnotify_open(struct dentry *dentry) | |||
231 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | 232 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); |
232 | 233 | ||
233 | fsnotify_parent(dentry, mask); | 234 | fsnotify_parent(dentry, mask); |
234 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL); | 235 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
235 | } | 236 | } |
236 | 237 | ||
237 | /* | 238 | /* |
@@ -250,7 +251,7 @@ static inline void fsnotify_close(struct file *file) | |||
250 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | 251 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); |
251 | 252 | ||
252 | fsnotify_parent(dentry, mask); | 253 | fsnotify_parent(dentry, mask); |
253 | fsnotify(inode, mask, file, FSNOTIFY_EVENT_FILE, NULL); | 254 | fsnotify(inode, mask, file, FSNOTIFY_EVENT_FILE, NULL, 0); |
254 | } | 255 | } |
255 | 256 | ||
256 | /* | 257 | /* |
@@ -267,7 +268,7 @@ static inline void fsnotify_xattr(struct dentry *dentry) | |||
267 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | 268 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); |
268 | 269 | ||
269 | fsnotify_parent(dentry, mask); | 270 | fsnotify_parent(dentry, mask); |
270 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL); | 271 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
271 | } | 272 | } |
272 | 273 | ||
273 | /* | 274 | /* |
@@ -303,7 +304,7 @@ static inline void fsnotify_change(struct dentry *dentry, unsigned int ia_valid) | |||
303 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | 304 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); |
304 | 305 | ||
305 | fsnotify_parent(dentry, mask); | 306 | fsnotify_parent(dentry, mask); |
306 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL); | 307 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
307 | } | 308 | } |
308 | } | 309 | } |
309 | 310 | ||
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 52692f405890..b78b5573d227 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h | |||
@@ -193,6 +193,7 @@ struct fsnotify_event { | |||
193 | atomic_t refcnt; /* how many groups still are using/need to send this event */ | 193 | atomic_t refcnt; /* how many groups still are using/need to send this event */ |
194 | __u32 mask; /* the type of access, bitwise OR for FS_* event types */ | 194 | __u32 mask; /* the type of access, bitwise OR for FS_* event types */ |
195 | 195 | ||
196 | u32 sync_cookie; /* used to corrolate events, namely inotify mv events */ | ||
196 | char *file_name; | 197 | char *file_name; |
197 | size_t name_len; | 198 | size_t name_len; |
198 | }; | 199 | }; |
@@ -227,9 +228,11 @@ struct fsnotify_mark_entry { | |||
227 | /* called from the vfs helpers */ | 228 | /* called from the vfs helpers */ |
228 | 229 | ||
229 | /* main fsnotify call to send events */ | 230 | /* main fsnotify call to send events */ |
230 | extern void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, const char *name); | 231 | extern void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, |
232 | const char *name, u32 cookie); | ||
231 | extern void __fsnotify_parent(struct dentry *dentry, __u32 mask); | 233 | extern void __fsnotify_parent(struct dentry *dentry, __u32 mask); |
232 | extern void __fsnotify_inode_delete(struct inode *inode); | 234 | extern void __fsnotify_inode_delete(struct inode *inode); |
235 | extern u32 fsnotify_get_cookie(void); | ||
233 | 236 | ||
234 | static inline int fsnotify_inode_watches_children(struct inode *inode) | 237 | static inline int fsnotify_inode_watches_children(struct inode *inode) |
235 | { | 238 | { |
@@ -322,12 +325,13 @@ extern void fsnotify_put_mark(struct fsnotify_mark_entry *entry); | |||
322 | 325 | ||
323 | /* put here because inotify does some weird stuff when destroying watches */ | 326 | /* put here because inotify does some weird stuff when destroying watches */ |
324 | extern struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, | 327 | extern struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, |
325 | void *data, int data_is, const char *name); | 328 | void *data, int data_is, const char *name, |
329 | u32 cookie); | ||
326 | 330 | ||
327 | #else | 331 | #else |
328 | 332 | ||
329 | static inline void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, | 333 | static inline void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, |
330 | const char *name); | 334 | const char *name, u32 cookie) |
331 | {} | 335 | {} |
332 | 336 | ||
333 | static inline void __fsnotify_parent(struct dentry *dentry, __u32 mask) | 337 | static inline void __fsnotify_parent(struct dentry *dentry, __u32 mask) |
@@ -342,6 +346,11 @@ static inline void __fsnotify_update_dcache_flags(struct dentry *dentry) | |||
342 | static inline void __fsnotify_d_instantiate(struct dentry *dentry, struct inode *inode) | 346 | static inline void __fsnotify_d_instantiate(struct dentry *dentry, struct inode *inode) |
343 | {} | 347 | {} |
344 | 348 | ||
349 | static inline u32 fsnotify_get_cookie(void) | ||
350 | { | ||
351 | return 0; | ||
352 | } | ||
353 | |||
345 | #endif /* CONFIG_FSNOTIFY */ | 354 | #endif /* CONFIG_FSNOTIFY */ |
346 | 355 | ||
347 | #endif /* __KERNEL __ */ | 356 | #endif /* __KERNEL __ */ |