Home | History | Annotate | Download | only in linux
      1 /*
      2  * Inode based directory notification for Linux
      3  *
      4  * Copyright (C) 2005 John McCutchan
      5  */
      6 
      7 #ifndef _LINUX_INOTIFY_H
      8 #define _LINUX_INOTIFY_H
      9 
     10 #include <linux/types.h>
     11 
     12 /*
     13  * struct inotify_event - structure read from the inotify device for each event
     14  *
     15  * When you are watching a directory, you will receive the filename for events
     16  * such as IN_CREATE, IN_DELETE, IN_OPEN, IN_CLOSE, ..., relative to the wd.
     17  */
     18 struct inotify_event {
     19 	__s32		wd;		/* watch descriptor */
     20 	__u32		mask;		/* watch mask */
     21 	__u32		cookie;		/* cookie to synchronize two events */
     22 	__u32		len;		/* length (including nulls) of name */
     23 	char		name[0];	/* stub for possible name */
     24 };
     25 
     26 /* the following are legal, implemented events that user-space can watch for */
     27 #define IN_ACCESS		0x00000001	/* File was accessed */
     28 #define IN_MODIFY		0x00000002	/* File was modified */
     29 #define IN_ATTRIB		0x00000004	/* Metadata changed */
     30 #define IN_CLOSE_WRITE		0x00000008	/* Writtable file was closed */
     31 #define IN_CLOSE_NOWRITE	0x00000010	/* Unwrittable file closed */
     32 #define IN_OPEN			0x00000020	/* File was opened */
     33 #define IN_MOVED_FROM		0x00000040	/* File was moved from X */
     34 #define IN_MOVED_TO		0x00000080	/* File was moved to Y */
     35 #define IN_CREATE		0x00000100	/* Subfile was created */
     36 #define IN_DELETE		0x00000200	/* Subfile was deleted */
     37 #define IN_DELETE_SELF		0x00000400	/* Self was deleted */
     38 #define IN_MOVE_SELF		0x00000800	/* Self was moved */
     39 
     40 /* the following are legal events.  they are sent as needed to any watch */
     41 #define IN_UNMOUNT		0x00002000	/* Backing fs was unmounted */
     42 #define IN_Q_OVERFLOW		0x00004000	/* Event queued overflowed */
     43 #define IN_IGNORED		0x00008000	/* File was ignored */
     44 
     45 /* helper events */
     46 #define IN_CLOSE		(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* close */
     47 #define IN_MOVE			(IN_MOVED_FROM | IN_MOVED_TO) /* moves */
     48 
     49 /* special flags */
     50 #define IN_ONLYDIR		0x01000000	/* only watch the path if it is a directory */
     51 #define IN_DONT_FOLLOW		0x02000000	/* don't follow a sym link */
     52 #define IN_MASK_ADD		0x20000000	/* add to the mask of an already existing watch */
     53 #define IN_ISDIR		0x40000000	/* event occurred against dir */
     54 #define IN_ONESHOT		0x80000000	/* only send event once */
     55 
     56 /*
     57  * All of the events - we build the list by hand so that we can add flags in
     58  * the future and not break backward compatibility.  Apps will get only the
     59  * events that they originally wanted.  Be sure to add new events here!
     60  */
     61 #define IN_ALL_EVENTS	(IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | \
     62 			 IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \
     63 			 IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF | \
     64 			 IN_MOVE_SELF)
     65 
     66 #ifdef __KERNEL__
     67 
     68 #include <linux/dcache.h>
     69 #include <linux/fs.h>
     70 
     71 /*
     72  * struct inotify_watch - represents a watch request on a specific inode
     73  *
     74  * h_list is protected by ih->mutex of the associated inotify_handle.
     75  * i_list, mask are protected by inode->inotify_mutex of the associated inode.
     76  * ih, inode, and wd are never written to once the watch is created.
     77  *
     78  * Callers must use the established inotify interfaces to access inotify_watch
     79  * contents.  The content of this structure is private to the inotify
     80  * implementation.
     81  */
     82 struct inotify_watch {
     83 	struct list_head	h_list;	/* entry in inotify_handle's list */
     84 	struct list_head	i_list;	/* entry in inode's list */
     85 	atomic_t		count;	/* reference count */
     86 	struct inotify_handle	*ih;	/* associated inotify handle */
     87 	struct inode		*inode;	/* associated inode */
     88 	__s32			wd;	/* watch descriptor */
     89 	__u32			mask;	/* event mask for this watch */
     90 };
     91 
     92 struct inotify_operations {
     93 	void (*handle_event)(struct inotify_watch *, u32, u32, u32,
     94 			     const char *, struct inode *);
     95 	void (*destroy_watch)(struct inotify_watch *);
     96 };
     97 
     98 #ifdef CONFIG_INOTIFY
     99 
    100 /* Kernel API for producing events */
    101 
    102 extern void inotify_d_instantiate(struct dentry *, struct inode *);
    103 extern void inotify_d_move(struct dentry *);
    104 extern void inotify_inode_queue_event(struct inode *, __u32, __u32,
    105 				      const char *, struct inode *);
    106 extern void inotify_dentry_parent_queue_event(struct dentry *, __u32, __u32,
    107 					      const char *);
    108 extern void inotify_unmount_inodes(struct list_head *);
    109 extern void inotify_inode_is_dead(struct inode *);
    110 extern u32 inotify_get_cookie(void);
    111 
    112 /* Kernel Consumer API */
    113 
    114 extern struct inotify_handle *inotify_init(const struct inotify_operations *);
    115 extern void inotify_init_watch(struct inotify_watch *);
    116 extern void inotify_destroy(struct inotify_handle *);
    117 extern __s32 inotify_find_watch(struct inotify_handle *, struct inode *,
    118 				struct inotify_watch **);
    119 extern __s32 inotify_find_update_watch(struct inotify_handle *, struct inode *,
    120 				       u32);
    121 extern __s32 inotify_add_watch(struct inotify_handle *, struct inotify_watch *,
    122 			       struct inode *, __u32);
    123 extern int inotify_rm_watch(struct inotify_handle *, struct inotify_watch *);
    124 extern int inotify_rm_wd(struct inotify_handle *, __u32);
    125 extern void inotify_remove_watch_locked(struct inotify_handle *,
    126 					struct inotify_watch *);
    127 extern void get_inotify_watch(struct inotify_watch *);
    128 extern void put_inotify_watch(struct inotify_watch *);
    129 
    130 #else
    131 
    132 static inline void inotify_d_instantiate(struct dentry *dentry,
    133 					struct inode *inode)
    134 {
    135 }
    136 
    137 static inline void inotify_d_move(struct dentry *dentry)
    138 {
    139 }
    140 
    141 static inline void inotify_inode_queue_event(struct inode *inode,
    142 					     __u32 mask, __u32 cookie,
    143 					     const char *filename,
    144 					     struct inode *n_inode)
    145 {
    146 }
    147 
    148 static inline void inotify_dentry_parent_queue_event(struct dentry *dentry,
    149 						     __u32 mask, __u32 cookie,
    150 						     const char *filename)
    151 {
    152 }
    153 
    154 static inline void inotify_unmount_inodes(struct list_head *list)
    155 {
    156 }
    157 
    158 static inline void inotify_inode_is_dead(struct inode *inode)
    159 {
    160 }
    161 
    162 static inline u32 inotify_get_cookie(void)
    163 {
    164 	return 0;
    165 }
    166 
    167 static inline struct inotify_handle *inotify_init(const struct inotify_operations *ops)
    168 {
    169 	return ERR_PTR(-EOPNOTSUPP);
    170 }
    171 
    172 static inline void inotify_init_watch(struct inotify_watch *watch)
    173 {
    174 }
    175 
    176 static inline void inotify_destroy(struct inotify_handle *ih)
    177 {
    178 }
    179 
    180 static inline __s32 inotify_find_watch(struct inotify_handle *ih, struct inode *inode,
    181 				       struct inotify_watch **watchp)
    182 {
    183 	return -EOPNOTSUPP;
    184 }
    185 
    186 static inline __s32 inotify_find_update_watch(struct inotify_handle *ih,
    187 					      struct inode *inode, u32 mask)
    188 {
    189 	return -EOPNOTSUPP;
    190 }
    191 
    192 static inline __s32 inotify_add_watch(struct inotify_handle *ih,
    193 				      struct inotify_watch *watch,
    194 				      struct inode *inode, __u32 mask)
    195 {
    196 	return -EOPNOTSUPP;
    197 }
    198 
    199 static inline int inotify_rm_watch(struct inotify_handle *ih,
    200 				   struct inotify_watch *watch)
    201 {
    202 	return -EOPNOTSUPP;
    203 }
    204 
    205 static inline int inotify_rm_wd(struct inotify_handle *ih, __u32 wd)
    206 {
    207 	return -EOPNOTSUPP;
    208 }
    209 
    210 static inline void inotify_remove_watch_locked(struct inotify_handle *ih,
    211 					       struct inotify_watch *watch)
    212 {
    213 }
    214 
    215 static inline void get_inotify_watch(struct inotify_watch *watch)
    216 {
    217 }
    218 
    219 static inline void put_inotify_watch(struct inotify_watch *watch)
    220 {
    221 }
    222 
    223 #endif	/* CONFIG_INOTIFY */
    224 
    225 #endif	/* __KERNEL __ */
    226 
    227 #endif	/* _LINUX_INOTIFY_H */
    228