• Josef Bacik's avatar
    btrfs: set cache_block_group_error if we find an error · 92fb94b6
    Josef Bacik authored
    We set cache_block_group_error if btrfs_cache_block_group() returns an
    error, this is because we could end up not finding space to allocate and
    mistakenly return -ENOSPC, and which could then abort the transaction
    with the incorrect errno, and in the case of ENOSPC result in a
    WARN_ON() that will trip up tests like generic/475.
    
    However there's the case where multiple threads can be racing, one
    thread gets the proper error, and the other thread doesn't actually call
    btrfs_cache_block_group(), it instead sees ->cached ==
    BTRFS_CACHE_ERROR.  Again the result is the same, we fail to allocate
    our space and return -ENOSPC.  Instead we need to set
    cache_block_group_error to -EIO in this case to make sure that if we do
    not make our allocation we get the appropriate error returned back to
    the caller.
    
    CC: stable@vger.kernel.org # 4.14+
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    92fb94b6
extent-tree.c 166 KB