• Filipe Manana's avatar
    btrfs: use sector numbers as keys for the dirty extents xarray · 97420be7
    Filipe Manana authored
    We are using the logical address ("bytenr") of an extent as the key for
    qgroup records in the dirty extents xarray. This is a problem because the
    xarrays use "unsigned long" for keys/indices, meaning that on a 32 bits
    platform any extent starting at or beyond 4G is truncated, which is a too
    low limitation as virtually everyone is using storage with more than 4G of
    space. This means a "bytenr" of 4G gets truncated to 0, and so does 8G and
    16G for example, resulting in incorrect qgroup accounting.
    
    Fix this by using sector numbers as keys instead, that is, using keys that
    match the logical address right shifted by fs_info->sectorsize_bits, which
    is what we do for the fs_info->buffer_radix that tracks extent buffers
    (radix trees also use an "unsigned long" type for keys). This also makes
    the index space more dense which helps optimize the xarray (as mentioned
    at Documentation/core-api/xarray.rst).
    
    Fixes: 3cce39a8 ("btrfs: qgroup: use xarray to track dirty extents in transaction")
    Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    97420be7
delayed-ref.c 35.5 KB