qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC V2 03/20] qcow2: Add deduplication structures and fiel


From: Benoît Canet
Subject: [Qemu-devel] [RFC V2 03/20] qcow2: Add deduplication structures and fields.
Date: Wed, 17 Oct 2012 18:00:12 +0200

---
 block/qcow2.h |   25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/block/qcow2.h b/block/qcow2.h
index b4eb654..e38667c 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -26,6 +26,7 @@
 #define BLOCK_QCOW2_H
 
 #include "aes.h"
+#include "rbtree.h"
 #include "qemu-coroutine.h"
 
 //#define DEBUG_ALLOC
@@ -58,6 +59,19 @@
 
 #define DEFAULT_CLUSTER_SIZE 65536
 
+/* Red Black Tree deduplication node */
+typedef struct {
+    struct rb_node node;
+    uint8_t *hash;         /* SHA256 hash of a given cluster */
+    uint64_t offset;       /* offset where the cluster is stored (sectors) */
+} QCowHashNode;
+
+/* Undedupable hashes that must be written later to disk */
+typedef struct QCowHashElement {
+    uint8_t *hash;
+    QTAILQ_ENTRY(QCowHashElement) next;
+} QCowHashElement;
+
 typedef struct QCowHeader {
     uint32_t magic;
     uint32_t version;
@@ -114,8 +128,10 @@ enum {
 enum {
     QCOW2_INCOMPAT_DIRTY_BITNR   = 0,
     QCOW2_INCOMPAT_DIRTY         = 1 << QCOW2_INCOMPAT_DIRTY_BITNR,
+    QCOW2_INCOMPAT_DEDUP_BITNR   = 1,
+    QCOW2_INCOMPAT_DEDUP         = 1 << QCOW2_INCOMPAT_DEDUP_BITNR,
 
-    QCOW2_INCOMPAT_MASK          = QCOW2_INCOMPAT_DIRTY,
+    QCOW2_INCOMPAT_MASK          = QCOW2_INCOMPAT_DIRTY | QCOW2_INCOMPAT_DEDUP,
 };
 
 /* Compatible feature bits */
@@ -148,6 +164,7 @@ typedef struct BDRVQcowState {
 
     Qcow2Cache* l2_table_cache;
     Qcow2Cache* refcount_block_cache;
+    Qcow2Cache *dedup_cluster_cache;
 
     uint8_t *cluster_cache;
     uint8_t *cluster_data;
@@ -160,6 +177,12 @@ typedef struct BDRVQcowState {
     int64_t free_cluster_index;
     int64_t free_byte_offset;
 
+    bool has_dedup;
+    uint64_t *dedup_table;
+    uint64_t dedup_table_offset;
+    int32_t dedup_table_size;
+    struct rb_root dedup_rb_tree;
+    QTAILQ_HEAD(, QCowHashElement) undedupable_hashes;
     CoMutex lock;
 
     uint32_t crypt_method; /* current crypt method, 0 if no key yet */
-- 
1.7.10.4




reply via email to

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