• Naohiro Aota's avatar
    btrfs: zoned: wait for data BG to be finished on direct IO allocation · 776a838f
    Naohiro Aota authored
    Running the fio command below on a ZNS device results in "Resource
    temporarily unavailable" error.
    
      $ sudo fio --name=w --directory=/mnt --filesize=1GB --bs=16MB --numjobs=16 \
            --rw=write --ioengine=libaio --iodepth=128 --direct=1
    
      fio: io_u error on file /mnt/w.2.0: Resource temporarily unavailable: write offset=117440512, buflen=16777216
      fio: io_u error on file /mnt/w.2.0: Resource temporarily unavailable: write offset=134217728, buflen=16777216
      ...
    
    This happens because -EAGAIN error returned from btrfs_reserve_extent()
    called from btrfs_new_extent_direct() is spilling over to the userland.
    
    btrfs_reserve_extent() returns -EAGAIN when there is no active zone
    available. Then, the caller should wait for some other on-going IO to
    finish a zone and retry the allocation.
    
    This logic is already implemented for buffered write in cow_file_range(),
    but it is missing for the direct IO counterpart. Implement the same logic
    for it.
    Reported-by: default avatarShinichiro Kawasaki <shinichiro.kawasaki@wdc.com>
    Fixes: 2ce543f4 ("btrfs: zoned: wait until zone is finished when allocation didn't progress")
    CC: stable@vger.kernel.org # 6.1+
    Tested-by: default avatarShinichiro Kawasaki <shinichiro.kawasaki@wdc.com>
    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>
    776a838f
inode.c 313 KB