Khoa Huynh <khoa@xxxxxxxxxx> discovered that request merging is broken. The merged iocb is not updated to reflect the total number of iovecs and the offset is also outdated. This patch fixes request merging. Signed-off-by: Stefan Hajnoczi <stefanha@xxxxxxxxxxxxxxxxxx> --- hw/virtio-blk.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index 9131a7a..51807b5 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -178,13 +178,17 @@ static void merge_request(struct iocb *iocb_a, struct iocb *iocb_b) req_a->len = iocb_nbytes(iocb_a); } - iocb_b->u.v.vec = iovec; - req_b->len = iocb_nbytes(iocb_b); - req_b->next_merged = req_a; /* fprintf(stderr, "merged %p (%u) and %p (%u), %u iovecs in total\n", req_a, iocb_a->u.v.nr, req_b, iocb_b->u.v.nr, iocb_a->u.v.nr + iocb_b->u.v.nr); */ + + iocb_b->u.v.vec = iovec; + iocb_b->u.v.nr += iocb_a->u.v.nr; + iocb_b->u.v.offset = iocb_a->u.v.offset; + + req_b->len = iocb_nbytes(iocb_b); + req_b->next_merged = req_a; } static void process_request(IOQueue *ioq, struct iovec iov[], unsigned int out_num, unsigned int in_num, unsigned int head) -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html