diff options
Diffstat (limited to 'fs/kernfs/file.c')
-rw-r--r-- | fs/kernfs/file.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c index e1574008adc9..2bcb86e6e6ca 100644 --- a/fs/kernfs/file.c +++ b/fs/kernfs/file.c | |||
@@ -840,21 +840,35 @@ repeat: | |||
840 | mutex_lock(&kernfs_mutex); | 840 | mutex_lock(&kernfs_mutex); |
841 | 841 | ||
842 | list_for_each_entry(info, &kernfs_root(kn)->supers, node) { | 842 | list_for_each_entry(info, &kernfs_root(kn)->supers, node) { |
843 | struct kernfs_node *parent; | ||
843 | struct inode *inode; | 844 | struct inode *inode; |
844 | struct dentry *dentry; | ||
845 | 845 | ||
846 | /* | ||
847 | * We want fsnotify_modify() on @kn but as the | ||
848 | * modifications aren't originating from userland don't | ||
849 | * have the matching @file available. Look up the inodes | ||
850 | * and generate the events manually. | ||
851 | */ | ||
846 | inode = ilookup(info->sb, kn->ino); | 852 | inode = ilookup(info->sb, kn->ino); |
847 | if (!inode) | 853 | if (!inode) |
848 | continue; | 854 | continue; |
849 | 855 | ||
850 | dentry = d_find_any_alias(inode); | 856 | parent = kernfs_get_parent(kn); |
851 | if (dentry) { | 857 | if (parent) { |
852 | fsnotify_parent(NULL, dentry, FS_MODIFY); | 858 | struct inode *p_inode; |
853 | fsnotify(inode, FS_MODIFY, inode, FSNOTIFY_EVENT_INODE, | 859 | |
854 | NULL, 0); | 860 | p_inode = ilookup(info->sb, parent->ino); |
855 | dput(dentry); | 861 | if (p_inode) { |
862 | fsnotify(p_inode, FS_MODIFY | FS_EVENT_ON_CHILD, | ||
863 | inode, FSNOTIFY_EVENT_INODE, kn->name, 0); | ||
864 | iput(p_inode); | ||
865 | } | ||
866 | |||
867 | kernfs_put(parent); | ||
856 | } | 868 | } |
857 | 869 | ||
870 | fsnotify(inode, FS_MODIFY, inode, FSNOTIFY_EVENT_INODE, | ||
871 | kn->name, 0); | ||
858 | iput(inode); | 872 | iput(inode); |
859 | } | 873 | } |
860 | 874 | ||