qemu-block
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]