• Naohiro Aota's avatar
    btrfs: zoned: activate block group only for extent allocation · 760e69c4
    Naohiro Aota authored
    In btrfs_make_block_group(), we activate the allocated block group,
    expecting that the block group is soon used for allocation. However, the
    chunk allocation from flush_space() context broke the assumption. There
    can be a large time gap between the chunk allocation time and the extent
    allocation time from the chunk.
    
    Activating the empty block groups pre-allocated from flush_space()
    context can exhaust the active zone counter of a device. Once we use all
    the active zone counts for empty pre-allocated block groups, we cannot
    activate new block group for the other things: metadata, tree-log, or
    data relocation block group.  That failure results in a fake -ENOSPC.
    
    This patch introduces CHUNK_ALLOC_FORCE_FOR_EXTENT to distinguish the
    chunk allocation from find_free_extent(). Now, the new block group is
    activated only in that context.
    
    Fixes: eb66a010 ("btrfs: zoned: activate new block group")
    CC: stable@vger.kernel.org # 5.16+
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Tested-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    760e69c4
extent-tree.c 167 KB