• Filipe Manana's avatar
    btrfs: avoid double nocow check when doing nowait dio writes · d7a8ab4e
    Filipe Manana authored
    When doing a NOWAIT direct IO write we are checking twice if we can COW
    into the target file range using can_nocow_extent() - once at the very
    beginning of the write path, at btrfs_write_check() via
    check_nocow_nolock(), and later again at btrfs_get_blocks_direct_write().
    
    The can_nocow_extent() function does a lot of expensive things - searching
    for the file extent item in the inode's subvolume tree, searching for the
    extent item in the extent tree, checking delayed references, etc, so it
    isn't a very cheap call.
    
    We can remove the first check at btrfs_write_check(), and add there a
    quick check to verify if the inode has the NODATACOW or PREALLOC flags,
    and quickly bail out if it doesn't have neither of those flags, as that
    means we have to COW and therefore can't comply with the NOWAIT semantics.
    
    After this we do only one call to can_nocow_extent(), while we are at
    btrfs_get_blocks_direct_write(), where we have already locked the file
    range and we did a try lock on the range before, at
    btrfs_dio_iomap_begin() (since the previous patch in the series).
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    d7a8ab4e
inode.c 322 KB