xen_disk: use bdrv_aio_flush instead of bdrv_flush
Use bdrv_aio_flush instead of bdrv_flush. Make sure to call bdrv_aio_writev/readv after the presync bdrv_aio_flush is fully completed and make sure to call the postsync bdrv_aio_flush after bdrv_aio_writev/readv is fully completed. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
This commit is contained in:
parent
ba1dffed63
commit
c6961b7d38
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user