qcow2: Refactor qcow2_free_any_clusters

Zero clusters will add another cluster type. Refactor the open-coded
cluster type detection into a switch of QCOW2_CLUSTER_* options so that
the detection is in a single place. This makes it easier to add new
cluster types.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Kevin Wolf 2012-03-27 13:09:22 +02:00
parent 8e37f681d5
commit c7a4c37a0f

View File

@ -679,31 +679,34 @@ void qcow2_free_clusters(BlockDriverState *bs,
} }
/* /*
* free_any_clusters * Free a cluster using its L2 entry (handles clusters of all types, e.g.
* * normal cluster, compressed cluster, etc.)
* free clusters according to its type: compressed or not
*
*/ */
void qcow2_free_any_clusters(BlockDriverState *bs, void qcow2_free_any_clusters(BlockDriverState *bs,
uint64_t cluster_offset, int nb_clusters) uint64_t l2_entry, int nb_clusters)
{ {
BDRVQcowState *s = bs->opaque; BDRVQcowState *s = bs->opaque;
/* free the cluster */ switch (qcow2_get_cluster_type(l2_entry)) {
case QCOW2_CLUSTER_COMPRESSED:
if (cluster_offset & QCOW_OFLAG_COMPRESSED) { {
int nb_csectors; int nb_csectors;
nb_csectors = ((cluster_offset >> s->csize_shift) & nb_csectors = ((l2_entry >> s->csize_shift) &
s->csize_mask) + 1; s->csize_mask) + 1;
qcow2_free_clusters(bs, qcow2_free_clusters(bs,
(cluster_offset & s->cluster_offset_mask) & ~511, (l2_entry & s->cluster_offset_mask) & ~511,
nb_csectors * 512); nb_csectors * 512);
return; }
break;
case QCOW2_CLUSTER_NORMAL:
qcow2_free_clusters(bs, l2_entry & L2E_OFFSET_MASK,
nb_clusters << s->cluster_bits);
break;
case QCOW2_CLUSTER_UNALLOCATED:
break;
default:
abort();
} }
qcow2_free_clusters(bs, cluster_offset & L2E_OFFSET_MASK,
nb_clusters << s->cluster_bits);
} }