This source file includes following definitions.
- fsnotify_valid_obj_type
- fsnotify_iter_should_report_type
- fsnotify_iter_set_report_type
- fsnotify_iter_set_report_type_mark
- fsnotify_inode_watches_children
- fsnotify_update_flags
- fsnotify_queue_overflow
- fsnotify_add_inode_mark
- fsnotify_add_inode_mark_locked
- fsnotify_clear_vfsmount_marks_by_group
- fsnotify_clear_inode_marks_by_group
- fsnotify_clear_sb_marks_by_group
- fsnotify_init_event
- fsnotify
- __fsnotify_parent
- __fsnotify_inode_delete
- __fsnotify_vfsmount_delete
- fsnotify_sb_delete
- fsnotify_update_flags
- fsnotify_get_cookie
- fsnotify_unmount_inodes
1
2
3
4
5
6
7
8 #ifndef __LINUX_FSNOTIFY_BACKEND_H
9 #define __LINUX_FSNOTIFY_BACKEND_H
10
11 #ifdef __KERNEL__
12
13 #include <linux/idr.h>
14 #include <linux/fs.h>
15 #include <linux/list.h>
16 #include <linux/path.h>
17 #include <linux/spinlock.h>
18 #include <linux/types.h>
19 #include <linux/atomic.h>
20 #include <linux/user_namespace.h>
21 #include <linux/refcount.h>
22
23
24
25
26
27
28
29 #define FS_ACCESS 0x00000001
30 #define FS_MODIFY 0x00000002
31 #define FS_ATTRIB 0x00000004
32 #define FS_CLOSE_WRITE 0x00000008
33 #define FS_CLOSE_NOWRITE 0x00000010
34 #define FS_OPEN 0x00000020
35 #define FS_MOVED_FROM 0x00000040
36 #define FS_MOVED_TO 0x00000080
37 #define FS_CREATE 0x00000100
38 #define FS_DELETE 0x00000200
39 #define FS_DELETE_SELF 0x00000400
40 #define FS_MOVE_SELF 0x00000800
41 #define FS_OPEN_EXEC 0x00001000
42
43 #define FS_UNMOUNT 0x00002000
44 #define FS_Q_OVERFLOW 0x00004000
45 #define FS_IN_IGNORED 0x00008000
46
47 #define FS_OPEN_PERM 0x00010000
48 #define FS_ACCESS_PERM 0x00020000
49 #define FS_OPEN_EXEC_PERM 0x00040000
50
51 #define FS_EXCL_UNLINK 0x04000000
52 #define FS_ISDIR 0x40000000
53 #define FS_IN_ONESHOT 0x80000000
54
55 #define FS_DN_RENAME 0x10000000
56 #define FS_DN_MULTISHOT 0x20000000
57
58
59
60 #define FS_EVENT_ON_CHILD 0x08000000
61
62 #define FS_MOVE (FS_MOVED_FROM | FS_MOVED_TO)
63
64
65
66
67
68
69
70 #define ALL_FSNOTIFY_DIRENT_EVENTS (FS_CREATE | FS_DELETE | FS_MOVE)
71
72 #define ALL_FSNOTIFY_PERM_EVENTS (FS_OPEN_PERM | FS_ACCESS_PERM | \
73 FS_OPEN_EXEC_PERM)
74
75
76
77
78
79 #define FS_EVENTS_POSS_ON_CHILD (ALL_FSNOTIFY_PERM_EVENTS | \
80 FS_ACCESS | FS_MODIFY | FS_ATTRIB | \
81 FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | \
82 FS_OPEN | FS_OPEN_EXEC)
83
84
85 #define ALL_FSNOTIFY_EVENTS (ALL_FSNOTIFY_DIRENT_EVENTS | \
86 FS_EVENTS_POSS_ON_CHILD | \
87 FS_DELETE_SELF | FS_MOVE_SELF | FS_DN_RENAME | \
88 FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED)
89
90
91 #define ALL_FSNOTIFY_FLAGS (FS_EXCL_UNLINK | FS_ISDIR | FS_IN_ONESHOT | \
92 FS_DN_MULTISHOT | FS_EVENT_ON_CHILD)
93
94 #define ALL_FSNOTIFY_BITS (ALL_FSNOTIFY_EVENTS | ALL_FSNOTIFY_FLAGS)
95
96 struct fsnotify_group;
97 struct fsnotify_event;
98 struct fsnotify_mark;
99 struct fsnotify_event_private_data;
100 struct fsnotify_fname;
101 struct fsnotify_iter_info;
102
103 struct mem_cgroup;
104
105
106
107
108
109
110
111
112
113
114
115
116 struct fsnotify_ops {
117 int (*handle_event)(struct fsnotify_group *group,
118 struct inode *inode,
119 u32 mask, const void *data, int data_type,
120 const struct qstr *file_name, u32 cookie,
121 struct fsnotify_iter_info *iter_info);
122 void (*free_group_priv)(struct fsnotify_group *group);
123 void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group);
124 void (*free_event)(struct fsnotify_event *event);
125
126 void (*free_mark)(struct fsnotify_mark *mark);
127 };
128
129
130
131
132
133
134 struct fsnotify_event {
135 struct list_head list;
136 unsigned long objectid;
137 };
138
139
140
141
142
143
144
145 struct fsnotify_group {
146 const struct fsnotify_ops *ops;
147
148
149
150
151
152
153
154
155
156 refcount_t refcnt;
157
158
159 spinlock_t notification_lock;
160 struct list_head notification_list;
161 wait_queue_head_t notification_waitq;
162 unsigned int q_len;
163 unsigned int max_events;
164
165
166
167
168 #define FS_PRIO_0 0
169 #define FS_PRIO_1 1
170 #define FS_PRIO_2 2
171 unsigned int priority;
172 bool shutdown;
173
174
175 struct mutex mark_mutex;
176 atomic_t num_marks;
177
178
179 atomic_t user_waits;
180
181 struct list_head marks_list;
182
183 struct fasync_struct *fsn_fa;
184
185 struct fsnotify_event *overflow_event;
186
187
188
189 struct mem_cgroup *memcg;
190
191
192 union {
193 void *private;
194 #ifdef CONFIG_INOTIFY_USER
195 struct inotify_group_private_data {
196 spinlock_t idr_lock;
197 struct idr idr;
198 struct ucounts *ucounts;
199 } inotify_data;
200 #endif
201 #ifdef CONFIG_FANOTIFY
202 struct fanotify_group_private_data {
203
204 struct list_head access_list;
205 wait_queue_head_t access_waitq;
206 int flags;
207 int f_flags;
208 unsigned int max_marks;
209 struct user_struct *user;
210 } fanotify_data;
211 #endif
212 };
213 };
214
215
216 #define FSNOTIFY_EVENT_NONE 0
217 #define FSNOTIFY_EVENT_PATH 1
218 #define FSNOTIFY_EVENT_INODE 2
219
220 enum fsnotify_obj_type {
221 FSNOTIFY_OBJ_TYPE_INODE,
222 FSNOTIFY_OBJ_TYPE_VFSMOUNT,
223 FSNOTIFY_OBJ_TYPE_SB,
224 FSNOTIFY_OBJ_TYPE_COUNT,
225 FSNOTIFY_OBJ_TYPE_DETACHED = FSNOTIFY_OBJ_TYPE_COUNT
226 };
227
228 #define FSNOTIFY_OBJ_TYPE_INODE_FL (1U << FSNOTIFY_OBJ_TYPE_INODE)
229 #define FSNOTIFY_OBJ_TYPE_VFSMOUNT_FL (1U << FSNOTIFY_OBJ_TYPE_VFSMOUNT)
230 #define FSNOTIFY_OBJ_TYPE_SB_FL (1U << FSNOTIFY_OBJ_TYPE_SB)
231 #define FSNOTIFY_OBJ_ALL_TYPES_MASK ((1U << FSNOTIFY_OBJ_TYPE_COUNT) - 1)
232
233 static inline bool fsnotify_valid_obj_type(unsigned int type)
234 {
235 return (type < FSNOTIFY_OBJ_TYPE_COUNT);
236 }
237
238 struct fsnotify_iter_info {
239 struct fsnotify_mark *marks[FSNOTIFY_OBJ_TYPE_COUNT];
240 unsigned int report_mask;
241 int srcu_idx;
242 };
243
244 static inline bool fsnotify_iter_should_report_type(
245 struct fsnotify_iter_info *iter_info, int type)
246 {
247 return (iter_info->report_mask & (1U << type));
248 }
249
250 static inline void fsnotify_iter_set_report_type(
251 struct fsnotify_iter_info *iter_info, int type)
252 {
253 iter_info->report_mask |= (1U << type);
254 }
255
256 static inline void fsnotify_iter_set_report_type_mark(
257 struct fsnotify_iter_info *iter_info, int type,
258 struct fsnotify_mark *mark)
259 {
260 iter_info->marks[type] = mark;
261 iter_info->report_mask |= (1U << type);
262 }
263
264 #define FSNOTIFY_ITER_FUNCS(name, NAME) \
265 static inline struct fsnotify_mark *fsnotify_iter_##name##_mark( \
266 struct fsnotify_iter_info *iter_info) \
267 { \
268 return (iter_info->report_mask & FSNOTIFY_OBJ_TYPE_##NAME##_FL) ? \
269 iter_info->marks[FSNOTIFY_OBJ_TYPE_##NAME] : NULL; \
270 }
271
272 FSNOTIFY_ITER_FUNCS(inode, INODE)
273 FSNOTIFY_ITER_FUNCS(vfsmount, VFSMOUNT)
274 FSNOTIFY_ITER_FUNCS(sb, SB)
275
276 #define fsnotify_foreach_obj_type(type) \
277 for (type = 0; type < FSNOTIFY_OBJ_TYPE_COUNT; type++)
278
279
280
281
282
283 struct fsnotify_mark_connector;
284 typedef struct fsnotify_mark_connector __rcu *fsnotify_connp_t;
285
286
287
288
289
290
291
292 struct fsnotify_mark_connector {
293 spinlock_t lock;
294 unsigned short type;
295 #define FSNOTIFY_CONN_FLAG_HAS_FSID 0x01
296 unsigned short flags;
297 __kernel_fsid_t fsid;
298 union {
299
300 fsnotify_connp_t *obj;
301
302 struct fsnotify_mark_connector *destroy_next;
303 };
304 struct hlist_head list;
305 };
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321 struct fsnotify_mark {
322
323 __u32 mask;
324
325
326 refcount_t refcnt;
327
328
329 struct fsnotify_group *group;
330
331
332
333 struct list_head g_list;
334
335 spinlock_t lock;
336
337 struct hlist_node obj_list;
338
339 struct fsnotify_mark_connector *connector;
340
341 __u32 ignored_mask;
342 #define FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY 0x01
343 #define FSNOTIFY_MARK_FLAG_ALIVE 0x02
344 #define FSNOTIFY_MARK_FLAG_ATTACHED 0x04
345 unsigned int flags;
346 };
347
348 #ifdef CONFIG_FSNOTIFY
349
350
351
352
353 extern int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
354 const struct qstr *name, u32 cookie);
355 extern int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask);
356 extern void __fsnotify_inode_delete(struct inode *inode);
357 extern void __fsnotify_vfsmount_delete(struct vfsmount *mnt);
358 extern void fsnotify_sb_delete(struct super_block *sb);
359 extern u32 fsnotify_get_cookie(void);
360
361 static inline int fsnotify_inode_watches_children(struct inode *inode)
362 {
363
364 if (!(inode->i_fsnotify_mask & FS_EVENT_ON_CHILD))
365 return 0;
366
367
368 return inode->i_fsnotify_mask & FS_EVENTS_POSS_ON_CHILD;
369 }
370
371
372
373
374
375 static inline void fsnotify_update_flags(struct dentry *dentry)
376 {
377 assert_spin_locked(&dentry->d_lock);
378
379
380
381
382
383
384
385
386 if (fsnotify_inode_watches_children(dentry->d_parent->d_inode))
387 dentry->d_flags |= DCACHE_FSNOTIFY_PARENT_WATCHED;
388 else
389 dentry->d_flags &= ~DCACHE_FSNOTIFY_PARENT_WATCHED;
390 }
391
392
393
394
395 extern struct fsnotify_group *fsnotify_alloc_group(const struct fsnotify_ops *ops);
396
397 extern void fsnotify_get_group(struct fsnotify_group *group);
398
399 extern void fsnotify_put_group(struct fsnotify_group *group);
400
401 extern void fsnotify_group_stop_queueing(struct fsnotify_group *group);
402
403 extern void fsnotify_destroy_group(struct fsnotify_group *group);
404
405 extern int fsnotify_fasync(int fd, struct file *file, int on);
406
407 extern void fsnotify_destroy_event(struct fsnotify_group *group,
408 struct fsnotify_event *event);
409
410 extern int fsnotify_add_event(struct fsnotify_group *group,
411 struct fsnotify_event *event,
412 int (*merge)(struct list_head *,
413 struct fsnotify_event *));
414
415 static inline void fsnotify_queue_overflow(struct fsnotify_group *group)
416 {
417 fsnotify_add_event(group, group->overflow_event, NULL);
418 }
419
420
421 extern bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group);
422
423 extern struct fsnotify_event *fsnotify_peek_first_event(struct fsnotify_group *group);
424
425 extern struct fsnotify_event *fsnotify_remove_first_event(struct fsnotify_group *group);
426
427 extern void fsnotify_remove_queued_event(struct fsnotify_group *group,
428 struct fsnotify_event *event);
429
430
431
432
433 extern __u32 fsnotify_conn_mask(struct fsnotify_mark_connector *conn);
434
435 extern void fsnotify_recalc_mask(struct fsnotify_mark_connector *conn);
436 extern void fsnotify_init_mark(struct fsnotify_mark *mark,
437 struct fsnotify_group *group);
438
439 extern struct fsnotify_mark *fsnotify_find_mark(fsnotify_connp_t *connp,
440 struct fsnotify_group *group);
441
442 extern int fsnotify_get_conn_fsid(const struct fsnotify_mark_connector *conn,
443 __kernel_fsid_t *fsid);
444
445 extern int fsnotify_add_mark(struct fsnotify_mark *mark,
446 fsnotify_connp_t *connp, unsigned int type,
447 int allow_dups, __kernel_fsid_t *fsid);
448 extern int fsnotify_add_mark_locked(struct fsnotify_mark *mark,
449 fsnotify_connp_t *connp,
450 unsigned int type, int allow_dups,
451 __kernel_fsid_t *fsid);
452
453
454 static inline int fsnotify_add_inode_mark(struct fsnotify_mark *mark,
455 struct inode *inode,
456 int allow_dups)
457 {
458 return fsnotify_add_mark(mark, &inode->i_fsnotify_marks,
459 FSNOTIFY_OBJ_TYPE_INODE, allow_dups, NULL);
460 }
461 static inline int fsnotify_add_inode_mark_locked(struct fsnotify_mark *mark,
462 struct inode *inode,
463 int allow_dups)
464 {
465 return fsnotify_add_mark_locked(mark, &inode->i_fsnotify_marks,
466 FSNOTIFY_OBJ_TYPE_INODE, allow_dups,
467 NULL);
468 }
469
470
471 extern void fsnotify_destroy_mark(struct fsnotify_mark *mark,
472 struct fsnotify_group *group);
473
474 extern void fsnotify_detach_mark(struct fsnotify_mark *mark);
475
476 extern void fsnotify_free_mark(struct fsnotify_mark *mark);
477
478 extern void fsnotify_wait_marks_destroyed(void);
479
480 extern void fsnotify_clear_marks_by_group(struct fsnotify_group *group, unsigned int type);
481
482 static inline void fsnotify_clear_vfsmount_marks_by_group(struct fsnotify_group *group)
483 {
484 fsnotify_clear_marks_by_group(group, FSNOTIFY_OBJ_TYPE_VFSMOUNT_FL);
485 }
486
487 static inline void fsnotify_clear_inode_marks_by_group(struct fsnotify_group *group)
488 {
489 fsnotify_clear_marks_by_group(group, FSNOTIFY_OBJ_TYPE_INODE_FL);
490 }
491
492 static inline void fsnotify_clear_sb_marks_by_group(struct fsnotify_group *group)
493 {
494 fsnotify_clear_marks_by_group(group, FSNOTIFY_OBJ_TYPE_SB_FL);
495 }
496 extern void fsnotify_get_mark(struct fsnotify_mark *mark);
497 extern void fsnotify_put_mark(struct fsnotify_mark *mark);
498 extern void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info);
499 extern bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info);
500
501 static inline void fsnotify_init_event(struct fsnotify_event *event,
502 unsigned long objectid)
503 {
504 INIT_LIST_HEAD(&event->list);
505 event->objectid = objectid;
506 }
507
508 #else
509
510 static inline int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
511 const struct qstr *name, u32 cookie)
512 {
513 return 0;
514 }
515
516 static inline int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask)
517 {
518 return 0;
519 }
520
521 static inline void __fsnotify_inode_delete(struct inode *inode)
522 {}
523
524 static inline void __fsnotify_vfsmount_delete(struct vfsmount *mnt)
525 {}
526
527 static inline void fsnotify_sb_delete(struct super_block *sb)
528 {}
529
530 static inline void fsnotify_update_flags(struct dentry *dentry)
531 {}
532
533 static inline u32 fsnotify_get_cookie(void)
534 {
535 return 0;
536 }
537
538 static inline void fsnotify_unmount_inodes(struct super_block *sb)
539 {}
540
541 #endif
542
543 #endif
544
545 #endif