]> git.baikalelectronics.ru Git - kernel.git/commit
block: fix DIO handling regressions in blkdev_read_iter()
authorIlya Dryomov <idryomov@gmail.com>
Tue, 1 Feb 2022 10:04:20 +0000 (11:04 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 2 Feb 2022 14:48:27 +0000 (07:48 -0700)
commit4a7213a4c2801def6bad721e96e3eb96661fd847
tree63b4bee0083b697795d6c07f89158073eca526dd
parent085dc8e86f3df25d7102242ee28f42a25b1ae52e
block: fix DIO handling regressions in blkdev_read_iter()

Commit f32b0d14474c ("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: f32b0d14474c ("block: move direct_IO into our own read_iter handler")
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20220201100420.25875-1-idryomov@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/fops.c