• Josef Bacik's avatar
    Btrfs: exclude super blocks when we read in block groups · 3c14874a
    Josef Bacik authored
    This has been resulting in a BUT_ON(ret) after btrfs_reserve_extent in
    btrfs_cow_file_range.  The reason is we don't actually calculate the bytes_super
    for a block group until we go to cache it, which means that the space_info can
    hand out reservations for space that it doesn't actually have, and we can run
    out of data space.  This is also a problem if you are using space caching since
    we don't ever calculate bytes_super for the block groups.  So instead everytime
    we read a block group call exclude_super_stripes, which calculates the
    bytes_super for the block group so it can be left out of the space_info.  Then
    whenever caching completes we just call free_excluded_extents so that the super
    excluded extents are freed up.  Also if we are unmounting and we hit any block
    groups that haven't been cached we still need to call free_excluded_extents to
    make sure things are cleaned up properly.  Thanks,
    Reported-by: default avatarArne Jansen <sensille@gmx.net>
    Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
    Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
    3c14874a
extent-tree.c 228 KB