On 02/22/2018 04:50 AM, Alberto Garcia wrote:
On Thu 22 Feb 2018 12:39:53 AM CET, Eric Blake wrote:
+ assert(!!s->cluster_data == !!s->cluster_cache);
+ assert(csize < 2 * s->cluster_size + 512);
if (!s->cluster_data) {
- /* one more sector for decompressed data alignment */
- s->cluster_data = qemu_try_blockalign(bs->file->bs,
- QCOW_MAX_CRYPT_CLUSTERS * s->cluster_size + 512);
+ s->cluster_data = g_try_malloc(2 * s->cluster_size + 512);
if (!s->cluster_data) {
return -ENOMEM;
}
Why the "+ 512" ?
I was thinking "number of sectors is up to two clusters, and we add one,
PLUS we must read from the initial sector containing the offset". But I
was obviously not careful enough - the maximum value (all 1s) is 512
bytes short of 2 full clusters, and we add at most 511 more bytes for
the initial sector containing the offset (our +1 covers the leading
sector). So you are right, I can tighten this down for a slightly
smaller allocation (and a nice power-of-2 allocation may be slightly
more efficient as well). v3 coming up.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org