Patchwork [RFC,V8,22/24] qcow2: Add qcow2_dedup_init and qcow2_dedup_close.

login
register
mail settings
Submitter Benoît Canet
Date June 20, 2013, 2:26 p.m.
Message ID <1371738392-9594-23-git-send-email-benoit@irqsave.net>
Download mbox | patch
Permalink /patch/252961/
State New
Headers show

Comments

Benoît Canet - June 20, 2013, 2:26 p.m.
Signed-off-by: Benoit Canet <benoit@irqsave.net>
---
 block/qcow2-dedup.c |   60 +++++++++++++++++++++++++++++++++++++++++++++++++++
 block/qcow2.c       |    2 +-
 block/qcow2.h       |    2 ++
 3 files changed, 63 insertions(+), 1 deletion(-)

Patch

diff --git a/block/qcow2-dedup.c b/block/qcow2-dedup.c
index 606459f..5eeea38 100644
--- a/block/qcow2-dedup.c
+++ b/block/qcow2-dedup.c
@@ -716,3 +716,63 @@  void qcow2_dedup_destroy_hash(BlockDriverState *bs,
 free_exit:
    qemu_vfree(buf);
 }
+
+int qcow2_dedup_init(BlockDriverState *bs)
+{
+    BDRVQcowState *s = bs->opaque;
+    int ret = 0;
+
+    s->has_dedup = true;
+
+    /* if we are read-only we don't init anything */
+    if (bs->read_only) {
+        return 0;
+    }
+
+    /* no need to allocate the various store's buffers since qcow2_store_load
+     * will do it
+     */
+
+    /* load and parse the configuration from disk */
+    ret = qcow2_store_load(bs, &s->key_value_store);
+
+    if (ret < 0) {
+        return ret;
+    }
+
+    /* if QEMU crashed forget everyting that was stored in the store */
+    if(s->dedup_dirty) {
+        qcow2_store_forget(bs, &s->key_value_store);
+    }
+
+    /* set the dirty bit */
+    s->dedup_dirty = true;
+    qcow2_update_header(bs);
+
+    /* load the journal and the incarnations in a coroutine */
+    return qcow2_store_start(bs, &s->key_value_store);
+}
+
+void qcow2_dedup_close(BlockDriverState *bs)
+{
+    BDRVQcowState *s = bs->opaque;
+    int ret = 0;
+
+    /* if we are read-only we don't need to cleanup */
+    if (bs->read_only) {
+        return;
+    }
+
+    ret = qcow2_store_flush(bs, &s->key_value_store);
+
+    qcow2_store_cleanup(&s->key_value_store);
+
+    /* flush failed -> leave the store dirty so it will be discard at restart */
+    if (ret < 0) {
+        return;
+    }
+
+    /* clear the dirty bit */
+    s->dedup_dirty = false;
+    qcow2_update_header(bs);
+}
diff --git a/block/qcow2.c b/block/qcow2.c
index ea2f0f2..f7b94dd 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1546,7 +1546,7 @@  static int qcow2_create2(const char *filename, int64_t total_size,
             goto out;
         }
 
-        qcow2_store_cleanup(bs, &s->key_value_store);
+        qcow2_store_cleanup(&s->key_value_store);
     }
 
     /* Want a backing file? There you go.*/
diff --git a/block/qcow2.h b/block/qcow2.h
index 3c6e685..b293be7 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -751,5 +751,7 @@  int qcow2_dedup_store_new_hashes(BlockDriverState *bs,
                                  uint64_t physical_sect);
 void qcow2_dedup_destroy_hash(BlockDriverState *bs,
                               uint64_t cluster_index);
+int qcow2_dedup_init(BlockDriverState *bs);
+void qcow2_dedup_close(BlockDriverState *bs);
 
 #endif