• Filipe Manana's avatar
    btrfs: fix nowait buffered write returning -ENOSPC · a348c8d4
    Filipe Manana authored
    If we are doing a buffered write in NOWAIT context and we can't reserve
    metadata space due to -ENOSPC, then we should return -EAGAIN so that we
    retry the write in a context allowed to block and do metadata reservation
    with flushing, which might succeed this time due to the allowed flushing.
    
    Returning -ENOSPC while in NOWAIT context simply makes some writes fail
    with -ENOSPC when they would likely succeed after switching from NOWAIT
    context to blocking context. That is unexpected behaviour and even fio
    complains about it with a warning like this:
    
      fio: io_u error on file /mnt/sdi/task_0.0.0: No space left on device: write offset=1535705088, buflen=65536
      fio: pid=592630, err=28/file:io_u.c:1846, func=io_u error, error=No space left on device
    
    The fio's job config is this:
    
       [global]
       bs=64K
       ioengine=io_uring
       iodepth=1
       size=2236962133
       nr_files=1
       filesize=2236962133
       direct=0
       runtime=10
       fallocate=posix
       io_size=2236962133
       group_reporting
       time_based
    
       [task_0]
       rw=randwrite
       directory=/mnt/sdi
       numjobs=4
    
    So fix this by returning -EAGAIN if we are in NOWAIT context and the
    metadata reservation failed with -ENOSPC.
    
    Fixes: 304e45ac ("btrfs: plumb NOWAIT through the write path")
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    a348c8d4
file.c 114 KB