Merge branch 'linux-5.7' of git://github.com/skeggsb/linux into drm-fixes
[linux-2.6-microblaze.git] / include / linux / fsnotify_backend.h
index 1915bdb..f0c5064 100644 (file)
 #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;
 }