• Amir Goldstein's avatar
    fsnotify: clear PARENT_WATCHED flags lazily · 172e422f
    Amir Goldstein authored
    In some setups directories can have many (usually negative) dentries.
    Hence __fsnotify_update_child_dentry_flags() function can take a
    significant amount of time. Since the bulk of this function happens
    under inode->i_lock this causes a significant contention on the lock
    when we remove the watch from the directory as the
    __fsnotify_update_child_dentry_flags() call from fsnotify_recalc_mask()
    races with __fsnotify_update_child_dentry_flags() calls from
    __fsnotify_parent() happening on children. This can lead upto softlockup
    reports reported by users.
    
    Fix the problem by calling fsnotify_update_children_dentry_flags() to
    set PARENT_WATCHED flags only when parent starts watching children.
    
    When parent stops watching children, clear false positive PARENT_WATCHED
    flags lazily in __fsnotify_parent() for each accessed child.
    Suggested-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
    Signed-off-by: default avatarStephen Brennan <stephen.s.brennan@oracle.com>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    172e422f
fsnotify.c 18.8 KB