From: Kevin Wolf Date: Tue, 27 Mar 2012 11:17:22 +0000 (+0200) Subject: qcow2: Simplify count_cow_clusters X-Git-Tag: v1.1-rc0~80^2~10 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=143550a83ef4eef86a847d00023d148e1f59f743;p=qemu.git qcow2: Simplify count_cow_clusters 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 --- diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index d1602d4bd..b8836ba00 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; }