diff options
author | Alex Shi <alex.shi@linaro.org> | 2016-09-19 17:39:02 +0800 |
---|---|---|
committer | Alex Shi <alex.shi@linaro.org> | 2016-09-19 17:39:02 +0800 |
commit | 7acaa1968831591b5cf97b6cb00b0acca2dc5ee1 (patch) | |
tree | 9dba673061452165322aa9d9c8493ce90e33a651 /fs/kernfs/file.c | |
parent | b71d24fd9283d80a2ca7b26cdd5de296b17de72c (diff) | |
parent | 7ddc655ad909372848a3e7995e222c2b9224c2e0 (diff) |
Merge branch 'linux-linaro-lsk-v4.1' into linux-linaro-lsk-v4.1-rtlsk-v4.1-16.09-rt
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 2bacb9988566..9ff28bc294c0 100644 --- a/fs/kernfs/file.c +++ b/fs/kernfs/file.c @@ -834,21 +834,35 @@ repeat: mutex_lock(&kernfs_mutex); list_for_each_entry(info, &kernfs_root(kn)->supers, node) { + struct kernfs_node *parent; struct inode *inode; - struct dentry *dentry; + /* + * We want fsnotify_modify() on @kn but as the + * modifications aren't originating from userland don't + * have the matching @file available. Look up the inodes + * and generate the events manually. + */ inode = ilookup(info->sb, kn->ino); if (!inode) continue; - dentry = d_find_any_alias(inode); - if (dentry) { - fsnotify_parent(NULL, dentry, FS_MODIFY); - fsnotify(inode, FS_MODIFY, inode, FSNOTIFY_EVENT_INODE, - NULL, 0); - dput(dentry); + parent = kernfs_get_parent(kn); + if (parent) { + struct inode *p_inode; + + p_inode = ilookup(info->sb, parent->ino); + if (p_inode) { + fsnotify(p_inode, FS_MODIFY | FS_EVENT_ON_CHILD, + inode, FSNOTIFY_EVENT_INODE, kn->name, 0); + iput(p_inode); + } + + kernfs_put(parent); } + fsnotify(inode, FS_MODIFY, inode, FSNOTIFY_EVENT_INODE, + kn->name, 0); iput(inode); } |