On 11/20/2014 10:06 AM, Max Reitz wrote: > Since refcounts do not always have to be a uint16_t, all refcount blocks > and arrays in memory should not have a specific type (thus they become > pointers to void) and for accessing them, two helper functions are used > (a getter and a setter). Those functions are called indirectly through > function pointers in the BDRVQcowState so they may later be exchanged > for different refcount orders. > > With the check and repair functions using this function, the refcount > array they are creating will be in big endian byte order; additionally, > using realloc_refcount_array() makes the size of this refcount array > always cluster-aligned. Both combined allow rebuild_refcount_structure() > to drop the bounce buffer which was used to convert parts of the > refcount array to big endian byte order and store them on disk. Instead, > those parts can now be written directly.
Thanks, that helps. > > Signed-off-by: Max Reitz <mre...@redhat.com> > --- > block/qcow2-refcount.c | 131 > ++++++++++++++++++++++++++++++------------------- > block/qcow2.h | 8 +++ > 2 files changed, 89 insertions(+), 50 deletions(-) > > @@ -2101,7 +2132,7 @@ int qcow2_check_refcounts(BlockDriverState *bs, > BdrvCheckResult *res, > /* Because the old reftable has been exchanged for a new one the > * references have to be recalculated */ > rebuild = false; > - memset(refcount_table, 0, nb_clusters * sizeof(uint16_t)); > + memset(refcount_table, 0, refcount_array_byte_size(s, nb_clusters)); Yep, that makes more sense than what you had in v2. Reviewed-by: Eric Blake <ebl...@redhat.com> -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature