diff options
Diffstat (limited to 'fs/kernfs')
| -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 | ||
