qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [RFC V7 21/32] qcow2: Remove hash when cluster is deleted.


From: Benoît Canet
Subject: [Qemu-devel] [RFC V7 21/32] qcow2: Remove hash when cluster is deleted.
Date: Fri, 15 Mar 2013 15:49:35 +0100

Signed-off-by: Benoit Canet <address@hidden>
---
 block/qcow2-dedup.c    |   26 ++++++++++++++++++++++++++
 block/qcow2-refcount.c |    3 +++
 block/qcow2.h          |    2 ++
 3 files changed, 31 insertions(+)

diff --git a/block/qcow2-dedup.c b/block/qcow2-dedup.c
index e017721..68a09ff 100644
--- a/block/qcow2-dedup.c
+++ b/block/qcow2-dedup.c
@@ -1044,3 +1044,29 @@ int qcow2_dedup_store_new_hashes(BlockDriverState *bs,
 
     return ret;
 }
+
+/* Clean the last reference to a given cluster when its refcount is zero
+ *
+ * @cluster_index: the index of the physical cluster
+ */
+void qcow2_dedup_destroy_hash(BlockDriverState *bs,
+                              uint64_t cluster_index)
+{
+    BDRVQcowState *s = bs->opaque;
+    QCowHash null_hash;
+    uint64_t logical_sect = 0;
+    uint64_t physical_sect = cluster_index * s->cluster_sectors;
+
+    /* prepare null hash */
+    memset(&null_hash, 0, sizeof(null_hash));
+
+    /* clear from disk */
+    qcow2_dedup_read_write_hash(bs,
+                                &null_hash,
+                                &logical_sect,
+                                physical_sect,
+                                true);
+
+    /* remove from ram if present so we won't dedup with it anymore */
+    qcow2_remove_hash_node_by_sector(bs, physical_sect);
+}
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index b2b3031..ffb8d3a 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -493,6 +493,9 @@ static int QEMU_WARN_UNUSED_RESULT 
update_refcount(BlockDriverState *bs,
             ret = -EINVAL;
             goto fail;
         }
+        if (s->has_dedup && refcount == 0) {
+            qcow2_dedup_destroy_hash(bs, cluster_index);
+        }
         if (refcount == 0 && cluster_index < s->free_cluster_index) {
             s->free_cluster_index = cluster_index;
         }
diff --git a/block/qcow2.h b/block/qcow2.h
index fd48243..c1c0978 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -496,5 +496,7 @@ int qcow2_dedup_store_new_hashes(BlockDriverState *bs,
                                  int count,
                                  uint64_t logical_sect,
                                  uint64_t physical_sect);
+void qcow2_dedup_destroy_hash(BlockDriverState *bs,
+                              uint64_t cluster_index);
 
 #endif
-- 
1.7.10.4




reply via email to

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