|
@@ -66,6 +66,7 @@ struct ioreq {
|
|
|
QEMUIOVector v;
|
|
|
int presync;
|
|
|
int postsync;
|
|
|
+ uint8_t mapped;
|
|
|
|
|
|
/* grant mapping */
|
|
|
uint32_t domids[BLKIF_MAX_SEGMENTS_PER_REQUEST];
|
|
@@ -242,7 +243,7 @@ static void ioreq_unmap(struct ioreq *ioreq)
|
|
|
XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev;
|
|
|
int i;
|
|
|
|
|
|
- if (ioreq->v.niov == 0) {
|
|
|
+ if (ioreq->v.niov == 0 || ioreq->mapped == 0) {
|
|
|
return;
|
|
|
}
|
|
|
if (batch_maps) {
|
|
@@ -268,6 +269,7 @@ static void ioreq_unmap(struct ioreq *ioreq)
|
|
|
ioreq->page[i] = NULL;
|
|
|
}
|
|
|
}
|
|
|
+ ioreq->mapped = 0;
|
|
|
}
|
|
|
|
|
|
static int ioreq_map(struct ioreq *ioreq)
|
|
@@ -275,7 +277,7 @@ static int ioreq_map(struct ioreq *ioreq)
|
|
|
XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev;
|
|
|
int i;
|
|
|
|
|
|
- if (ioreq->v.niov == 0) {
|
|
|
+ if (ioreq->v.niov == 0 || ioreq->mapped == 1) {
|
|
|
return 0;
|
|
|
}
|
|
|
if (batch_maps) {
|
|
@@ -307,9 +309,12 @@ static int ioreq_map(struct ioreq *ioreq)
|
|
|
ioreq->blkdev->cnt_map++;
|
|
|
}
|
|
|
}
|
|
|
+ ioreq->mapped = 1;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int ioreq_runio_qemu_aio(struct ioreq *ioreq);
|
|
|
+
|
|
|
static void qemu_aio_complete(void *opaque, int ret)
|
|
|
{
|
|
|
struct ioreq *ioreq = opaque;
|
|
@@ -321,11 +326,19 @@ static void qemu_aio_complete(void *opaque, int ret)
|
|
|
}
|
|
|
|
|
|
ioreq->aio_inflight--;
|
|
|
+ if (ioreq->presync) {
|
|
|
+ ioreq->presync = 0;
|
|
|
+ ioreq_runio_qemu_aio(ioreq);
|
|
|
+ return;
|
|
|
+ }
|
|
|
if (ioreq->aio_inflight > 0) {
|
|
|
return;
|
|
|
}
|
|
|
if (ioreq->postsync) {
|
|
|
- bdrv_flush(ioreq->blkdev->bs);
|
|
|
+ ioreq->postsync = 0;
|
|
|
+ ioreq->aio_inflight++;
|
|
|
+ bdrv_aio_flush(ioreq->blkdev->bs, qemu_aio_complete, ioreq);
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
ioreq->status = ioreq->aio_errors ? BLKIF_RSP_ERROR : BLKIF_RSP_OKAY;
|
|
@@ -345,7 +358,8 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq)
|
|
|
|
|
|
ioreq->aio_inflight++;
|
|
|
if (ioreq->presync) {
|
|
|
- bdrv_flush(blkdev->bs); /* FIXME: aio_flush() ??? */
|
|
|
+ bdrv_aio_flush(ioreq->blkdev->bs, qemu_aio_complete, ioreq);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
switch (ioreq->req.operation) {
|