On 07.05.2017 02:05, Eric Blake wrote: > Treat plain zero clusters differently from allocated ones, so that > we can simplify the logic of checking whether an offset is present. > Do this by splitting QCOW2_CLUSTER_ZERO into two new enums, > QCOW2_CLUSTER_ZERO_PLAIN and QCOW2_CLUSTER_ZERO_ALLOC. > > I tried to arrange the enum so that we could use > 'ret <= QCOW2_CLUSTER_ZERO_PLAIN' for all unallocated types, and > 'ret >= QCOW2_CLUSTER_ZERO_ALLOC' for allocated types, although > I didn't actually end up taking advantage of the layout. > > In many cases, this leads to simpler code, by properly combining > cases (sometimes, both zero types pair together, other times, > plain zero is more like unallocated while allocated zero is more > like normal). > > Signed-off-by: Eric Blake <ebl...@redhat.com> > > --- > v13: s/!preallocated/cluster_type == QCOW2_CLUSTER_ZERO_PLAIN/, fix > error message text (including iotest fallout), rebase to earlier cleanups > v12: new patch > --- > block/qcow2.h | 8 +++-- > block/qcow2-cluster.c | 81 > ++++++++++++++++++---------------------------- > block/qcow2-refcount.c | 44 +++++++++++-------------- > block/qcow2.c | 9 ++++-- > tests/qemu-iotests/060.out | 6 ++-- > 5 files changed, 64 insertions(+), 84 deletions(-)
[...] > diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c > index ed78a30..a4a3229 100644 > --- a/block/qcow2-cluster.c > +++ b/block/qcow2-cluster.c [...] > @@ -344,13 +343,13 @@ static int count_contiguous_clusters_unallocated(int > nb_clusters, > { > int i; > > - assert(wanted_type == QCOW2_CLUSTER_ZERO || > + assert(wanted_type == QCOW2_CLUSTER_ZERO_PLAIN || > wanted_type == QCOW2_CLUSTER_UNALLOCATED); > for (i = 0; i < nb_clusters; i++) { > uint64_t entry = be64_to_cpu(l2_table[i]); > - int type = qcow2_get_cluster_type(entry); > + QCow2ClusterType type = qcow2_get_cluster_type(entry); With this moved into the previous patch: Reviewed-by: Max Reitz <mre...@redhat.com> (No, I'm not mentioning the fact that 060.out contains one more mention of "Data cluster offset" that should definitely be a "Cluster allocation offset" or even "Preallocated zero cluster offset" at block/qcow2-cluster.c:1780, because let's really worry about this later) > > - if (type != wanted_type || entry & L2E_OFFSET_MASK) { > + if (type != wanted_type) { > break; > } > }
signature.asc
Description: OpenPGP digital signature