• Naohiro Aota's avatar
    btrfs: zoned: fix initial free space detection · b9fd2aff
    Naohiro Aota authored
    When creating a new block group, it calls btrfs_add_new_free_space() to add
    the entire block group range into the free space accounting.
    __btrfs_add_free_space_zoned() checks if size == block_group->length to
    detect the initial free space adding, and proceed that case properly.
    
    However, if the zone_capacity == zone_size and the over-write speed is fast
    enough, the entire zone can be over-written within one transaction. That
    confuses __btrfs_add_free_space_zoned() to handle it as an initial free
    space accounting. As a result, that block group becomes a strange state: 0
    used bytes, 0 zone_unusable bytes, but alloc_offset == zone_capacity (no
    allocation anymore).
    
    The initial free space accounting can properly be checked by checking
    alloc_offset too.
    
    Fixes: 98173255 ("btrfs: zoned: calculate free space from zone capacity")
    CC: stable@vger.kernel.org # 6.1+
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    b9fd2aff
free-space-cache.c 114 KB