[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC V8 18/24] qcow2: Remove hash when cluster is deleted.
From: |
Benoît Canet |
Subject: |
[Qemu-devel] [RFC V8 18/24] qcow2: Remove hash when cluster is deleted. |
Date: |
Thu, 20 Jun 2013 16:26:26 +0200 |
Signed-off-by: Benoit Canet <address@hidden>
---
block/qcow2-dedup.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
block/qcow2-refcount.c | 3 +++
block/qcow2.h | 2 ++
3 files changed, 50 insertions(+)
diff --git a/block/qcow2-dedup.c b/block/qcow2-dedup.c
index da4ad5c..599cb2e 100644
--- a/block/qcow2-dedup.c
+++ b/block/qcow2-dedup.c
@@ -656,3 +656,48 @@ 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;
+ uint64_t offset = cluster_index * s->cluster_size;
+ QCowHashInfo hash_info;
+ uint8_t *buf;
+ int ret = 0;
+
+ /* allocate buffer */
+ buf = qemu_blockalign(bs, s->cluster_size);
+
+ /* read cluster from disk */
+ ret = bdrv_pread(bs->file, offset, buf, s->cluster_size);
+
+ /* error */
+ if (ret < 0) {
+ goto free_exit;
+ }
+
+ /* clear hash info */
+ memset(&hash_info, 0, sizeof(QCowHashInfo));
+
+ /* compute hash for the cluster */
+ ret = qcow2_compute_cluster_hash(bs,
+ &hash_info.hash,
+ buf);
+
+
+ /* error */
+ if (ret < 0) {
+ goto free_exit;
+ }
+
+ /* delete hash from key value store. It will not be deduplicated anymore */
+ qcow2_store_delete(bs, &s->key_value_store, &hash_info);
+
+free_exit:
+ qemu_vfree(buf);
+}
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 3bd8f37..2734cd9 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -482,6 +482,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 720131d..6f85e03 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -748,5 +748,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
- [Qemu-devel] [RFC V8 14/24] qcow2: Load and save deduplication table header extension., (continued)
- [Qemu-devel] [RFC V8 14/24] qcow2: Load and save deduplication table header extension., Benoît Canet, 2013/06/20
- [Qemu-devel] [RFC V8 13/24] qcow2: Implement qcow2_compute_cluster_hash., Benoît Canet, 2013/06/20
- [Qemu-devel] [RFC V8 17/24] qcow2: Drop hash for a given cluster when dedup makes refcount > 2^16/2., Benoît Canet, 2013/06/20
- [Qemu-devel] [RFC V8 15/24] qcow2: Extract qcow2_set_incompat_feature and qcow2_clear_incompat_feature., Benoît Canet, 2013/06/20
- [Qemu-devel] [RFC V8 19/24] qcow2: Integrate deduplication in qcow2_co_writev loop., Benoît Canet, 2013/06/20
- [Qemu-devel] [RFC V8 16/24] block: Add qcow2_dedup format and image creation code., Benoît Canet, 2013/06/20
- [Qemu-devel] [RFC V8 22/24] qcow2: Add qcow2_dedup_init and qcow2_dedup_close., Benoît Canet, 2013/06/20
- [Qemu-devel] [RFC V8 21/24] qcow2: Integrate SKEIN hash algorithm in deduplication., Benoît Canet, 2013/06/20
- [Qemu-devel] [RFC V8 23/24] qcow2: Enable the deduplication feature., Benoît Canet, 2013/06/20
- [Qemu-devel] [RFC V8 24/24] qcow2: Enable deduplication tests, Benoît Canet, 2013/06/20
- [Qemu-devel] [RFC V8 18/24] qcow2: Remove hash when cluster is deleted.,
Benoît Canet <=
- [Qemu-devel] [RFC V8 20/24] qcow2: Serialize write requests when deduplication is activated., Benoît Canet, 2013/06/20