• Amir Goldstein's avatar
    locks: eliminate false positive conflicts for write lease · 387e3746
    Amir Goldstein authored
    check_conflicting_open() is checking for existing fd's open for read or
    for write before allowing to take a write lease.  The check that was
    implemented using i_count and d_count is an approximation that has
    several false positives.  For example, overlayfs since v4.19, takes an
    extra reference on the dentry; An open with O_PATH takes a reference on
    the dentry although the file cannot be read nor written.
    
    Change the implementation to use i_readcount and i_writecount to
    eliminate the false positive conflicts and allow a write lease to be
    taken on an overlayfs file.
    
    The change of behavior with existing fd's open with O_PATH is symmetric
    w.r.t. current behavior of lease breakers - an open with O_PATH currently
    does not break a write lease.
    
    This increases the size of struct inode by 4 bytes on 32bit archs when
    CONFIG_FILE_LOCKING is defined and CONFIG_IMA was not already
    defined.
    Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
    Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
    387e3746
locks.c 77.7 KB