• Amir Goldstein's avatar
    fanotify: fix logic of reporting name info with watched parent · 7372e79c
    Amir Goldstein authored
    The victim inode's parent and name info is required when an event
    needs to be delivered to a group interested in filename info OR
    when the inode's parent is interested in an event on its children.
    
    Let us call the first condition 'parent_needed' and the second
    condition 'parent_interested'.
    
    In fsnotify_parent(), the condition where the inode's parent is
    interested in some events on its children, but not necessarily
    interested the specific event is called 'parent_watched'.
    
    fsnotify_parent() tests the condition (!parent_watched && !parent_needed)
    for sending the event without parent and name info, which is correct.
    
    It then wrongly assumes that parent_watched implies !parent_needed
    and tests the condition (parent_watched && !parent_interested)
    for sending the event without parent and name info, which is wrong,
    because parent may still be needed by some group.
    
    For example, after initializing a group with FAN_REPORT_DFID_NAME and
    adding a FAN_MARK_MOUNT with FAN_OPEN mask, open events on non-directory
    children of "testdir" are delivered with file name info.
    
    After adding another mark to the same group on the parent "testdir"
    with FAN_CLOSE|FAN_EVENT_ON_CHILD mask, open events on non-directory
    children of "testdir" are no longer delivered with file name info.
    
    Fix the logic and use auxiliary variables to clarify the conditions.
    
    Fixes: 9b93f331 ("fsnotify: send event with parent/name info to sb/mount/non-dir marks")
    Cc: stable@vger.kernel.org#v5.9
    Link: https://lore.kernel.org/r/20201108105906.8493-1-amir73il@gmail.comSigned-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    7372e79c
fsnotify.c 15.6 KB