[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC V7 14/32] qcow2: Create qcow2_is_cluster_to_dedup.
From: |
Benoît Canet |
Subject: |
[Qemu-devel] [RFC V7 14/32] qcow2: Create qcow2_is_cluster_to_dedup. |
Date: |
Fri, 15 Mar 2013 15:49:28 +0100 |
Signed-off-by: Benoit Canet <address@hidden>
---
block/qcow2-cluster.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++
block/qcow2.h | 4 ++++
2 files changed, 56 insertions(+)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 3cbb64f..bc42fc6 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -488,6 +488,58 @@ out:
return ret;
}
+/* Check if a cluster is to deduplicate given it's index
+ *
+ * @index: The logical index of the cluster starting from 0
+ * @physical_sect: The physical sector of the cluster as return value
+ * @err: 0 on success, negative on error
+ * @ret: True if the cluster is to deduplicate else false
+ */
+bool qcow2_is_cluster_to_dedup(BlockDriverState *bs,
+ uint64_t index,
+ uint64_t *physical_sect,
+ int *err)
+{
+ BDRVQcowState *s = bs->opaque;
+ unsigned int l1_index, l2_index;
+ uint64_t offset;
+ uint64_t l2_offset;
+ uint64_t *l2_table = NULL;
+
+ *physical_sect = 0;
+ *err = 0;
+
+ l1_index = index >> s->l2_bits;
+
+ if (l1_index >= s->l1_size) {
+ return false;
+ }
+
+ /* no l1 entry */
+ if (!(s->l1_table[l1_index] & L1E_OFFSET_MASK)) {
+ return false;
+ }
+
+ l2_offset = s->l1_table[l1_index] & L1E_OFFSET_MASK;
+
+ *err = l2_load(bs, l2_offset, &l2_table);
+ if (*err < 0) {
+ return false;
+ }
+
+ l2_index = index & (s->l2_size - 1);
+
+ offset = be64_to_cpu(l2_table[l2_index]);
+ *physical_sect = (offset & L2E_OFFSET_MASK) >> 9;
+
+ *err = qcow2_cache_put(bs, s->l2_table_cache, (void **) &l2_table);
+ if (*err < 0) {
+ return false;
+ }
+
+ return offset & QCOW_OFLAG_PENDING_DEDUP;
+}
+
/*
* get_cluster_table
*
diff --git a/block/qcow2.h b/block/qcow2.h
index 2eab1a4..59c4881 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -438,6 +438,10 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs,
QCowL2Meta *m);
int qcow2_discard_clusters(BlockDriverState *bs, uint64_t offset,
int nb_sectors);
int qcow2_zero_clusters(BlockDriverState *bs, uint64_t offset, int nb_sectors);
+bool qcow2_is_cluster_to_dedup(BlockDriverState *bs,
+ uint64_t index,
+ uint64_t *physical_sect,
+ int *ret);
/* qcow2-snapshot.c functions */
int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info);
--
1.7.10.4
- [Qemu-devel] [RFC V7 04/32] qcow2: Add qcow2_de dup_read_missing_and_concatenate, (continued)
- [Qemu-devel] [RFC V7 04/32] qcow2: Add qcow2_de dup_read_missing_and_concatenate, Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 05/32] qcow2: Create a way to link to l2 tables when deduplicating., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 06/32] qcow2: Make qcow2_update_cluster_refcount public., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 09/32] qcow2: Do allocate on rewrite on the dedup case., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 07/32] qcow2: Add qcow2_dedup and related functions, Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 08/32] qcow2: Add qcow2_dedup_store_new_hashes., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 10/32] qcow2: Implement qcow2_compute_cluster_hash., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 12/32] qcow2: Makes qcow2_alloc_cluster_link_l2 mark to deduplicate clusters., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 11/32] qcow2: Add qcow2_dedup_grow_table and use it., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 13/32] qcow2: make the deduplication forget a cluster hash when a cluster is to dedupe, Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 14/32] qcow2: Create qcow2_is_cluster_to_dedup.,
Benoît Canet <=
- [Qemu-devel] [RFC V7 16/32] qcow2: Extract qcow2_do_table_init., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 15/32] qcow2: Load and save deduplication table header extension., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 17/32] qcow2-cache: Allow to choose table size at creation., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 18/32] qcow2: Extract qcow2_set_incompat_feature and qcow2_clear_incompat_feature., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 21/32] qcow2: Remove hash when cluster is deleted., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 22/32] qcow2: Add qcow2_dedup_is_running to probe if dedup is running., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 20/32] qcow2: Drop hash for a given cluster when dedup makes refcount > 2^16/2., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 24/32] qcow2: Serialize write requests when deduplication is activated., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 23/32] qcow2: Integrate deduplication in qcow2_co_writev loop., Benoît Canet, 2013/03/15
- [Qemu-devel] [RFC V7 19/32] block: Add qcow2_dedup format and image creation code., Benoît Canet, 2013/03/15