• Brian Foster's avatar
    ext4: drop dio overwrite only flag and associated warning · 194505b5
    Brian Foster authored
    The commit referenced below opened up concurrent unaligned dio under
    shared locking for pure overwrites. In doing so, it enabled use of
    the IOMAP_DIO_OVERWRITE_ONLY flag and added a warning on unexpected
    -EAGAIN returns as an extra precaution, since ext4 does not retry
    writes in such cases. The flag itself is advisory in this case since
    ext4 checks for unaligned I/Os and uses appropriate locking up
    front, rather than on a retry in response to -EAGAIN.
    
    As it turns out, the warning check is susceptible to false positives
    because there are scenarios where -EAGAIN can be expected from lower
    layers without necessarily having IOCB_NOWAIT set on the iocb. For
    example, one instance of the warning has been seen where io_uring
    sets IOCB_HIPRI, which in turn results in REQ_POLLED|REQ_NOWAIT on
    the bio. This results in -EAGAIN if the block layer is unable to
    allocate a request, etc. [Note that there is an outstanding patch to
    untangle REQ_POLLED and REQ_NOWAIT such that the latter relies on
    IOCB_NOWAIT, which would also address this instance of the warning.]
    
    Another instance of the warning has been reproduced by syzbot. A dio
    write is interrupted down in __get_user_pages_locked() waiting on
    the mm lock and returns -EAGAIN up the stack. If the iomap dio
    iteration layer has made no progress on the write to this point,
    -EAGAIN returns up to the filesystem and triggers the warning.
    
    This use of the overwrite flag in ext4 is precautionary and
    half-baked. I.e., ext4 doesn't actually implement overwrite checking
    in the iomap callbacks when the flag is set, so the only extra
    verification it provides are i_size checks in the generic iomap dio
    layer. Combined with the tendency for false positives, the added
    verification is not worth the extra trouble. Remove the flag,
    associated warning, and update the comments to document when
    concurrent unaligned dio writes are allowed and why said flag is not
    used.
    
    Cc: stable@kernel.org
    Reported-by: syzbot+5050ad0fb47527b1808a@syzkaller.appspotmail.com
    Reported-by: default avatarPengfei Xu <pengfei.xu@intel.com>
    Fixes: 310ee090 ("ext4: allow concurrent unaligned dio overwrites")
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20230810165559.946222-1-bfoster@redhat.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    194505b5
file.c 25.7 KB