Any use of aio is inherently limited by size_t aio_nbytes in struct aiocb. read() is similarly limited to size_t bytes, although in practice, the ssize_t return means any read attempt on a 32-bit platform for more than 2G will likely return a short read (if that much memory was even available to begin with). And while preadv() can technically read more than size_t bytes by use of more than one iov, the fact that you can only pass a finite number of iov each of which is limited to size_t bytes is a limiting factor.
While we already attempt other methods at populating a more reasonable max_transfer limit in the cases where the kernel makes that information available, it is important that we at least let the block layer know about our hard limitation of size_t bytes (mainly applicable to 32-bit compilation). At the same time, on 64-bit platforms, that means we are now advertising that we don't have any other unintended size-botching problems, if the block layer were to start handing us requests larger than 2G. Signed-off-by: Eric Blake <ebl...@redhat.com> --- block/file-posix.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/block/file-posix.c b/block/file-posix.c index 48ad3bb372a..4b43ff8cb5c 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -1073,6 +1073,9 @@ static void raw_refresh_limits(BlockDriverState *bs, Error **errp) raw_probe_alignment(bs, s->fd, errp); bs->bl.min_mem_alignment = s->buf_align; bs->bl.opt_mem_alignment = MAX(s->buf_align, getpagesize()); + if (!bs->bl.max_transfer) { + bs->bl.max_transfer = SIZE_MAX; + } } static int check_for_dasd(int fd) -- 2.17.2