• Naohiro Aota's avatar
    btrfs: zoned: count fresh BG region as zone unusable · fa2068d7
    Naohiro Aota authored
    The naming of space_info->active_total_bytes is misleading. It counts
    not only active block groups but also full ones which are previously
    active but now inactive. That confusion results in a bug not counting
    the full BGs into active_total_bytes on mount time.
    
    For a background, there are three kinds of block groups in terms of
    activation.
    
      1. Block groups never activated
      2. Block groups currently active
      3. Block groups previously active and currently inactive (due to fully
         written or zone finish)
    
    What we really wanted to exclude from "total_bytes" is the total size of
    BGs #1. They seem empty and allocatable but since they are not activated,
    we cannot rely on them to do the space reservation.
    
    And, since BGs #1 never get activated, they should have no "used",
    "reserved" and "pinned" bytes.
    
    OTOH, BGs #3 can be counted in the "total", since they are already full
    we cannot allocate from them anyway. For them, "total_bytes == used +
    reserved + pinned + zone_unusable" should hold.
    
    Tracking #2 and #3 as "active_total_bytes" (current implementation) is
    confusing. And, tracking #1 and subtract that properly from "total_bytes"
    every time you need space reservation is cumbersome.
    
    Instead, we can count the whole region of a newly allocated block group as
    zone_unusable. Then, once that block group is activated, release
    [0 ..  zone_capacity] from the zone_unusable counters. With this, we can
    eliminate the confusing ->active_total_bytes and the code will be common
    among regular and the zoned mode. Also, no additional counter is needed
    with this approach.
    
    Fixes: 6a921de5 ("btrfs: zoned: introduce space_info->active_total_bytes")
    CC: stable@vger.kernel.org # 6.1+
    Signed-off-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    fa2068d7
free-space-cache.c 114 KB