1
2
3
4
5
6
7#ifndef __LINUX_FSNOTIFY_BACKEND_H
8#define __LINUX_FSNOTIFY_BACKEND_H
9
10#ifdef __KERNEL__
11
12#include <linux/idr.h>
13#include <linux/fs.h>
14#include <linux/list.h>
15#include <linux/path.h>
16#include <linux/spinlock.h>
17#include <linux/types.h>
18
19#include <linux/atomic.h>
20
21
22
23
24
25
26
27#define FS_ACCESS 0x00000001
28#define FS_MODIFY 0x00000002
29#define FS_ATTRIB 0x00000004
30#define FS_CLOSE_WRITE 0x00000008
31#define FS_CLOSE_NOWRITE 0x00000010
32#define FS_OPEN 0x00000020
33#define FS_MOVED_FROM 0x00000040
34#define FS_MOVED_TO 0x00000080
35#define FS_CREATE 0x00000100
36#define FS_DELETE 0x00000200
37#define FS_DELETE_SELF 0x00000400
38#define FS_MOVE_SELF 0x00000800
39
40#define FS_UNMOUNT 0x00002000
41#define FS_Q_OVERFLOW 0x00004000
42#define FS_IN_IGNORED 0x00008000
43
44#define FS_OPEN_PERM 0x00010000
45#define FS_ACCESS_PERM 0x00020000
46
47#define FS_EXCL_UNLINK 0x04000000
48#define FS_ISDIR 0x40000000
49#define FS_IN_ONESHOT 0x80000000
50
51#define FS_DN_RENAME 0x10000000
52#define FS_DN_MULTISHOT 0x20000000
53
54
55
56#define FS_EVENT_ON_CHILD 0x08000000
57
58
59
60#define FS_EVENTS_POSS_ON_CHILD (FS_ACCESS | FS_MODIFY | FS_ATTRIB |\
61 FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN |\
62 FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE |\
63 FS_DELETE)
64
65#define FS_MOVE (FS_MOVED_FROM | FS_MOVED_TO)
66
67#define ALL_FSNOTIFY_PERM_EVENTS (FS_OPEN_PERM | FS_ACCESS_PERM)
68
69#define ALL_FSNOTIFY_EVENTS (FS_ACCESS | FS_MODIFY | FS_ATTRIB | \
70 FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN | \
71 FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE | \
72 FS_DELETE | FS_DELETE_SELF | FS_MOVE_SELF | \
73 FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED | \
74 FS_OPEN_PERM | FS_ACCESS_PERM | FS_EXCL_UNLINK | \
75 FS_ISDIR | FS_IN_ONESHOT | FS_DN_RENAME | \
76 FS_DN_MULTISHOT | FS_EVENT_ON_CHILD)
77
78struct fsnotify_group;
79struct fsnotify_event;
80struct fsnotify_mark;
81struct fsnotify_event_private_data;
82
83
84
85
86
87
88
89
90
91
92
93
94
95struct fsnotify_ops {
96 bool (*should_send_event)(struct fsnotify_group *group, struct inode *inode,
97 struct fsnotify_mark *inode_mark,
98 struct fsnotify_mark *vfsmount_mark,
99 __u32 mask, void *data, int data_type);
100 int (*handle_event)(struct fsnotify_group *group,
101 struct fsnotify_mark *inode_mark,
102 struct fsnotify_mark *vfsmount_mark,
103 struct fsnotify_event *event);
104 void (*free_group_priv)(struct fsnotify_group *group);
105 void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group);
106 void (*free_event_priv)(struct fsnotify_event_private_data *priv);
107};
108
109
110
111
112
113
114
115struct fsnotify_group {
116
117
118
119
120
121
122
123
124 atomic_t refcnt;
125
126 const struct fsnotify_ops *ops;
127
128
129 struct mutex notification_mutex;
130 struct list_head notification_list;
131 wait_queue_head_t notification_waitq;
132 unsigned int q_len;
133 unsigned int max_events;
134
135
136
137
138 #define FS_PRIO_0 0
139 #define FS_PRIO_1 1
140 #define FS_PRIO_2 2
141 unsigned int priority;
142
143
144 spinlock_t mark_lock;
145 atomic_t num_marks;
146
147
148 struct list_head marks_list;
149
150
151 union {
152 void *private;
153#ifdef CONFIG_INOTIFY_USER
154 struct inotify_group_private_data {
155 spinlock_t idr_lock;
156 struct idr idr;
157 u32 last_wd;
158 struct fasync_struct *fa;
159 struct user_struct *user;
160 } inotify_data;
161#endif
162#ifdef CONFIG_FANOTIFY
163 struct fanotify_group_private_data {
164#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
165
166 struct mutex access_mutex;
167 struct list_head access_list;
168 wait_queue_head_t access_waitq;
169 atomic_t bypass_perm;
170#endif
171 int f_flags;
172 unsigned int max_marks;
173 struct user_struct *user;
174 } fanotify_data;
175#endif
176 };
177};
178
179
180
181
182
183
184
185
186
187
188
189struct fsnotify_event_holder {
190 struct fsnotify_event *event;
191 struct list_head event_list;
192};
193
194
195
196
197
198struct fsnotify_event_private_data {
199 struct fsnotify_group *group;
200 struct list_head event_list;
201};
202
203
204
205
206
207
208struct fsnotify_event {
209
210
211
212
213
214 struct fsnotify_event_holder holder;
215 spinlock_t lock;
216
217 struct inode *to_tell;
218
219
220
221
222
223
224
225
226 union {
227 struct path path;
228 struct inode *inode;
229 };
230
231#define FSNOTIFY_EVENT_NONE 0
232#define FSNOTIFY_EVENT_PATH 1
233#define FSNOTIFY_EVENT_INODE 2
234 int data_type;
235 atomic_t refcnt;
236 __u32 mask;
237
238 u32 sync_cookie;
239 const unsigned char *file_name;
240 size_t name_len;
241 struct pid *tgid;
242
243#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
244 __u32 response;
245#endif
246
247 struct list_head private_data_list;
248};
249
250
251
252
253struct fsnotify_inode_mark {
254 struct inode *inode;
255 struct hlist_node i_list;
256 struct list_head free_i_list;
257};
258
259
260
261
262struct fsnotify_vfsmount_mark {
263 struct vfsmount *mnt;
264 struct hlist_node m_list;
265 struct list_head free_m_list;
266};
267
268
269
270
271
272
273
274
275
276
277
278struct fsnotify_mark {
279 __u32 mask;
280
281
282 atomic_t refcnt;
283 struct fsnotify_group *group;
284 struct list_head g_list;
285 spinlock_t lock;
286 union {
287 struct fsnotify_inode_mark i;
288 struct fsnotify_vfsmount_mark m;
289 };
290 struct list_head free_g_list;
291 __u32 ignored_mask;
292#define FSNOTIFY_MARK_FLAG_INODE 0x01
293#define FSNOTIFY_MARK_FLAG_VFSMOUNT 0x02
294#define FSNOTIFY_MARK_FLAG_OBJECT_PINNED 0x04
295#define FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY 0x08
296#define FSNOTIFY_MARK_FLAG_ALIVE 0x10
297 unsigned int flags;
298 struct list_head destroy_list;
299 void (*free_mark)(struct fsnotify_mark *mark);
300};
301
302#ifdef CONFIG_FSNOTIFY
303
304
305
306
307extern int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is,
308 const unsigned char *name, u32 cookie);
309extern int __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask);
310extern void __fsnotify_inode_delete(struct inode *inode);
311extern void __fsnotify_vfsmount_delete(struct vfsmount *mnt);
312extern u32 fsnotify_get_cookie(void);
313
314static inline int fsnotify_inode_watches_children(struct inode *inode)
315{
316
317 if (!(inode->i_fsnotify_mask & FS_EVENT_ON_CHILD))
318 return 0;
319
320
321 return inode->i_fsnotify_mask & FS_EVENTS_POSS_ON_CHILD;
322}
323
324
325
326
327
328static inline void __fsnotify_update_dcache_flags(struct dentry *dentry)
329{
330 struct dentry *parent;
331
332 assert_spin_locked(&dentry->d_lock);
333
334
335
336
337
338
339
340
341 parent = dentry->d_parent;
342 if (parent->d_inode && fsnotify_inode_watches_children(parent->d_inode))
343 dentry->d_flags |= DCACHE_FSNOTIFY_PARENT_WATCHED;
344 else
345 dentry->d_flags &= ~DCACHE_FSNOTIFY_PARENT_WATCHED;
346}
347
348
349
350
351static inline void __fsnotify_d_instantiate(struct dentry *dentry, struct inode *inode)
352{
353 if (!inode)
354 return;
355
356 spin_lock(&dentry->d_lock);
357 __fsnotify_update_dcache_flags(dentry);
358 spin_unlock(&dentry->d_lock);
359}
360
361
362
363
364extern struct fsnotify_group *fsnotify_alloc_group(const struct fsnotify_ops *ops);
365
366extern void fsnotify_put_group(struct fsnotify_group *group);
367
368
369extern void fsnotify_get_event(struct fsnotify_event *event);
370extern void fsnotify_put_event(struct fsnotify_event *event);
371
372extern struct fsnotify_event_private_data *fsnotify_remove_priv_from_event(struct fsnotify_group *group,
373 struct fsnotify_event *event);
374
375
376extern struct fsnotify_event *fsnotify_add_notify_event(struct fsnotify_group *group,
377 struct fsnotify_event *event,
378 struct fsnotify_event_private_data *priv,
379 struct fsnotify_event *(*merge)(struct list_head *,
380 struct fsnotify_event *));
381
382extern bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group);
383
384extern struct fsnotify_event *fsnotify_peek_notify_event(struct fsnotify_group *group);
385
386extern struct fsnotify_event *fsnotify_remove_notify_event(struct fsnotify_group *group);
387
388
389
390
391extern void fsnotify_recalc_vfsmount_mask(struct vfsmount *mnt);
392
393extern void fsnotify_recalc_inode_mask(struct inode *inode);
394extern void fsnotify_init_mark(struct fsnotify_mark *mark, void (*free_mark)(struct fsnotify_mark *mark));
395
396extern struct fsnotify_mark *fsnotify_find_inode_mark(struct fsnotify_group *group, struct inode *inode);
397
398extern struct fsnotify_mark *fsnotify_find_vfsmount_mark(struct fsnotify_group *group, struct vfsmount *mnt);
399
400extern void fsnotify_duplicate_mark(struct fsnotify_mark *new, struct fsnotify_mark *old);
401
402extern void fsnotify_set_mark_ignored_mask_locked(struct fsnotify_mark *mark, __u32 mask);
403
404extern void fsnotify_set_mark_mask_locked(struct fsnotify_mark *mark, __u32 mask);
405
406extern int fsnotify_add_mark(struct fsnotify_mark *mark, struct fsnotify_group *group,
407 struct inode *inode, struct vfsmount *mnt, int allow_dups);
408
409extern void fsnotify_destroy_mark(struct fsnotify_mark *mark);
410
411extern void fsnotify_clear_vfsmount_marks_by_group(struct fsnotify_group *group);
412
413extern void fsnotify_clear_inode_marks_by_group(struct fsnotify_group *group);
414
415extern void fsnotify_clear_marks_by_group_flags(struct fsnotify_group *group, unsigned int flags);
416
417extern void fsnotify_clear_marks_by_group(struct fsnotify_group *group);
418extern void fsnotify_get_mark(struct fsnotify_mark *mark);
419extern void fsnotify_put_mark(struct fsnotify_mark *mark);
420extern void fsnotify_unmount_inodes(struct list_head *list);
421
422
423extern struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask,
424 void *data, int data_is,
425 const unsigned char *name,
426 u32 cookie, gfp_t gfp);
427
428
429extern struct fsnotify_event *fsnotify_clone_event(struct fsnotify_event *old_event);
430extern int fsnotify_replace_event(struct fsnotify_event_holder *old_holder,
431 struct fsnotify_event *new_event);
432
433#else
434
435static inline int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is,
436 const unsigned char *name, u32 cookie)
437{
438 return 0;
439}
440
441static inline int __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask)
442{
443 return 0;
444}
445
446static inline void __fsnotify_inode_delete(struct inode *inode)
447{}
448
449static inline void __fsnotify_vfsmount_delete(struct vfsmount *mnt)
450{}
451
452static inline void __fsnotify_update_dcache_flags(struct dentry *dentry)
453{}
454
455static inline void __fsnotify_d_instantiate(struct dentry *dentry, struct inode *inode)
456{}
457
458static inline u32 fsnotify_get_cookie(void)
459{
460 return 0;
461}
462
463static inline void fsnotify_unmount_inodes(struct list_head *list)
464{}
465
466#endif
467
468#endif
469
470#endif
471