[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC V5 21/62] qcow2: Remove hash when cluster is deleted.
From: |
Benoît Canet |
Subject: |
[Qemu-devel] [RFC V5 21/62] qcow2: Remove hash when cluster is deleted. |
Date: |
Wed, 16 Jan 2013 16:48:00 +0100 |
---
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 9eba773..8b51dda 100644
--- a/block/qcow2-dedup.c
+++ b/block/qcow2-dedup.c
@@ -942,6 +942,32 @@ int qcow2_dedup_store_new_hashes(BlockDriverState *bs,
return ret;
}
+/* Clean the last reference to a given cluster when it's refcount is zero
+ *
+ * @cluster_index: the index of the physical cluster
+ */
+void qcow2_dedup_refcount_zero_reached(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);
+}
+
/* Force to use a new physical cluster and QCowHashNode when the refcount pass
* 2^16/2.
*
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index ac396c4..6a6719f 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -492,6 +492,9 @@ int QEMU_WARN_UNUSED_RESULT
update_refcount(BlockDriverState *bs,
if (s->has_dedup && deduplication && refcount >= 0xFFFF/2) {
qcow2_dedup_refcount_half_max_reached(bs, cluster_index);
}
+ if (s->has_dedup && refcount == 0) {
+ qcow2_dedup_refcount_zero_reached(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 ba10ed0..842c321 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -501,6 +501,8 @@ int qcow2_dedup_store_new_hashes(BlockDriverState *bs,
int count,
uint64_t logical_sect,
uint64_t physical_sect);
+void qcow2_dedup_refcount_zero_reached(BlockDriverState *bs,
+ uint64_t cluster_index);
void qcow2_dedup_refcount_half_max_reached(BlockDriverState *bs,
uint64_t cluster_index);
--
1.7.10.4
- [Qemu-devel] [RFC V5 54/62] block: Add bdrv_is_dedup_running., (continued)
- [Qemu-devel] [RFC V5 54/62] block: Add bdrv_is_dedup_running., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 55/62] block: Add bdrv_resume_dedup., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 61/62] qmp: Add block-pause-dedup., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 62/62] qmp: Add block_resume_dedup., Benoît Canet, 2013/01/16
- Re: [Qemu-devel] [RFC V5 00/62] QCOW2 deduplication, Eric Blake, 2013/01/16
- [Qemu-devel] [RFC V5 41/62] qcow2: Collect undeduplicated cluster metric., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 25/62] qcow2: Add verification of dedup table., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 39/62] qcow2: Collect unaligned writes missing data reads metric., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 59/62] qcow2: Make dedup status persists., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 21/62] qcow2: Remove hash when cluster is deleted.,
Benoît Canet <=
- [Qemu-devel] [RFC V5 51/62] block: Add BlockDriver function prototype to pause and resume deduplication., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 37/62] qcow2: Add deduplication metrics structures., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 24/62] qcow2: Serialize write requests when deduplication is activated., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 26/62] qcow2: Adapt checking of QCOW_OFLAG_COPIED for dedup., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 40/62] qcow2: Collect deduplicated cluster metric., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 57/62] qcow2: Add qcow2_pause_dedup., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 16/62] qcow2-cache: Allow to choose table size at creation., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 58/62] qcow2: Add qcow2_resume_dedup., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 60/62] qerror: Add QERR_DEVICE_NOT_DEDUPLICATED., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 28/62] qcow2: Do not overwrite existing entries with QCOW_OFLAG_COPIED., Benoît Canet, 2013/01/16