• Naohiro Aota's avatar
    btrfs: zoned: finish least available block group on data bg allocation · 393f646e
    Naohiro Aota authored
    When we run out of active zones and no sufficient space is left in any
    block groups, we need to finish one block group to make room to activate a
    new block group.
    
    However, we cannot do this for metadata block groups because we can cause a
    deadlock by waiting for a running transaction commit. So, do that only for
    a data block group.
    
    Furthermore, the block group to be finished has two requirements. First,
    the block group must not have reserved bytes left. Having reserved bytes
    means we have an allocated region but did not yet send bios for it. If that
    region is allocated by the thread calling btrfs_zone_finish(), it results
    in a deadlock.
    
    Second, the block group to be finished must not be a SYSTEM block
    group. Finishing a SYSTEM block group easily breaks further chunk
    allocation by nullifying the SYSTEM free space.
    
    In a certain case, we cannot find any zone finish candidate or
    btrfs_zone_finish() may fail. In that case, we fall back to split the
    allocation bytes and fill the last spaces left in the block groups.
    
    CC: stable@vger.kernel.org # 5.16+
    Fixes: afba2bc0 ("btrfs: zoned: implement active zone tracking")
    Reviewed-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>
    393f646e
extent-tree.c 168 KB