[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 2/2] xen_disk: fix io accounting
From: |
Stefano Stabellini |
Subject: |
[Qemu-devel] [PULL 2/2] xen_disk: fix io accounting |
Date: |
Thu, 20 Feb 2014 18:13:22 +0000 |
From: Olaf Hering <address@hidden>
bdrv_acct_done was called unconditional. But in case the ioreq has no
segments there is no matching bdrv_acct_start call. This could lead to
bogus accounting values.
Found by code inspection.
Signed-off-by: Olaf Hering <address@hidden>
Signed-off-by: Stefano Stabellini <address@hidden>
---
hw/block/xen_disk.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c
index 098f6c6..7f0f14a 100644
--- a/hw/block/xen_disk.c
+++ b/hw/block/xen_disk.c
@@ -483,7 +483,18 @@ static void qemu_aio_complete(void *opaque, int ret)
ioreq->status = ioreq->aio_errors ? BLKIF_RSP_ERROR : BLKIF_RSP_OKAY;
ioreq_unmap(ioreq);
ioreq_finish(ioreq);
- bdrv_acct_done(ioreq->blkdev->bs, &ioreq->acct);
+ switch (ioreq->req.operation) {
+ case BLKIF_OP_WRITE:
+ case BLKIF_OP_FLUSH_DISKCACHE:
+ if (!ioreq->req.nr_segments) {
+ break;
+ }
+ case BLKIF_OP_READ:
+ bdrv_acct_done(ioreq->blkdev->bs, &ioreq->acct);
+ break;
+ default:
+ break;
+ }
qemu_bh_schedule(ioreq->blkdev->bh);
}
--
1.7.10.4