[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 08/19] qcow2: Simplify count_cow_clusters
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 08/19] qcow2: Simplify count_cow_clusters |
Date: |
Thu, 12 Apr 2012 17:01:09 +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 05/19] qcow2: Fail write_compressed when overwriting data, (continued)
- [Qemu-devel] [PATCH 05/19] qcow2: Fail write_compressed when overwriting data, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 04/19] qcow2: Ignore reserved bits in count_contiguous_clusters(), Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 03/19] qcow2: Ignore reserved bits in get_cluster_offset, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 02/19] qcow2: Save disk size in snapshot header, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 09/19] qcow2: Ignore reserved bits in refcount table entries, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 07/19] qcow2: Refactor qcow2_free_any_clusters, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 10/19] qcow2: Ignore reserved bits in check_refcounts, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 18/19] [RFC] Possible qcow2 specification extensions, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 06/19] qcow2: Ignore reserved bits in L1/L2 entries, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 11/19] qcow2: Version 3 images, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 08/19] qcow2: Simplify count_cow_clusters,
Kevin Wolf <=
- [Qemu-devel] [PATCH 12/19] qcow2: Support reading zero clusters, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 14/19] qemu-iotests: add a simple test for write_zeroes, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 15/19] qemu-iotests: Test backing file COW with zero clusters, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 17/19] qemu-iotests: Add -o and make v3 the default for qcow2, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 13/19] qcow2: Support for feature table header extension, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 17.5/19] qemu-iotests: Fix test 031 for qcow2 v3 support, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 16/19] qcow2: Zero write support, Kevin Wolf, 2012/04/12
- [Qemu-devel] [PATCH 19/19] [RFC] Add feature table entries for new flags, Kevin Wolf, 2012/04/12