• Josef Bacik's avatar
    Btrfs: don't keep retrying a block group if we fail to allocate a cluster · 0a24325e
    Josef Bacik authored
    The box can get locked up in the allocator if we happen upon a block group
    under these conditions:
    
    1) During a commit, so caching threads cannot make progress
    2) Our block group currently is in the middle of being cached
    3) Our block group currently has plenty of free space in it
    4) Our block group is so fragmented that it ends up having no free space chunks
    larger than min_bytes calculated by btrfs_find_space_cluster.
    
    What happens is we try and do btrfs_find_space_cluster, which fails because it
    is unable to find enough free space chunks that are large than min_bytes and
    are close enough together.  Since the block group is not cached we do a
    wait_block_group_cache_progress, which waits for the number of bytes we need,
    except the block group already has _plenty_ of free space, its just severely
    fragmented, so we loop and try again, ad infinitum.  This patch keeps us from
    waiting on the block group to finish caching if we failed to find a free space
    cluster before.  It also makes sure that we don't even try to find a free space
    cluster if we are on our last loop in the allocator, since we will have tried
    everything at this point at it is futile.
    Signed-off-by: default avatarJosef Bacik <jbacik@redhat.com>
    Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
    0a24325e
extent-tree.c 204 KB