2009-05-22 01:01:20 +04:00
# ifndef __FS_NOTIFY_FSNOTIFY_H_
# define __FS_NOTIFY_FSNOTIFY_H_
# include <linux/list.h>
# include <linux/fsnotify.h>
# include <linux/srcu.h>
# include <linux/types.h>
2015-09-05 01:43:09 +03:00
# include "../mount.h"
2009-05-22 01:01:37 +04:00
/* destroy all events sitting in this groups notification queue */
extern void fsnotify_flush_notify ( struct fsnotify_group * group ) ;
2010-07-28 18:18:38 +04:00
/* protects reads of inode and vfsmount marks list */
extern struct srcu_struct fsnotify_mark_srcu ;
2014-12-13 03:58:36 +03:00
/* Calculate mask of events for a list of marks */
extern u32 fsnotify_recalc_mask ( struct hlist_head * head ) ;
2014-11-14 02:19:33 +03:00
/* compare two groups for sorting of marks lists */
extern int fsnotify_compare_groups ( struct fsnotify_group * a ,
struct fsnotify_group * b ) ;
2009-12-18 05:24:33 +03:00
extern void fsnotify_set_inode_mark_mask_locked ( struct fsnotify_mark * fsn_mark ,
__u32 mask ) ;
2014-12-13 03:58:36 +03:00
/* Add mark to a proper place in mark list */
extern int fsnotify_add_mark_list ( struct hlist_head * head ,
struct fsnotify_mark * mark ,
int allow_dups ) ;
2009-12-18 05:24:27 +03:00
/* add a mark to an inode */
extern int fsnotify_add_inode_mark ( struct fsnotify_mark * mark ,
struct fsnotify_group * group , struct inode * inode ,
int allow_dups ) ;
2009-12-18 05:24:27 +03:00
/* add a mark to a vfsmount */
extern int fsnotify_add_vfsmount_mark ( struct fsnotify_mark * mark ,
struct fsnotify_group * group , struct vfsmount * mnt ,
int allow_dups ) ;
2009-12-18 05:24:27 +03:00
2009-12-18 05:24:27 +03:00
/* vfsmount specific destruction of a mark */
extern void fsnotify_destroy_vfsmount_mark ( struct fsnotify_mark * mark ) ;
2009-12-18 05:24:27 +03:00
/* inode specific destruction of a mark */
extern void fsnotify_destroy_inode_mark ( struct fsnotify_mark * mark ) ;
2014-12-13 03:58:36 +03:00
/* Find mark belonging to given group in the list of marks */
extern struct fsnotify_mark * fsnotify_find_mark ( struct hlist_head * head ,
struct fsnotify_group * group ) ;
2015-09-05 01:43:09 +03:00
/* Destroy all marks in the given list protected by 'lock' */
extern void fsnotify_destroy_marks ( struct hlist_head * head , spinlock_t * lock ) ;
/* run the list of all marks associated with inode and destroy them */
static inline void fsnotify_clear_marks_by_inode ( struct inode * inode )
{
fsnotify_destroy_marks ( & inode - > i_fsnotify_marks , & inode - > i_lock ) ;
}
/* run the list of all marks associated with vfsmount and destroy them */
static inline void fsnotify_clear_marks_by_mount ( struct vfsmount * mnt )
{
fsnotify_destroy_marks ( & real_mount ( mnt ) - > mnt_fsnotify_marks ,
& mnt - > mnt_root - > d_lock ) ;
}
2016-05-20 03:08:59 +03:00
/* prepare for freeing all marks associated with given group */
extern void fsnotify_detach_group_marks ( struct fsnotify_group * group ) ;
/*
* wait for fsnotify_mark_srcu period to end and free all marks in destroy_list
*/
extern void fsnotify_mark_destroy_list ( void ) ;
2009-05-22 01:01:29 +04:00
/*
* update the dentry - > d_flags of all of inode ' s children to indicate if inode cares
* about events that happen to its children .
*/
extern void __fsnotify_update_child_dentry_flags ( struct inode * inode ) ;
2009-05-22 01:01:37 +04:00
/* allocate and destroy and event holder to attach events to notification/access queues */
extern struct fsnotify_event_holder * fsnotify_alloc_event_holder ( void ) ;
extern void fsnotify_destroy_event_holder ( struct fsnotify_event_holder * holder ) ;
2009-05-22 01:01:20 +04:00
# endif /* __FS_NOTIFY_FSNOTIFY_H_ */