@@ -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);
+}
@@ -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.*/
@@ -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
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(-)