[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH 7/9] mirror: allow to save buffer for QEMUIOVector i
From: |
Denis V. Lunev |
Subject: |
[Qemu-block] [PATCH 7/9] mirror: allow to save buffer for QEMUIOVector in MirrorOp |
Date: |
Tue, 14 Jun 2016 18:25:14 +0300 |
Properly cook MirrorOp initialization/deinitialization. The field is not
yet used actually.
Signed-off-by: Denis V. Lunev <address@hidden>
Reviewed-by: Vladimir Sementsov-Ogievskiy <address@hidden>
CC: Stefan Hajnoczi <address@hidden>
CC: Fam Zheng <address@hidden>
CC: Kevin Wolf <address@hidden>
CC: Max Reitz <address@hidden>
CC: Jeff Cody <address@hidden>
CC: Eric Blake <address@hidden>
---
block/mirror.c | 32 +++++++++++++++++++-------------
1 file changed, 19 insertions(+), 13 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
index d8be80a..7471211 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -73,6 +73,7 @@ typedef struct MirrorOp {
QEMUIOVector qiov;
int64_t sector_num;
int nb_sectors;
+ void *buf;
} MirrorOp;
static BlockErrorAction mirror_error_action(MirrorBlockJob *s, bool read,
@@ -100,24 +101,28 @@ static void mirror_iteration_done(MirrorOp *op, int ret)
s->in_flight--;
s->sectors_in_flight -= op->nb_sectors;
iov = op->qiov.iov;
- for (i = 0; i < op->qiov.niov; i++) {
- MirrorBuffer *buf = (MirrorBuffer *) iov[i].iov_base;
- QSIMPLEQ_INSERT_TAIL(&s->buf_free, buf, next);
- s->buf_free_count++;
- }
- sectors_per_chunk = s->granularity >> BDRV_SECTOR_BITS;
- chunk_num = op->sector_num / sectors_per_chunk;
- nb_chunks = DIV_ROUND_UP(op->nb_sectors, sectors_per_chunk);
- bitmap_clear(s->in_flight_bitmap, chunk_num, nb_chunks);
- if (ret >= 0) {
- if (s->cow_bitmap) {
- bitmap_set(s->cow_bitmap, chunk_num, nb_chunks);
+ if (op->buf == NULL) {
+ for (i = 0; i < op->qiov.niov; i++) {
+ MirrorBuffer *buf = (MirrorBuffer *) iov[i].iov_base;
+ QSIMPLEQ_INSERT_TAIL(&s->buf_free, buf, next);
+ s->buf_free_count++;
+ }
+
+ sectors_per_chunk = s->granularity >> BDRV_SECTOR_BITS;
+ chunk_num = op->sector_num / sectors_per_chunk;
+ nb_chunks = DIV_ROUND_UP(op->nb_sectors, sectors_per_chunk);
+ bitmap_clear(s->in_flight_bitmap, chunk_num, nb_chunks);
+ if (ret >= 0) {
+ if (s->cow_bitmap) {
+ bitmap_set(s->cow_bitmap, chunk_num, nb_chunks);
+ }
+ s->common.offset += (uint64_t)op->nb_sectors * BDRV_SECTOR_SIZE;
}
- s->common.offset += (uint64_t)op->nb_sectors * BDRV_SECTOR_SIZE;
}
qemu_iovec_destroy(&op->qiov);
+ g_free(op->buf);
g_free(op);
if (s->waiting_for_io) {
@@ -255,6 +260,7 @@ static int mirror_do_read(MirrorBlockJob *s, int64_t
sector_num,
op->s = s;
op->sector_num = sector_num;
op->nb_sectors = nb_sectors;
+ op->buf = NULL;
/* Now make a QEMUIOVector taking enough granularity-sized chunks
* from s->buf_free.
--
2.5.0
- Re: [Qemu-block] [PATCH 3/9] mirror: optimize dirty bitmap filling in mirror_run a bit, (continued)
[Qemu-block] [PATCH 5/9] mirror: improve performance of mirroring of empty disk, Denis V. Lunev, 2016/06/14
- Re: [Qemu-block] [PATCH 5/9] mirror: improve performance of mirroring of empty disk, Eric Blake, 2016/06/14
- Re: [Qemu-block] [PATCH 5/9] mirror: improve performance of mirroring of empty disk, Stefan Hajnoczi, 2016/06/15
- Re: [Qemu-block] [Qemu-devel] [PATCH 5/9] mirror: improve performance of mirroring of empty disk, Denis V. Lunev, 2016/06/15
- Re: [Qemu-block] [Qemu-devel] [PATCH 5/9] mirror: improve performance of mirroring of empty disk, Stefan Hajnoczi, 2016/06/16
- Re: [Qemu-block] [Qemu-devel] [PATCH 5/9] mirror: improve performance of mirroring of empty disk, Eric Blake, 2016/06/16
- Re: [Qemu-block] [Qemu-devel] [PATCH 5/9] mirror: improve performance of mirroring of empty disk, Stefan Hajnoczi, 2016/06/17
[Qemu-block] [PATCH 7/9] mirror: allow to save buffer for QEMUIOVector in MirrorOp,
Denis V. Lunev <=
[Qemu-block] [PATCH 8/9] mirror: use synch scheme for drive mirror, Denis V. Lunev, 2016/06/14
[Qemu-block] [PATCH 6/9] block: pass qiov into before_write notifier, Denis V. Lunev, 2016/06/14