42 lines
1.4 KiB
Diff
42 lines
1.4 KiB
Diff
|
If we go over the maximum number of iovecs support by syscall we get
|
||
|
back EINVAL from the kernel which translate to I/O errors for the guest.
|
||
|
|
||
|
Add a MAX_IOV defintion for platforms that don't have it. For now we use
|
||
|
the same 1024 define that's used on Linux and various other platforms,
|
||
|
but until the windows block backend implements some kind of vectored I/O
|
||
|
it doesn't matter.
|
||
|
|
||
|
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||
|
|
||
|
Index: qemu/block.c
|
||
|
===================================================================
|
||
|
--- qemu.orig/block.c 2010-01-26 10:59:39.757004445 +0100
|
||
|
+++ qemu/block.c 2010-01-26 11:01:38.056023231 +0100
|
||
|
@@ -1689,6 +1689,10 @@ static int multiwrite_merge(BlockDriverS
|
||
|
merge = bs->drv->bdrv_merge_requests(bs, &reqs[outidx], &reqs[i]);
|
||
|
}
|
||
|
|
||
|
+ if (reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1 > IOV_MAX) {
|
||
|
+ merge = 0;
|
||
|
+ }
|
||
|
+
|
||
|
if (merge) {
|
||
|
size_t size;
|
||
|
QEMUIOVector *qiov = qemu_mallocz(sizeof(*qiov));
|
||
|
Index: qemu/qemu-common.h
|
||
|
===================================================================
|
||
|
--- qemu.orig/qemu-common.h 2010-01-26 14:41:40.894254285 +0100
|
||
|
+++ qemu/qemu-common.h 2010-01-26 14:42:27.267275698 +0100
|
||
|
@@ -54,6 +54,10 @@ struct iovec {
|
||
|
void *iov_base;
|
||
|
size_t iov_len;
|
||
|
};
|
||
|
+/*
|
||
|
+ * Use the same value as Linux for now.
|
||
|
+ */
|
||
|
+#define IOV_MAX 1024
|
||
|
#else
|
||
|
#include <sys/uio.h>
|
||
|
#endif
|
||
|
|