}
 
 /* Notify this dentry's parent about a child's events. */
-void __fsnotify_parent(struct file *file, struct dentry *dentry, __u32 mask)
+void __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask)
 {
        struct dentry *parent;
        struct inode *p_inode;
        bool send = false;
        bool should_update_children = false;
 
-       if (file)
-               dentry = file->f_path.dentry;
+       if (!dentry)
+               dentry = path->dentry;
 
        if (!(dentry->d_flags & DCACHE_FSNOTIFY_PARENT_WATCHED))
                return;
                 * specifies these are events which came from a child. */
                mask |= FS_EVENT_ON_CHILD;
 
-               if (file)
-                       fsnotify(p_inode, mask, file, FSNOTIFY_EVENT_FILE,
+               if (path)
+                       fsnotify(p_inode, mask, path, FSNOTIFY_EVENT_PATH,
                                 dentry->d_name.name, 0);
                else
                        fsnotify(p_inode, mask, dentry->d_inode, FSNOTIFY_EVENT_INODE,
  
        if (data_is == FSNOTIFY_EVENT_PATH)
                mnt = ((struct path *)data)->mnt;
-       else if (data_is == FSNOTIFY_EVENT_FILE)
-               mnt = ((struct file *)data)->f_path.mnt;
 
        /* if this inode's directed listeners don't care and nothing on the vfsmount
         * listeners list cares, nothing to do */
 
 }
 
 /* Notify this dentry's parent about a child's events. */
-static inline void fsnotify_parent(struct file *file, struct dentry *dentry, __u32 mask)
+static inline void fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask)
 {
-       BUG_ON(file && dentry);
+       if (!dentry)
+               dentry = path->dentry;
 
-       if (file)
-               dentry = file->f_path.dentry;
-
-       __fsnotify_parent(file, dentry, mask);
+       __fsnotify_parent(path, dentry, mask);
 }
 
 /*
  */
 static inline void fsnotify_access(struct file *file)
 {
-       struct inode *inode = file->f_path.dentry->d_inode;
+       struct path *path = &file->f_path;
+       struct inode *inode = path->dentry->d_inode;
        __u32 mask = FS_ACCESS;
 
        if (S_ISDIR(inode->i_mode))
                mask |= FS_IN_ISDIR;
 
-       fsnotify_parent(file, NULL, mask);
-       fsnotify(inode, mask, file, FSNOTIFY_EVENT_FILE, NULL, 0);
+       fsnotify_parent(path, NULL, mask);
+       fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0);
 }
 
 /*
  */
 static inline void fsnotify_modify(struct file *file)
 {
-       struct inode *inode = file->f_path.dentry->d_inode;
+       struct path *path = &file->f_path;
+       struct inode *inode = path->dentry->d_inode;
        __u32 mask = FS_MODIFY;
 
        if (S_ISDIR(inode->i_mode))
                mask |= FS_IN_ISDIR;
 
-       fsnotify_parent(file, NULL, mask);
-       fsnotify(inode, mask, file, FSNOTIFY_EVENT_FILE, NULL, 0);
+       fsnotify_parent(path, NULL, mask);
+       fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0);
 }
 
 /*
  */
 static inline void fsnotify_open(struct file *file)
 {
-       struct inode *inode = file->f_path.dentry->d_inode;
+       struct path *path = &file->f_path;
+       struct inode *inode = path->dentry->d_inode;
        __u32 mask = FS_OPEN;
 
        if (S_ISDIR(inode->i_mode))
                mask |= FS_IN_ISDIR;
 
-       fsnotify_parent(file, NULL, mask);
-       fsnotify(inode, mask, file, FSNOTIFY_EVENT_FILE, NULL, 0);
+       fsnotify_parent(path, NULL, mask);
+       fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0);
 }
 
 /*
  */
 static inline void fsnotify_close(struct file *file)
 {
+       struct path *path = &file->f_path;
        struct inode *inode = file->f_path.dentry->d_inode;
        fmode_t mode = file->f_mode;
        __u32 mask = (mode & FMODE_WRITE) ? FS_CLOSE_WRITE : FS_CLOSE_NOWRITE;
        if (S_ISDIR(inode->i_mode))
                mask |= FS_IN_ISDIR;
 
-       fsnotify_parent(file, NULL, mask);
-       fsnotify(inode, mask, file, FSNOTIFY_EVENT_FILE, NULL, 0);
+       fsnotify_parent(path, NULL, mask);
+       fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0);
 }
 
 /*
 
 #define FSNOTIFY_EVENT_NONE    0
 #define FSNOTIFY_EVENT_PATH    1
 #define FSNOTIFY_EVENT_INODE   2
-#define FSNOTIFY_EVENT_FILE    3
        int data_type;          /* which of the above union we have */
        atomic_t refcnt;        /* how many groups still are using/need to send this event */
        __u32 mask;             /* the type of access, bitwise OR for FS_* event types */
 /* main fsnotify call to send events */
 extern void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is,
                     const char *name, u32 cookie);
-extern void __fsnotify_parent(struct file *file, struct dentry *dentry, __u32 mask);
+extern void __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask);
 extern void __fsnotify_inode_delete(struct inode *inode);
 extern u32 fsnotify_get_cookie(void);
 
                            const char *name, u32 cookie)
 {}
 
-static inline void __fsnotify_parent(struct file *file, struct dentry *dentry, __u32 mask)
+static inline void __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask)
 {}
 
 static inline void __fsnotify_inode_delete(struct inode *inode)