[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC V2 09/20] qcow2: Add qcow2_co_load_dedup_hashes.
From: |
Benoît Canet |
Subject: |
[Qemu-devel] [RFC V2 09/20] qcow2: Add qcow2_co_load_dedup_hashes. |
Date: |
Wed, 17 Oct 2012 18:00:18 +0200 |
This coroutine load all the hashes in the red black tree at startup.
---
block/qcow2-dedup.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
block/qcow2.h | 1 +
2 files changed, 45 insertions(+)
diff --git a/block/qcow2-dedup.c b/block/qcow2-dedup.c
index c626720..a2f6657 100644
--- a/block/qcow2-dedup.c
+++ b/block/qcow2-dedup.c
@@ -634,3 +634,47 @@ int qcow2_dedup_write_new_hashes(BlockDriverState *bs,
fail:
return ret;
}
+
+/*
+ * This coroutine load the deduplication hashes in the red black tree
+ *
+ * @data: the given BlockDriverState
+ * @ret: NULL
+ */
+void coroutine_fn qcow2_co_load_dedup_hashes(void *opaque)
+{
+ BlockDriverState *bs = opaque;
+ BDRVQcowState *s = bs->opaque;
+ int ret;
+ uint8_t *hash = NULL;
+ uint8_t null_hash[HASH_LENGTH];
+ uint64_t max_cluster_offset, i;
+ int nb_hash_in_dedup_cluster = s->cluster_size / HASH_LENGTH;
+
+ /* prepare the null hash */
+ memset(null_hash, 0, HASH_LENGTH);
+
+ max_cluster_offset = s->dedup_table_size * nb_hash_in_dedup_cluster;
+
+ for (i = 0; i < max_cluster_offset; i++) {
+ /* get the hash */
+ qemu_co_mutex_lock(&s->lock);
+ ret = qcow2_dedup_read_write_hash(bs, &hash,
+ i * s->cluster_sectors,
+ false);
+ qemu_co_mutex_unlock(&s->lock);
+ if (ret < 0) {
+ error_report("Failed to load deduplication hash.");
+ }
+
+ /* if the hash is not null load it into red black tree */
+ if (memcmp(hash, null_hash, HASH_LENGTH)) {
+ qemu_co_mutex_lock(&s->lock);
+ qcow2_dedup_insert_hash_in_rb_tree(bs, hash,
+ i * s->cluster_sectors);
+ qemu_co_mutex_unlock(&s->lock);
+ } else {
+ free(hash);
+ }
+ }
+}
diff --git a/block/qcow2.h b/block/qcow2.h
index 58aee77..5bab6e2 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -375,5 +375,6 @@ int qcow2_dedup(BlockDriverState *bs,
int qcow2_dedup_write_new_hashes(BlockDriverState *bs,
uint64_t cluster_offset,
int count);
+void coroutine_fn qcow2_co_load_dedup_hashes(void *opaque);
#endif
--
1.7.10.4
- [Qemu-devel] [RFC V2 00/20] QCOW2 deduplication, Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 03/20] qcow2: Add deduplication structures and fields., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 06/20] qcow2: Add qcow2_dedup and related functions., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 07/20] qcow2: Add qcow2_dedup_write_new_hashes., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 08/20] qcow2: Implement qcow2_compute_cluster_hash., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 09/20] qcow2: Add qcow2_co_load_dedup_hashes.,
Benoît Canet <=
- [Qemu-devel] [RFC V2 05/20] qcow2: Rename update_refcount into qcow2_update_refcount., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 04/20] qcow2: Add qcow2_de dup_read_missing_and_concatenate, Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 15/20] block: Add dedup image create option., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 01/20] qcow2: Add deduplication to the qcow2 specification., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 17/20] qcow2: Integrate deduplication in qcow2_co_writev loop., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 16/20] qcow2: Allow creation of images using deduplication., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 10/20] qcow2: Add qcow2_dedup_grow_table., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 12/20] qcow2: Extract qcow2_do_table_init., Benoît Canet, 2012/10/17