• Naohiro Aota's avatar
    btrfs: zoned: fix negative space_info->bytes_readonly · f9f28e5b
    Naohiro Aota authored
    Consider we have a using block group on zoned btrfs.
    
    |<- ZU ->|<- used ->|<---free--->|
                         `- Alloc offset
    ZU: Zone unusable
    
    Marking the block group read-only will migrate the zone unusable bytes
    to the read-only bytes. So, we will have this.
    
    |<- RO ->|<- used ->|<--- RO --->|
    
    RO: Read only
    
    When marking it back to read-write, btrfs_dec_block_group_ro()
    subtracts the above "RO" bytes from the
    space_info->bytes_readonly. And, it moves the zone unusable bytes back
    and again subtracts those bytes from the space_info->bytes_readonly,
    leading to negative bytes_readonly.
    
    This can be observed in the output as eg.:
    
      Data, single: total=512.00MiB, used=165.21MiB, zone_unusable=16.00EiB
      Data, single: total=536870912, used=173256704, zone_unusable=18446744073603186688
    
    This commit fixes the issue by reordering the operations.
    
    Link: https://github.com/naota/linux/issues/37Reported-by: default avatarDavid Sterba <dsterba@suse.com>
    Fixes: 169e0da9 ("btrfs: zoned: track unusable bytes for zones")
    CC: stable@vger.kernel.org # 5.12+
    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>
    f9f28e5b
block-group.c 104 KB