diff options
Diffstat (limited to 'include/linux/fsnotify_backend.h')
-rw-r--r-- | include/linux/fsnotify_backend.h | 199 |
1 files changed, 132 insertions, 67 deletions
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 4d6f47b51189..ed36fb57c426 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h | |||
@@ -41,6 +41,10 @@ | |||
41 | #define FS_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ | 41 | #define FS_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ |
42 | #define FS_IN_IGNORED 0x00008000 /* last inotify event here */ | 42 | #define FS_IN_IGNORED 0x00008000 /* last inotify event here */ |
43 | 43 | ||
44 | #define FS_OPEN_PERM 0x00010000 /* open event in an permission hook */ | ||
45 | #define FS_ACCESS_PERM 0x00020000 /* access event in a permissions hook */ | ||
46 | |||
47 | #define FS_EXCL_UNLINK 0x04000000 /* do not send events if object is unlinked */ | ||
44 | #define FS_IN_ISDIR 0x40000000 /* event occurred against dir */ | 48 | #define FS_IN_ISDIR 0x40000000 /* event occurred against dir */ |
45 | #define FS_IN_ONESHOT 0x80000000 /* only send event once */ | 49 | #define FS_IN_ONESHOT 0x80000000 /* only send event once */ |
46 | 50 | ||
@@ -58,13 +62,20 @@ | |||
58 | FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE |\ | 62 | FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE |\ |
59 | FS_DELETE) | 63 | FS_DELETE) |
60 | 64 | ||
61 | /* listeners that hard code group numbers near the top */ | 65 | #define FS_MOVE (FS_MOVED_FROM | FS_MOVED_TO) |
62 | #define DNOTIFY_GROUP_NUM UINT_MAX | 66 | |
63 | #define INOTIFY_GROUP_NUM (DNOTIFY_GROUP_NUM-1) | 67 | #define ALL_FSNOTIFY_EVENTS (FS_ACCESS | FS_MODIFY | FS_ATTRIB | \ |
68 | FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN | \ | ||
69 | FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE | \ | ||
70 | FS_DELETE | FS_DELETE_SELF | FS_MOVE_SELF | \ | ||
71 | FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED | \ | ||
72 | FS_OPEN_PERM | FS_ACCESS_PERM | FS_EXCL_UNLINK | \ | ||
73 | FS_IN_ISDIR | FS_IN_ONESHOT | FS_DN_RENAME | \ | ||
74 | FS_DN_MULTISHOT | FS_EVENT_ON_CHILD) | ||
64 | 75 | ||
65 | struct fsnotify_group; | 76 | struct fsnotify_group; |
66 | struct fsnotify_event; | 77 | struct fsnotify_event; |
67 | struct fsnotify_mark_entry; | 78 | struct fsnotify_mark; |
68 | struct fsnotify_event_private_data; | 79 | struct fsnotify_event_private_data; |
69 | 80 | ||
70 | /* | 81 | /* |
@@ -80,10 +91,16 @@ struct fsnotify_event_private_data; | |||
80 | * valid group and inode to use to clean up. | 91 | * valid group and inode to use to clean up. |
81 | */ | 92 | */ |
82 | struct fsnotify_ops { | 93 | struct fsnotify_ops { |
83 | bool (*should_send_event)(struct fsnotify_group *group, struct inode *inode, __u32 mask); | 94 | bool (*should_send_event)(struct fsnotify_group *group, struct inode *inode, |
84 | int (*handle_event)(struct fsnotify_group *group, struct fsnotify_event *event); | 95 | struct fsnotify_mark *inode_mark, |
96 | struct fsnotify_mark *vfsmount_mark, | ||
97 | __u32 mask, void *data, int data_type); | ||
98 | int (*handle_event)(struct fsnotify_group *group, | ||
99 | struct fsnotify_mark *inode_mark, | ||
100 | struct fsnotify_mark *vfsmount_mark, | ||
101 | struct fsnotify_event *event); | ||
85 | void (*free_group_priv)(struct fsnotify_group *group); | 102 | void (*free_group_priv)(struct fsnotify_group *group); |
86 | void (*freeing_mark)(struct fsnotify_mark_entry *entry, struct fsnotify_group *group); | 103 | void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group); |
87 | void (*free_event_priv)(struct fsnotify_event_private_data *priv); | 104 | void (*free_event_priv)(struct fsnotify_event_private_data *priv); |
88 | }; | 105 | }; |
89 | 106 | ||
@@ -95,22 +112,6 @@ struct fsnotify_ops { | |||
95 | */ | 112 | */ |
96 | struct fsnotify_group { | 113 | struct fsnotify_group { |
97 | /* | 114 | /* |
98 | * global list of all groups receiving events from fsnotify. | ||
99 | * anchored by fsnotify_groups and protected by either fsnotify_grp_mutex | ||
100 | * or fsnotify_grp_srcu depending on write vs read. | ||
101 | */ | ||
102 | struct list_head group_list; | ||
103 | |||
104 | /* | ||
105 | * Defines all of the event types in which this group is interested. | ||
106 | * This mask is a bitwise OR of the FS_* events from above. Each time | ||
107 | * this mask changes for a group (if it changes) the correct functions | ||
108 | * must be called to update the global structures which indicate global | ||
109 | * interest in event types. | ||
110 | */ | ||
111 | __u32 mask; | ||
112 | |||
113 | /* | ||
114 | * How the refcnt is used is up to each group. When the refcnt hits 0 | 115 | * How the refcnt is used is up to each group. When the refcnt hits 0 |
115 | * fsnotify will clean up all of the resources associated with this group. | 116 | * fsnotify will clean up all of the resources associated with this group. |
116 | * As an example, the dnotify group will always have a refcnt=1 and that | 117 | * As an example, the dnotify group will always have a refcnt=1 and that |
@@ -119,7 +120,6 @@ struct fsnotify_group { | |||
119 | * closed. | 120 | * closed. |
120 | */ | 121 | */ |
121 | atomic_t refcnt; /* things with interest in this group */ | 122 | atomic_t refcnt; /* things with interest in this group */ |
122 | unsigned int group_num; /* simply prevents accidental group collision */ | ||
123 | 123 | ||
124 | const struct fsnotify_ops *ops; /* how this group handles things */ | 124 | const struct fsnotify_ops *ops; /* how this group handles things */ |
125 | 125 | ||
@@ -130,15 +130,12 @@ struct fsnotify_group { | |||
130 | unsigned int q_len; /* events on the queue */ | 130 | unsigned int q_len; /* events on the queue */ |
131 | unsigned int max_events; /* maximum events allowed on the list */ | 131 | unsigned int max_events; /* maximum events allowed on the list */ |
132 | 132 | ||
133 | /* stores all fastapth entries assoc with this group so they can be cleaned on unregister */ | 133 | /* stores all fastpath marks assoc with this group so they can be cleaned on unregister */ |
134 | spinlock_t mark_lock; /* protect mark_entries list */ | 134 | spinlock_t mark_lock; /* protect marks_list */ |
135 | atomic_t num_marks; /* 1 for each mark entry and 1 for not being | 135 | atomic_t num_marks; /* 1 for each mark and 1 for not being |
136 | * past the point of no return when freeing | 136 | * past the point of no return when freeing |
137 | * a group */ | 137 | * a group */ |
138 | struct list_head mark_entries; /* all inode mark entries for this group */ | 138 | struct list_head marks_list; /* all inode marks for this group */ |
139 | |||
140 | /* prevents double list_del of group_list. protected by global fsnotify_grp_mutex */ | ||
141 | bool on_group_list; | ||
142 | 139 | ||
143 | /* groups can define private fields here or use the void *private */ | 140 | /* groups can define private fields here or use the void *private */ |
144 | union { | 141 | union { |
@@ -152,6 +149,17 @@ struct fsnotify_group { | |||
152 | struct user_struct *user; | 149 | struct user_struct *user; |
153 | } inotify_data; | 150 | } inotify_data; |
154 | #endif | 151 | #endif |
152 | #ifdef CONFIG_FANOTIFY | ||
153 | struct fanotify_group_private_data { | ||
154 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS | ||
155 | /* allows a group to block waiting for a userspace response */ | ||
156 | struct mutex access_mutex; | ||
157 | struct list_head access_list; | ||
158 | wait_queue_head_t access_waitq; | ||
159 | #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */ | ||
160 | int f_flags; | ||
161 | } fanotify_data; | ||
162 | #endif /* CONFIG_FANOTIFY */ | ||
155 | }; | 163 | }; |
156 | }; | 164 | }; |
157 | 165 | ||
@@ -210,20 +218,42 @@ struct fsnotify_event { | |||
210 | #define FSNOTIFY_EVENT_NONE 0 | 218 | #define FSNOTIFY_EVENT_NONE 0 |
211 | #define FSNOTIFY_EVENT_PATH 1 | 219 | #define FSNOTIFY_EVENT_PATH 1 |
212 | #define FSNOTIFY_EVENT_INODE 2 | 220 | #define FSNOTIFY_EVENT_INODE 2 |
213 | #define FSNOTIFY_EVENT_FILE 3 | ||
214 | int data_type; /* which of the above union we have */ | 221 | int data_type; /* which of the above union we have */ |
215 | atomic_t refcnt; /* how many groups still are using/need to send this event */ | 222 | atomic_t refcnt; /* how many groups still are using/need to send this event */ |
216 | __u32 mask; /* the type of access, bitwise OR for FS_* event types */ | 223 | __u32 mask; /* the type of access, bitwise OR for FS_* event types */ |
217 | 224 | ||
218 | u32 sync_cookie; /* used to corrolate events, namely inotify mv events */ | 225 | u32 sync_cookie; /* used to corrolate events, namely inotify mv events */ |
219 | char *file_name; | 226 | const unsigned char *file_name; |
220 | size_t name_len; | 227 | size_t name_len; |
228 | struct pid *tgid; | ||
229 | |||
230 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS | ||
231 | __u32 response; /* userspace answer to question */ | ||
232 | #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */ | ||
221 | 233 | ||
222 | struct list_head private_data_list; /* groups can store private data here */ | 234 | struct list_head private_data_list; /* groups can store private data here */ |
223 | }; | 235 | }; |
224 | 236 | ||
225 | /* | 237 | /* |
226 | * a mark is simply an entry attached to an in core inode which allows an | 238 | * Inode specific fields in an fsnotify_mark |
239 | */ | ||
240 | struct fsnotify_inode_mark { | ||
241 | struct inode *inode; /* inode this mark is associated with */ | ||
242 | struct hlist_node i_list; /* list of marks by inode->i_fsnotify_marks */ | ||
243 | struct list_head free_i_list; /* tmp list used when freeing this mark */ | ||
244 | }; | ||
245 | |||
246 | /* | ||
247 | * Mount point specific fields in an fsnotify_mark | ||
248 | */ | ||
249 | struct fsnotify_vfsmount_mark { | ||
250 | struct vfsmount *mnt; /* vfsmount this mark is associated with */ | ||
251 | struct hlist_node m_list; /* list of marks by inode->i_fsnotify_marks */ | ||
252 | struct list_head free_m_list; /* tmp list used when freeing this mark */ | ||
253 | }; | ||
254 | |||
255 | /* | ||
256 | * a mark is simply an object attached to an in core inode which allows an | ||
227 | * fsnotify listener to indicate they are either no longer interested in events | 257 | * fsnotify listener to indicate they are either no longer interested in events |
228 | * of a type matching mask or only interested in those events. | 258 | * of a type matching mask or only interested in those events. |
229 | * | 259 | * |
@@ -232,19 +262,28 @@ struct fsnotify_event { | |||
232 | * (such as dnotify) will flush these when the open fd is closed and not at | 262 | * (such as dnotify) will flush these when the open fd is closed and not at |
233 | * inode eviction or modification. | 263 | * inode eviction or modification. |
234 | */ | 264 | */ |
235 | struct fsnotify_mark_entry { | 265 | struct fsnotify_mark { |
236 | __u32 mask; /* mask this mark entry is for */ | 266 | __u32 mask; /* mask this mark is for */ |
237 | /* we hold ref for each i_list and g_list. also one ref for each 'thing' | 267 | /* we hold ref for each i_list and g_list. also one ref for each 'thing' |
238 | * in kernel that found and may be using this mark. */ | 268 | * in kernel that found and may be using this mark. */ |
239 | atomic_t refcnt; /* active things looking at this mark */ | 269 | atomic_t refcnt; /* active things looking at this mark */ |
240 | struct inode *inode; /* inode this entry is associated with */ | 270 | struct fsnotify_group *group; /* group this mark is for */ |
241 | struct fsnotify_group *group; /* group this mark entry is for */ | 271 | struct list_head g_list; /* list of marks by group->i_fsnotify_marks */ |
242 | struct hlist_node i_list; /* list of mark_entries by inode->i_fsnotify_mark_entries */ | 272 | spinlock_t lock; /* protect group and inode */ |
243 | struct list_head g_list; /* list of mark_entries by group->i_fsnotify_mark_entries */ | 273 | union { |
244 | spinlock_t lock; /* protect group, inode, and killme */ | 274 | struct fsnotify_inode_mark i; |
245 | struct list_head free_i_list; /* tmp list used when freeing this mark */ | 275 | struct fsnotify_vfsmount_mark m; |
276 | }; | ||
277 | __u32 ignored_mask; /* events types to ignore */ | ||
246 | struct list_head free_g_list; /* tmp list used when freeing this mark */ | 278 | struct list_head free_g_list; /* tmp list used when freeing this mark */ |
247 | void (*free_mark)(struct fsnotify_mark_entry *entry); /* called on final put+free */ | 279 | #define FSNOTIFY_MARK_FLAG_INODE 0x01 |
280 | #define FSNOTIFY_MARK_FLAG_VFSMOUNT 0x02 | ||
281 | #define FSNOTIFY_MARK_FLAG_OBJECT_PINNED 0x04 | ||
282 | #define FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY 0x08 | ||
283 | #define FSNOTIFY_MARK_FLAG_ALIVE 0x10 | ||
284 | unsigned int flags; /* vfsmount or inode mark? */ | ||
285 | struct list_head destroy_list; | ||
286 | void (*free_mark)(struct fsnotify_mark *mark); /* called on final put+free */ | ||
248 | }; | 287 | }; |
249 | 288 | ||
250 | #ifdef CONFIG_FSNOTIFY | 289 | #ifdef CONFIG_FSNOTIFY |
@@ -252,10 +291,11 @@ struct fsnotify_mark_entry { | |||
252 | /* called from the vfs helpers */ | 291 | /* called from the vfs helpers */ |
253 | 292 | ||
254 | /* main fsnotify call to send events */ | 293 | /* main fsnotify call to send events */ |
255 | extern void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, | 294 | extern int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, |
256 | const char *name, u32 cookie); | 295 | const unsigned char *name, u32 cookie); |
257 | extern void __fsnotify_parent(struct dentry *dentry, __u32 mask); | 296 | extern void __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask); |
258 | extern void __fsnotify_inode_delete(struct inode *inode); | 297 | extern void __fsnotify_inode_delete(struct inode *inode); |
298 | extern void __fsnotify_vfsmount_delete(struct vfsmount *mnt); | ||
259 | extern u32 fsnotify_get_cookie(void); | 299 | extern u32 fsnotify_get_cookie(void); |
260 | 300 | ||
261 | static inline int fsnotify_inode_watches_children(struct inode *inode) | 301 | static inline int fsnotify_inode_watches_children(struct inode *inode) |
@@ -304,15 +344,9 @@ static inline void __fsnotify_d_instantiate(struct dentry *dentry, struct inode | |||
304 | 344 | ||
305 | /* called from fsnotify listeners, such as fanotify or dnotify */ | 345 | /* called from fsnotify listeners, such as fanotify or dnotify */ |
306 | 346 | ||
307 | /* must call when a group changes its ->mask */ | ||
308 | extern void fsnotify_recalc_global_mask(void); | ||
309 | /* get a reference to an existing or create a new group */ | 347 | /* get a reference to an existing or create a new group */ |
310 | extern struct fsnotify_group *fsnotify_obtain_group(unsigned int group_num, | 348 | extern struct fsnotify_group *fsnotify_alloc_group(const struct fsnotify_ops *ops); |
311 | __u32 mask, | 349 | /* drop reference on a group from fsnotify_alloc_group */ |
312 | const struct fsnotify_ops *ops); | ||
313 | /* run all marks associated with this group and update group->mask */ | ||
314 | extern void fsnotify_recalc_group_mask(struct fsnotify_group *group); | ||
315 | /* drop reference on a group from fsnotify_obtain_group */ | ||
316 | extern void fsnotify_put_group(struct fsnotify_group *group); | 350 | extern void fsnotify_put_group(struct fsnotify_group *group); |
317 | 351 | ||
318 | /* take a reference to an event */ | 352 | /* take a reference to an event */ |
@@ -323,8 +357,11 @@ extern struct fsnotify_event_private_data *fsnotify_remove_priv_from_event(struc | |||
323 | struct fsnotify_event *event); | 357 | struct fsnotify_event *event); |
324 | 358 | ||
325 | /* attach the event to the group notification queue */ | 359 | /* attach the event to the group notification queue */ |
326 | extern int fsnotify_add_notify_event(struct fsnotify_group *group, struct fsnotify_event *event, | 360 | extern struct fsnotify_event *fsnotify_add_notify_event(struct fsnotify_group *group, |
327 | struct fsnotify_event_private_data *priv); | 361 | struct fsnotify_event *event, |
362 | struct fsnotify_event_private_data *priv, | ||
363 | struct fsnotify_event *(*merge)(struct list_head *, | ||
364 | struct fsnotify_event *)); | ||
328 | /* true if the group notification queue is empty */ | 365 | /* true if the group notification queue is empty */ |
329 | extern bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group); | 366 | extern bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group); |
330 | /* return, but do not dequeue the first event on the notification queue */ | 367 | /* return, but do not dequeue the first event on the notification queue */ |
@@ -334,38 +371,66 @@ extern struct fsnotify_event *fsnotify_remove_notify_event(struct fsnotify_group | |||
334 | 371 | ||
335 | /* functions used to manipulate the marks attached to inodes */ | 372 | /* functions used to manipulate the marks attached to inodes */ |
336 | 373 | ||
374 | /* run all marks associated with a vfsmount and update mnt->mnt_fsnotify_mask */ | ||
375 | extern void fsnotify_recalc_vfsmount_mask(struct vfsmount *mnt); | ||
337 | /* run all marks associated with an inode and update inode->i_fsnotify_mask */ | 376 | /* run all marks associated with an inode and update inode->i_fsnotify_mask */ |
338 | extern void fsnotify_recalc_inode_mask(struct inode *inode); | 377 | extern void fsnotify_recalc_inode_mask(struct inode *inode); |
339 | extern void fsnotify_init_mark(struct fsnotify_mark_entry *entry, void (*free_mark)(struct fsnotify_mark_entry *entry)); | 378 | extern void fsnotify_init_mark(struct fsnotify_mark *mark, void (*free_mark)(struct fsnotify_mark *mark)); |
340 | /* find (and take a reference) to a mark associated with group and inode */ | 379 | /* find (and take a reference) to a mark associated with group and inode */ |
341 | extern struct fsnotify_mark_entry *fsnotify_find_mark_entry(struct fsnotify_group *group, struct inode *inode); | 380 | extern struct fsnotify_mark *fsnotify_find_inode_mark(struct fsnotify_group *group, struct inode *inode); |
381 | /* find (and take a reference) to a mark associated with group and vfsmount */ | ||
382 | extern struct fsnotify_mark *fsnotify_find_vfsmount_mark(struct fsnotify_group *group, struct vfsmount *mnt); | ||
383 | /* copy the values from old into new */ | ||
384 | extern void fsnotify_duplicate_mark(struct fsnotify_mark *new, struct fsnotify_mark *old); | ||
385 | /* set the ignored_mask of a mark */ | ||
386 | extern void fsnotify_set_mark_ignored_mask_locked(struct fsnotify_mark *mark, __u32 mask); | ||
387 | /* set the mask of a mark (might pin the object into memory */ | ||
388 | extern void fsnotify_set_mark_mask_locked(struct fsnotify_mark *mark, __u32 mask); | ||
342 | /* attach the mark to both the group and the inode */ | 389 | /* attach the mark to both the group and the inode */ |
343 | extern int fsnotify_add_mark(struct fsnotify_mark_entry *entry, struct fsnotify_group *group, struct inode *inode); | 390 | extern int fsnotify_add_mark(struct fsnotify_mark *mark, struct fsnotify_group *group, |
391 | struct inode *inode, struct vfsmount *mnt, int allow_dups); | ||
344 | /* given a mark, flag it to be freed when all references are dropped */ | 392 | /* given a mark, flag it to be freed when all references are dropped */ |
345 | extern void fsnotify_destroy_mark_by_entry(struct fsnotify_mark_entry *entry); | 393 | extern void fsnotify_destroy_mark(struct fsnotify_mark *mark); |
394 | /* run all the marks in a group, and clear all of the vfsmount marks */ | ||
395 | extern void fsnotify_clear_vfsmount_marks_by_group(struct fsnotify_group *group); | ||
396 | /* run all the marks in a group, and clear all of the inode marks */ | ||
397 | extern void fsnotify_clear_inode_marks_by_group(struct fsnotify_group *group); | ||
398 | /* run all the marks in a group, and clear all of the marks where mark->flags & flags is true*/ | ||
399 | extern void fsnotify_clear_marks_by_group_flags(struct fsnotify_group *group, unsigned int flags); | ||
346 | /* run all the marks in a group, and flag them to be freed */ | 400 | /* run all the marks in a group, and flag them to be freed */ |
347 | extern void fsnotify_clear_marks_by_group(struct fsnotify_group *group); | 401 | extern void fsnotify_clear_marks_by_group(struct fsnotify_group *group); |
348 | extern void fsnotify_get_mark(struct fsnotify_mark_entry *entry); | 402 | extern void fsnotify_get_mark(struct fsnotify_mark *mark); |
349 | extern void fsnotify_put_mark(struct fsnotify_mark_entry *entry); | 403 | extern void fsnotify_put_mark(struct fsnotify_mark *mark); |
350 | extern void fsnotify_unmount_inodes(struct list_head *list); | 404 | extern void fsnotify_unmount_inodes(struct list_head *list); |
351 | 405 | ||
352 | /* put here because inotify does some weird stuff when destroying watches */ | 406 | /* put here because inotify does some weird stuff when destroying watches */ |
353 | extern struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, | 407 | extern struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, |
354 | void *data, int data_is, const char *name, | 408 | void *data, int data_is, |
409 | const unsigned char *name, | ||
355 | u32 cookie, gfp_t gfp); | 410 | u32 cookie, gfp_t gfp); |
356 | 411 | ||
412 | /* fanotify likes to change events after they are on lists... */ | ||
413 | extern struct fsnotify_event *fsnotify_clone_event(struct fsnotify_event *old_event); | ||
414 | extern int fsnotify_replace_event(struct fsnotify_event_holder *old_holder, | ||
415 | struct fsnotify_event *new_event); | ||
416 | |||
357 | #else | 417 | #else |
358 | 418 | ||
359 | static inline void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, | 419 | static inline int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, |
360 | const char *name, u32 cookie) | 420 | const unsigned char *name, u32 cookie) |
361 | {} | 421 | { |
422 | return 0; | ||
423 | } | ||
362 | 424 | ||
363 | static inline void __fsnotify_parent(struct dentry *dentry, __u32 mask) | 425 | static inline void __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask) |
364 | {} | 426 | {} |
365 | 427 | ||
366 | static inline void __fsnotify_inode_delete(struct inode *inode) | 428 | static inline void __fsnotify_inode_delete(struct inode *inode) |
367 | {} | 429 | {} |
368 | 430 | ||
431 | static inline void __fsnotify_vfsmount_delete(struct vfsmount *mnt) | ||
432 | {} | ||
433 | |||
369 | static inline void __fsnotify_update_dcache_flags(struct dentry *dentry) | 434 | static inline void __fsnotify_update_dcache_flags(struct dentry *dentry) |
370 | {} | 435 | {} |
371 | 436 | ||