Patchwork [RFC,V7,12/32] qcow2: Makes qcow2_alloc_cluster_link_l2 mark to deduplicate clusters.

login
register
mail settings
Submitter Benoît Canet
Date March 15, 2013, 2:49 p.m.
Message ID <1363358986-8360-13-git-send-email-benoit@irqsave.net>
Download mbox | patch
Permalink /patch/228079/
State New
Headers show

Comments

Benoît Canet - March 15, 2013, 2:49 p.m.
---
 block/qcow2-cluster.c |    4 +++-
 block/qcow2-dedup.c   |    6 ++++++
 block/qcow2.h         |    3 +++
 3 files changed, 12 insertions(+), 1 deletion(-)

Patch

diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index fae4110..0d11ef0 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -1013,7 +1013,9 @@  again:
                     .nb_sectors = avail_sectors - nb_sectors,
                 },
 
-                .l2_entry_flags = QCOW_OFLAG_COPIED,
+                .l2_entry_flags = QCOW_OFLAG_COPIED |
+                                  qcow2_must_deduplicate(bs) ? 
+                                  QCOW_OFLAG_PENDING_DEDUP : 0,
                 .overwrite      = false,
             };
             qemu_co_queue_init(&(*m)->dependent_requests);
diff --git a/block/qcow2-dedup.c b/block/qcow2-dedup.c
index 819c37e..c106bd5 100644
--- a/block/qcow2-dedup.c
+++ b/block/qcow2-dedup.c
@@ -39,6 +39,12 @@  static int qcow2_dedup_read_write_hash(BlockDriverState *bs,
                                        uint64_t physical_sect,
                                        bool write);
 
+bool qcow2_must_deduplicate(BlockDriverState *bs)
+{
+    BDRVQcowState *s = bs->opaque;
+    return s->has_dedup && s->dedup_status != DEDUP_STATUS_STARTED;
+}
+
 /*
  * Grow the deduplication table
  *
diff --git a/block/qcow2.h b/block/qcow2.h
index 7979fc2..9f24b4c 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -314,6 +314,8 @@  typedef struct QCowL2Meta
 
     /* set to true if we are overwriting an L2 table entry */
     bool overwrite;
+    /* set to true if the cluster must be tagged with QCOW_OFLAG_PENDING_DEDUP */
+    bool to_deduplicate;
 
     /**
      * The COW Region between the start of the first allocated cluster and the
@@ -464,6 +466,7 @@  int qcow2_cache_get_empty(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
 int qcow2_cache_put(BlockDriverState *bs, Qcow2Cache *c, void **table);
 
 /* qcow2-dedup.c functions */
+bool qcow2_must_deduplicate(BlockDriverState *bs);
 int qcow2_dedup_read_missing_and_concatenate(BlockDriverState *bs,
                                              QEMUIOVector *qiov,
                                              uint64_t sector,