From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:36617) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UGVxe-0007vF-Uw for qemu-devel@nongnu.org; Fri, 15 Mar 2013 10:50:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UGVxY-0004k6-D9 for qemu-devel@nongnu.org; Fri, 15 Mar 2013 10:50:22 -0400 Received: from nodalink.pck.nerim.net ([62.212.105.220]:59570 helo=paradis.irqsave.net) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UGVxY-0004k1-4l for qemu-devel@nongnu.org; Fri, 15 Mar 2013 10:50:16 -0400 From: =?UTF-8?q?Beno=C3=AEt=20Canet?= Date: Fri, 15 Mar 2013 15:49:23 +0100 Message-Id: <1363358986-8360-10-git-send-email-benoit@irqsave.net> In-Reply-To: <1363358986-8360-1-git-send-email-benoit@irqsave.net> References: <1363358986-8360-1-git-send-email-benoit@irqsave.net> Subject: [Qemu-devel] [RFC V7 09/32] qcow2: Do allocate on rewrite on the dedup case. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, =?UTF-8?q?Beno=C3=AEt=20Canet?= , stefanha@redhat.com This patch does allocate on rewrite when deduplication is on. This get rid of the need of removing the old hash of the lookup structure when a cluster get rewritten. The old data is left in place and will be collected/deleted when it's cluster will reach 0. Signed-off-by: Benoit Canet --- block/qcow2-cluster.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 3354f39..fae4110 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -898,11 +898,17 @@ again: cluster_offset = be64_to_cpu(l2_table[l2_index]); + /* If dedup is on we are always allocating wether it's a write or a + * rewrite. Doing this simplify a lot the rewrite cluster case since + * we don't need to remove the obsolete hash from the tree. + * Old clusters will be deleted when their refcount will reach 0. + */ /* - * Check how many clusters are already allocated and don't need COW, and how - * many need a new allocation. + * Check how many clusters are already allocated and don't need COW, + * and how many need a new allocation. */ - if (qcow2_get_cluster_type(cluster_offset) == QCOW2_CLUSTER_NORMAL + if (!s->has_dedup && + qcow2_get_cluster_type(cluster_offset) == QCOW2_CLUSTER_NORMAL && (cluster_offset & QCOW_OFLAG_COPIED)) { /* We keep all QCOW_OFLAG_COPIED clusters */ @@ -931,11 +937,11 @@ again: cluster_offset &= L2E_OFFSET_MASK; /* - * The L2 table isn't used any more after this. As long as the cache works - * synchronously, it's important to release it before calling - * do_alloc_cluster_offset, which may yield if we need to wait for another - * request to complete. If we still had the reference, we could use up the - * whole cache with sleeping requests. + * The L2 table isn't used any more after this. As long as the cache + * works synchronously, it's important to release it before calling + * do_alloc_cluster_offset, which may yield if we need to wait for + * another request to complete. If we still had the reference, we could + * use up the whole cache with sleeping requests. */ ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table); if (ret < 0) { -- 1.7.10.4