• Ilya Dryomov's avatar
    block: fix DIO handling regressions in blkdev_read_iter() · 3e1f941d
    Ilya Dryomov authored
    Commit ceaa7625 ("block: move direct_IO into our own read_iter
    handler") introduced several regressions for bdev DIO:
    
    1. read spanning EOF always returns 0 instead of the number of bytes
       read.  This is because "count" is assigned early and isn't updated
       when the iterator is truncated:
    
         $ lsblk -o name,size /dev/vdb
         NAME SIZE
         vdb    1G
         $ xfs_io -d -c 'pread -b 4M 1021M 4M' /dev/vdb
         read 0/4194304 bytes at offset 1070596096
         0.000000 bytes, 0 ops; 0.0007 sec (0.000000 bytes/sec and 0.0000 ops/sec)
    
         instead of
    
         $ xfs_io -d -c 'pread -b 4M 1021M 4M' /dev/vdb
         read 3145728/4194304 bytes at offset 1070596096
         3 MiB, 1 ops; 0.0007 sec (3.865 GiB/sec and 1319.2612 ops/sec)
    
    2. truncated iterator isn't reexpanded
    3. iterator isn't reverted on blkdev_direct_IO() error
    4. zero size read no longer skips atime update
    
    Fixes: ceaa7625 ("block: move direct_IO into our own read_iter handler")
    Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Link: https://lore.kernel.org/r/20220201100420.25875-1-idryomov@gmail.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    3e1f941d
fops.c 16.9 KB