From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41578) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bCqDy-0007Qp-IF for qemu-devel@nongnu.org; Tue, 14 Jun 2016 11:25:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bCqDw-0003XK-Gq for qemu-devel@nongnu.org; Tue, 14 Jun 2016 11:25:53 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:34816 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bCqDw-0003Wn-18 for qemu-devel@nongnu.org; Tue, 14 Jun 2016 11:25:52 -0400 From: "Denis V. Lunev" Date: Tue, 14 Jun 2016 18:25:14 +0300 Message-Id: <1465917916-22348-8-git-send-email-den@openvz.org> In-Reply-To: <1465917916-22348-1-git-send-email-den@openvz.org> References: <1465917916-22348-1-git-send-email-den@openvz.org> Subject: [Qemu-devel] [PATCH 7/9] mirror: allow to save buffer for QEMUIOVector in MirrorOp List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, qemu-block@nongnu.org Cc: vsementsov@virtuozzo.com, "Denis V. Lunev" , Stefan Hajnoczi , Fam Zheng , Kevin Wolf , Max Reitz , Jeff Cody , Eric Blake Properly cook MirrorOp initialization/deinitialization. The field is not yet used actually. Signed-off-by: Denis V. Lunev Reviewed-by: Vladimir Sementsov-Ogievskiy CC: Stefan Hajnoczi CC: Fam Zheng CC: Kevin Wolf CC: Max Reitz CC: Jeff Cody CC: Eric Blake --- 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