[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 08/18] qcow2: Simplify count_cow_clusters
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH v2 08/18] qcow2: Simplify count_cow_clusters |
Date: |
Mon, 16 Apr 2012 17:02:06 +0200 |
count_cow_clusters() tries to reuse existing functions, and all it
achieves is to make things much more complicated than they really are:
Everything needs COW, unless it's a normal cluster with refcount 1.
This patch implements the obvious way of doing this, and by using
qcow2_get_cluster_type() it gets rid of all flag magic.
Signed-off-by: Kevin Wolf <address@hidden>
---
block/qcow2-cluster.c | 35 ++++++++++++++++-------------------
1 files changed, 16 insertions(+), 19 deletions(-)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 157a156..b120b92 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -706,30 +706,27 @@ err:
static int count_cow_clusters(BDRVQcowState *s, int nb_clusters,
uint64_t *l2_table, int l2_index)
{
- int i = 0;
- uint64_t cluster_offset;
+ int i;
- while (i < nb_clusters) {
- i += count_contiguous_clusters(nb_clusters - i, s->cluster_size,
- &l2_table[l2_index], i,
- QCOW_OFLAG_COPIED | QCOW_OFLAG_COMPRESSED);
- if ((i >= nb_clusters) || be64_to_cpu(l2_table[l2_index + i])) {
- break;
- }
+ for (i = 0; i < nb_clusters; i++) {
+ uint64_t l2_entry = be64_to_cpu(l2_table[l2_index + i]);
+ int cluster_type = qcow2_get_cluster_type(l2_entry);
- i += count_contiguous_free_clusters(nb_clusters - i,
- &l2_table[l2_index + i]);
- if (i >= nb_clusters) {
+ switch(cluster_type) {
+ case QCOW2_CLUSTER_NORMAL:
+ if (l2_entry & QCOW_OFLAG_COPIED) {
+ goto out;
+ }
break;
- }
-
- cluster_offset = be64_to_cpu(l2_table[l2_index + i]);
-
- if ((cluster_offset & QCOW_OFLAG_COPIED) ||
- (cluster_offset & QCOW_OFLAG_COMPRESSED))
+ case QCOW2_CLUSTER_UNALLOCATED:
+ case QCOW2_CLUSTER_COMPRESSED:
break;
+ default:
+ abort();
+ }
}
+out:
assert(i <= nb_clusters);
return i;
}
--
1.7.6.5
- [Qemu-devel] [PATCH v2 00/18] qcow2: Basic version 3 support, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 01/18] Specification for qcow2 version 3, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 02/18] qcow2: Save disk size in snapshot header, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 04/18] qcow2: Ignore reserved bits in count_contiguous_clusters(), Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 03/18] qcow2: Ignore reserved bits in get_cluster_offset, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 05/18] qcow2: Fail write_compressed when overwriting data, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 07/18] qcow2: Refactor qcow2_free_any_clusters, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 06/18] qcow2: Ignore reserved bits in L1/L2 entries, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 09/18] qcow2: Ignore reserved bits in refcount table entries, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 12/18] qcow2: Support reading zero clusters, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 08/18] qcow2: Simplify count_cow_clusters,
Kevin Wolf <=
- [Qemu-devel] [PATCH v2 10/18] qcow2: Ignore reserved bits in check_refcounts, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 13/18] qcow2: Support for feature table header extension, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 14/18] qemu-iotests: add a simple test for write_zeroes, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 15/18] qemu-iotests: Test backing file COW with zero clusters, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 17/18] qemu-iotests: Add -o and make v3 the default for qcow2, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 18/18] qemu-iotests: Fix test 031 for qcow2 v3 support, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 11/18] qcow2: Version 3 images, Kevin Wolf, 2012/04/16
- [Qemu-devel] [PATCH v2 16/18] qcow2: Zero write support, Kevin Wolf, 2012/04/16