diff options
Diffstat (limited to 'include/linux/fsnotify_backend.h')
| -rw-r--r-- | include/linux/fsnotify_backend.h | 70 | 
1 files changed, 49 insertions, 21 deletions
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 1915bdba2fad..f0c506405b54 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h @@ -47,18 +47,18 @@  #define FS_OPEN_PERM		0x00010000	/* open event in an permission hook */  #define FS_ACCESS_PERM		0x00020000	/* access event in a permissions hook */  #define FS_OPEN_EXEC_PERM	0x00040000	/* open/exec event in a permission hook */ +#define FS_DIR_MODIFY		0x00080000	/* Directory entry was modified */  #define FS_EXCL_UNLINK		0x04000000	/* do not send events if object is unlinked */ -#define FS_ISDIR		0x40000000	/* event occurred against dir */ -#define FS_IN_ONESHOT		0x80000000	/* only send event once */ - -#define FS_DN_RENAME		0x10000000	/* file renamed */ -#define FS_DN_MULTISHOT		0x20000000	/* dnotify multishot */ -  /* This inode cares about things that happen to its children.  Always set for   * dnotify and inotify. */  #define FS_EVENT_ON_CHILD	0x08000000 +#define FS_DN_RENAME		0x10000000	/* file renamed */ +#define FS_DN_MULTISHOT		0x20000000	/* dnotify multishot */ +#define FS_ISDIR		0x40000000	/* event occurred against dir */ +#define FS_IN_ONESHOT		0x80000000	/* only send event once */ +  #define FS_MOVE			(FS_MOVED_FROM | FS_MOVED_TO)  /* @@ -67,7 +67,8 @@   * The watching parent may get an FS_ATTRIB|FS_EVENT_ON_CHILD event   * when a directory entry inside a child subdir changes.   */ -#define ALL_FSNOTIFY_DIRENT_EVENTS	(FS_CREATE | FS_DELETE | FS_MOVE) +#define ALL_FSNOTIFY_DIRENT_EVENTS	(FS_CREATE | FS_DELETE | FS_MOVE | \ +					 FS_DIR_MODIFY)  #define ALL_FSNOTIFY_PERM_EVENTS (FS_OPEN_PERM | FS_ACCESS_PERM | \  				  FS_OPEN_EXEC_PERM) @@ -133,8 +134,7 @@ struct fsnotify_ops {   */  struct fsnotify_event {  	struct list_head list; -	/* inode may ONLY be dereferenced during handle_event(). */ -	struct inode *inode;	/* either the inode the event happened to or its parent */ +	unsigned long objectid;	/* identifier for queue merges */  };  /* @@ -213,10 +213,36 @@ struct fsnotify_group {  	};  }; -/* when calling fsnotify tell it if the data is a path or inode */ -#define FSNOTIFY_EVENT_NONE	0 -#define FSNOTIFY_EVENT_PATH	1 -#define FSNOTIFY_EVENT_INODE	2 +/* When calling fsnotify tell it if the data is a path or inode */ +enum fsnotify_data_type { +	FSNOTIFY_EVENT_NONE, +	FSNOTIFY_EVENT_PATH, +	FSNOTIFY_EVENT_INODE, +}; + +static inline const struct inode *fsnotify_data_inode(const void *data, +						      int data_type) +{ +	switch (data_type) { +	case FSNOTIFY_EVENT_INODE: +		return data; +	case FSNOTIFY_EVENT_PATH: +		return d_inode(((const struct path *)data)->dentry); +	default: +		return NULL; +	} +} + +static inline const struct path *fsnotify_data_path(const void *data, +						    int data_type) +{ +	switch (data_type) { +	case FSNOTIFY_EVENT_PATH: +		return data; +	default: +		return NULL; +	} +}  enum fsnotify_obj_type {  	FSNOTIFY_OBJ_TYPE_INODE, @@ -351,9 +377,10 @@ struct fsnotify_mark {  /* called from the vfs helpers */  /* main fsnotify call to send events */ -extern int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is, -		    const struct qstr *name, u32 cookie); -extern int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask); +extern int fsnotify(struct inode *to_tell, __u32 mask, const void *data, +		    int data_type, const struct qstr *name, u32 cookie); +extern int fsnotify_parent(struct dentry *dentry, __u32 mask, const void *data, +			   int data_type);  extern void __fsnotify_inode_delete(struct inode *inode);  extern void __fsnotify_vfsmount_delete(struct vfsmount *mnt);  extern void fsnotify_sb_delete(struct super_block *sb); @@ -500,21 +527,22 @@ extern void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info);  extern bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info);  static inline void fsnotify_init_event(struct fsnotify_event *event, -				       struct inode *inode) +				       unsigned long objectid)  {  	INIT_LIST_HEAD(&event->list); -	event->inode = inode; +	event->objectid = objectid;  }  #else -static inline int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is, -			   const struct qstr *name, u32 cookie) +static inline int fsnotify(struct inode *to_tell, __u32 mask, const void *data, +			   int data_type, const struct qstr *name, u32 cookie)  {  	return 0;  } -static inline int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask) +static inline int fsnotify_parent(struct dentry *dentry, __u32 mask, +				  const void *data, int data_type)  {  	return 0;  }  |