@@ -10,6 +10,7 @@
#include <linux/cred.h>
#include <linux/mount.h>
#include <linux/vfs.h>
+#include <linux/fsnotify.h>
#include <linux/quotaops.h>
#include <linux/mutex.h>
#include <linux/namei.h>
@@ -367,11 +368,15 @@ int simple_remove(struct inode *dir, struct
dentry *dentry)
* protect d_delete() from accessing a freed dentry.
*/
dget(dentry);
- if (d_is_dir(dentry))
+ if (d_is_dir(dentry)) {
ret = simple_rmdir(dir, dentry);
- else
+ if (!ret)
+ fsnotify_rmdir(dir, dentry);
+ } else {
ret = simple_unlink(dir, dentry);
-
+ if (!ret)
+ fsnotify_unlink(dir, dentry);
+ }
if (!ret)
d_delete(dentry);
dput(dentry);
@@ -3883,6 +3883,7 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry)
dentry->d_inode->i_flags |= S_DEAD;
dont_mount(dentry);
detach_mounts(dentry);
+ fsnotify_rmdir(dir, dentry);
out:
inode_unlock(dentry->d_inode);
@@ -3999,6 +4000,7 @@ int vfs_unlink(struct inode *dir, struct dentry
*dentry, struct inode **delegate
if (!error) {
dont_mount(dentry);
detach_mounts(dentry);
+ fsnotify_unlink(dir, dentry);
}
}
}
@@ -188,6 +188,19 @@ static inline void fsnotify_link(struct inode
*dir, struct inode *inode, struct
fsnotify(dir, FS_CREATE, inode, FSNOTIFY_EVENT_INODE,
&new_dentry->d_name, 0);
}
+/*
+ * fsnotify_unlink - 'name' was unlinked
+ *
+ * Caller must make sure that dentry->d_name is stable.
+ */
+static inline void fsnotify_unlink(struct inode *dir, struct dentry *dentry)
+{
+ /* Expected to be called before d_delete() */
+ WARN_ON_ONCE(d_is_negative(dentry));
+
+ /* TODO: call fsnotify_dirent() */
+}
+
/*