• Sweet Tea Dorminy's avatar
    btrfs: fallback if compressed IO fails for ENOSPC · 131a821a
    Sweet Tea Dorminy authored
    In commit b4ccace8 ("btrfs: refactor submit_compressed_extents()"), if
    an async extent compressed but failed to find enough space, we changed
    from falling back to an uncompressed write to just failing the write
    altogether. The principle was that if there's not enough space to write
    the compressed version of the data, there can't possibly be enough space
    to write the larger, uncompressed version of the data.
    
    However, this isn't necessarily true: due to fragmentation, there could
    be enough discontiguous free blocks to write the uncompressed version,
    but not enough contiguous free blocks to write the smaller but
    unsplittable compressed version.
    
    This has occurred to an internal workload which relied on write()'s
    return value indicating there was space. While rare, it has happened a
    few times.
    
    Thus, in order to prevent early ENOSPC, re-add a fallback to
    uncompressed writing.
    
    Fixes: b4ccace8 ("btrfs: refactor submit_compressed_extents()")
    CC: stable@vger.kernel.org # 6.1+
    Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
    Co-developed-by: default avatarNeal Gompa <neal@gompa.dev>
    Signed-off-by: default avatarNeal Gompa <neal@gompa.dev>
    Signed-off-by: default avatarSweet Tea Dorminy <sweettea-kernel@dorminy.me>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    131a821a
inode.c 317 KB