If the amount of data to read ends exactly on the total size of the bs, then we were wasting time creating a local qiov to read the data in preparation for what would normally be appending zeroes beyond the end, even though this corner case has nothing further to do.
Signed-off-by: Eric Blake <ebl...@redhat.com> --- block/io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/io.c b/block/io.c index aaeedaa..c8b323e 100644 --- a/block/io.c +++ b/block/io.c @@ -996,7 +996,7 @@ static int coroutine_fn bdrv_aligned_preadv(BlockDriverState *bs, max_nb_sectors = ROUND_UP(MAX(0, total_sectors - sector_num), align >> BDRV_SECTOR_BITS); - if (nb_sectors < max_nb_sectors) { + if (nb_sectors <= max_nb_sectors) { ret = bdrv_driver_preadv(bs, offset, bytes, qiov, flags); } else if (max_nb_sectors > 0) { QEMUIOVector local_qiov; -- 2.5.5