On 11/10/2014 06:45 AM, Max Reitz wrote: > Add a refcount_order parameter to qcow2_create2(), use that value for > the image header and for calculating the size required for > preallocation. > > For now, always pass 4. > > Signed-off-by: Max Reitz <mre...@redhat.com> > --- > block/qcow2.c | 41 ++++++++++++++++++++++++++++++----------- > 1 file changed, 30 insertions(+), 11 deletions(-) >
> @@ -1811,6 +1811,13 @@ static int qcow2_create2(const char *filename, int64_t > total_size, > int64_t meta_size = 0; > uint64_t nreftablee, nrefblocke, nl1e, nl2e; > int64_t aligned_total_size = align_offset(total_size, cluster_size); > + int refblock_bits, refblock_size; > + /* refcount entry size in bytes */ > + double rces = (1 << refcount_order) / 8.; Would float be any simpler than double? > + > + /* see qcow2_open() */ > + refblock_bits = cluster_bits - (refcount_order - 3); > + refblock_size = 1 << refblock_bits; > > /* header: 1 cluster */ > meta_size += cluster_size; > @@ -1835,20 +1842,20 @@ static int qcow2_create2(const char *filename, > int64_t total_size, > * c = cluster size > * y1 = number of refcount blocks entries > * y2 = meta size including everything > + * rces = refcount entry size in bytes > * then, > * y1 = (y2 + a)/c > - * y2 = y1 * sizeof(u16) + y1 * sizeof(u16) * sizeof(u64) / c + m > + * y2 = y1 * rces + y1 * rces * sizeof(u64) / c + m Hmm. This changes from integral to floating point. Are we going to suffer from any rounding problems? I guess you want double to ensure maximum precision; but whereas earlier patches were limited with refcount_order of 6 to 2^63, this now limits us around 2^53 if we are still trying to be accurate. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature