• Johannes Thumshirn's avatar
    btrfs: zoned: add a dedicated data relocation block group · c2707a25
    Johannes Thumshirn authored
    Relocation in a zoned filesystem can fail with a transaction abort with
    error -22 (EINVAL). This happens because the relocation code assumes that
    the extents we relocated the data to have the same size the source extents
    had and ensures this by preallocating the extents.
    
    But in a zoned filesystem we currently can't preallocate the extents as
    this would break the sequential write required rule. Therefore it can
    happen that the writeback process kicks in while we're still adding pages
    to a delalloc range and starts writing out dirty pages.
    
    This then creates destination extents that are smaller than the source
    extents, triggering the following safety check in get_new_location():
    
     1034         if (num_bytes != btrfs_file_extent_disk_num_bytes(leaf, fi)) {
     1035                 ret = -EINVAL;
     1036                 goto out;
     1037         }
    
    Temporarily create a dedicated block group for the relocation process, so
    no non-relocation data writes can interfere with the relocation writes.
    
    This is needed that we can switch the relocation process on a zoned
    filesystem from the REQ_OP_ZONE_APPEND writing we use for data to a scheme
    like in a non-zoned filesystem using REQ_OP_WRITE and preallocation.
    
    Fixes: 32430c61 ("btrfs: zoned: enable relocation on a zoned filesystem")
    Reviewed-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
    Signed-off-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    c2707a25
ctree.h 130 KB