diff options
author | Kevin Wolf <kwolf@redhat.com> | 2012-03-02 19:27:53 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2012-03-12 15:14:07 +0100 |
commit | bf319ece56bc07608bfdf46b8ef5c61b52be83f6 (patch) | |
tree | a5d4f1ce762b02d78549b5db986cde3e08cb91b3 /block | |
parent | 6cc2a4157b31c47303da96c5ed7836db3c10def6 (diff) | |
download | qemu-bf319ece56bc07608bfdf46b8ef5c61b52be83f6.zip qemu-bf319ece56bc07608bfdf46b8ef5c61b52be83f6.tar.gz qemu-bf319ece56bc07608bfdf46b8ef5c61b52be83f6.tar.bz2 |
qcow2: Factor out count_cow_clusters
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/qcow2-cluster.c | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index a791bbe..903454d 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -677,6 +677,41 @@ err: } /* + * Returns the number of contiguous clusters that can be used for an allocating + * write, but require COW to be performed (this includes yet unallocated space, + * which must copy from the backing file) + */ +static int count_cow_clusters(BDRVQcowState *s, int nb_clusters, + uint64_t *l2_table, int l2_index) +{ + int i = 0; + uint64_t cluster_offset; + + while (i < nb_clusters) { + i += count_contiguous_clusters(nb_clusters - i, s->cluster_size, + &l2_table[l2_index], i, 0); + if ((i >= nb_clusters) || be64_to_cpu(l2_table[l2_index + i])) { + break; + } + + i += count_contiguous_free_clusters(nb_clusters - i, + &l2_table[l2_index + i]); + if (i >= nb_clusters) { + break; + } + + cluster_offset = be64_to_cpu(l2_table[l2_index + i]); + + if ((cluster_offset & QCOW_OFLAG_COPIED) || + (cluster_offset & QCOW_OFLAG_COMPRESSED)) + break; + } + + assert(i <= nb_clusters); + return i; +} + +/* * alloc_cluster_offset * * For a given offset of the disk image, return cluster offset in qcow2 file. @@ -739,25 +774,7 @@ again: /* how many available clusters ? */ - while (i < nb_clusters) { - i += count_contiguous_clusters(nb_clusters - i, s->cluster_size, - &l2_table[l2_index], i, 0); - if ((i >= nb_clusters) || be64_to_cpu(l2_table[l2_index + i])) { - break; - } - - i += count_contiguous_free_clusters(nb_clusters - i, - &l2_table[l2_index + i]); - if (i >= nb_clusters) { - break; - } - - cluster_offset = be64_to_cpu(l2_table[l2_index + i]); - - if ((cluster_offset & QCOW_OFLAG_COPIED) || - (cluster_offset & QCOW_OFLAG_COMPRESSED)) - break; - } + i = count_cow_clusters(s, nb_clusters, l2_table, l2_index); assert(i <= nb_clusters); nb_clusters = i; |