mirror of https://github.com/xemu-project/xemu.git
qcow2: Fix preallocation size formula
When calculating the number of reftable entries, we should actually use the number of refblocks and not (wrongly[1]) re-calculate it. [1] "Wrongly" means: Dividing the number of clusters by the number of entries per refblock and rounding down instead of up. Reported-by: Eric Blake <eblake@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
de9efdb334
commit
92413c16be
|
@ -2139,7 +2139,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
|
||||||
* too, as long as the bulk is allocated here). Therefore, using
|
* too, as long as the bulk is allocated here). Therefore, using
|
||||||
* floating point arithmetic is fine. */
|
* floating point arithmetic is fine. */
|
||||||
int64_t meta_size = 0;
|
int64_t meta_size = 0;
|
||||||
uint64_t nreftablee, nrefblocke, nl1e, nl2e;
|
uint64_t nreftablee, nrefblocke, nl1e, nl2e, refblock_count;
|
||||||
int64_t aligned_total_size = align_offset(total_size, cluster_size);
|
int64_t aligned_total_size = align_offset(total_size, cluster_size);
|
||||||
int refblock_bits, refblock_size;
|
int refblock_bits, refblock_size;
|
||||||
/* refcount entry size in bytes */
|
/* refcount entry size in bytes */
|
||||||
|
@ -2182,11 +2182,12 @@ static int qcow2_create2(const char *filename, int64_t total_size,
|
||||||
nrefblocke = (aligned_total_size + meta_size + cluster_size)
|
nrefblocke = (aligned_total_size + meta_size + cluster_size)
|
||||||
/ (cluster_size - rces - rces * sizeof(uint64_t)
|
/ (cluster_size - rces - rces * sizeof(uint64_t)
|
||||||
/ cluster_size);
|
/ cluster_size);
|
||||||
meta_size += DIV_ROUND_UP(nrefblocke, refblock_size) * cluster_size;
|
refblock_count = DIV_ROUND_UP(nrefblocke, refblock_size);
|
||||||
|
meta_size += refblock_count * cluster_size;
|
||||||
|
|
||||||
/* total size of refcount tables */
|
/* total size of refcount tables */
|
||||||
nreftablee = nrefblocke / refblock_size;
|
nreftablee = align_offset(refblock_count,
|
||||||
nreftablee = align_offset(nreftablee, cluster_size / sizeof(uint64_t));
|
cluster_size / sizeof(uint64_t));
|
||||||
meta_size += nreftablee * sizeof(uint64_t);
|
meta_size += nreftablee * sizeof(uint64_t);
|
||||||
|
|
||||||
qemu_opt_set_number(opts, BLOCK_OPT_SIZE,
|
qemu_opt_set_number(opts, BLOCK_OPT_SIZE,
|
||||||
|
|
Loading…
Reference in New Issue