---
block/qcow2-dedup.c | 16 ++++++++++++++++
block/qcow2.h | 1 +
2 files changed, 17 insertions(+)
diff --git a/block/qcow2-dedup.c b/block/qcow2-dedup.c
index 72fab64..60e93fe 100644
--- a/block/qcow2-dedup.c
+++ b/block/qcow2-dedup.c
@@ -680,6 +680,22 @@ void coroutine_fn qcow2_co_load_dedup_hashes(void *opaque)
}
/*
+ * This function walk in the red black tree remove the elements and free them.
+ */
+void qcow2_dedup_destroy_rb_tree(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+
+ while (!RB_EMPTY_ROOT(&s->dedup_rb_tree)) {
+ QCowHashNode *data =
+ rb_entry(s->dedup_rb_tree.rb_node, QCowHashNode, node);
+ rb_erase(&data->node, &s->dedup_rb_tree);
+ g_free(data->hash);
+ g_free(data);
+ }
+}
+
+/*
* Save the dedup table information into the header extensions
*
* @table_offset: the dedup table offset in the QCOW2 file
diff --git a/block/qcow2.h b/block/qcow2.h
index 0b999fb..1d629a7 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -390,6 +390,7 @@ int qcow2_dedup_write_new_hashes(BlockDriverState *bs,
int count);
void coroutine_fn qcow2_co_load_dedup_hashes(void *opaque);
void qcow2_dedup_start_loading_hashes(BlockDriverState *bs);
+void qcow2_dedup_destroy_rb_tree(BlockDriverState *bs);
int qcow2_dedup_grow_table(BlockDriverState *bs,
int min_size,
bool exact_size);
--
1.7.10.4