• Tejun Heo's avatar
    kernfs: don't depend on d_find_any_alias() when generating notifications · 0b764b2e
    Tejun Heo authored
    [ Upstream commit df6a58c5 ]
    
    kernfs_notify_workfn() sends out file modified events for the
    scheduled kernfs_nodes.  Because the modifications aren't from
    userland, it doesn't have the matching file struct at hand and can't
    use fsnotify_modify().  Instead, it looked up the inode and then used
    d_find_any_alias() to find the dentry and used fsnotify_parent() and
    fsnotify() directly to generate notifications.
    
    The assumption was that the relevant dentries would have been pinned
    if there are listeners, which isn't true as inotify doesn't pin
    dentries at all and watching the parent doesn't pin the child dentries
    even for dnotify.  This led to, for example, inotify watchers not
    getting notifications if the system is under memory pressure and the
    matching dentries got reclaimed.  It can also be triggered through
    /proc/sys/vm/drop_caches or a remount attempt which involves shrinking
    dcache.
    
    fsnotify_parent() only uses the dentry to access the parent inode,
    which kernfs can do easily.  Update kernfs_notify_workfn() so that it
    uses fsnotify() directly for both the parent and target inodes without
    going through d_find_any_alias().  While at it, supply the target file
    name to fsnotify() from kernfs_node->name.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarEvgeny Vereshchagin <evvers@ya.ru>
    Fixes: d911d987 ("kernfs: make kernfs_notify() trigger inotify events too")
    Cc: John McCutchan <john@johnmccutchan.com>
    Cc: Robert Love <rlove@rlove.org>
    Cc: Eric Paris <eparis@parisplace.org>
    Cc: stable@vger.kernel.org # v3.16+
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarSasha Levin <alexander.levin@verizon.com>
    0b764b2e
file.c 23.8 KB