[libvirt] [PATCH] qemu: Adjust size for qcow2/qed if not on sector boundary (rewrite)
John Ferlan
jferlan at redhat.com
Mon May 12 14:42:53 UTC 2014
On 05/12/2014 07:11 AM, Ján Tomko wrote:
> On 05/08/2014 06:02 PM, John Ferlan wrote:
>> A post commit id 'e3d66229' review (and followup):
>>
>> http://www.redhat.com/archives/libvir-list/2014-May/msg00268.html
>>
>> noted some issues with the code, so I have adjusted the code
>> accordingly. The difference between this and the commit prior
>> to the change (commit id 'f3be5f0c') will just be the check for
>> qcow2/qed using a non 512 block aligned size will result in a
>> round up of size. If the size is within the last 512 bytes to
>> ULLONG_MAX, then just set it there rather than erroring out.
>
> This patch essentially reverts commit e3d66229.
> Reverting it explicitly using 'git revert' and basing this patch on that would
> make it smaller and maybe easier to backport to the -maint branches.
>
> If you choose to do an explicit revert, please include the bugzilla link in
> the commit message.
>
So with the revert and the changes below this essentially turns into:
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index f0e82e9..63a9e77 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -9459,6 +9459,13 @@ qemuDomainBlockResize(virDomainPtr dom,
}
disk = vm->def->disks[idx];
+ /* qcow2 and qed must be sized on 512 byte blocks/sectors,
+ * so adjust size if necessary to round up.
+ */
+ if (disk->src.format == VIR_STORAGE_FILE_QCOW2 ||
+ disk->src.format == VIR_STORAGE_FILE_QED)
+ size = VIR_ROUND_UP(size, 512);
+
if (virAsprintf(&device, "%s%s", QEMU_DRIVE_HOST_PREFIX,
disk->info.alias) < 0)
goto endjob;
The whole overflow issue for VIR_ROUND_UP and VIR_DIV_UP is something
that could/would/should be handled separately...
John
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>> src/qemu/qemu_driver.c | 28 +++++++++-------------------
>> 1 file changed, 9 insertions(+), 19 deletions(-)
>>
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 4ff8a2d..8771cae 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -9413,7 +9413,6 @@ qemuDomainBlockResize(virDomainPtr dom,
>> virDomainObjPtr vm;
>> qemuDomainObjPrivatePtr priv;
>> int ret = -1, idx;
>> - unsigned long long size_up;
>> char *device = NULL;
>> virDomainDiskDefPtr disk = NULL;
>>
>> @@ -9434,12 +9433,6 @@ qemuDomainBlockResize(virDomainPtr dom,
>> return -1;
>> }
>> size *= 1024;
>> - size_up = size;
>> - } else {
>> - /* For 'qcow2' and 'qed', qemu resize blocks expects values
>> - * on sector boundary, so round our value up to prepare
>> - */
>> - size_up = VIR_ROUND_UP(size, 512);
>> }
>>
>> if (!(vm = qemuDomObjFromDomain(dom)))
>> @@ -9466,19 +9459,16 @@ qemuDomainBlockResize(virDomainPtr dom,
>> }
>> disk = vm->def->disks[idx];
>>
>> - /* qcow2 and qed must be sized appropriately, so be sure our value
>> - * is sized appropriately and will fit
>> + /* qcow2 and qed must be sized on 512 byte blocks/sectors,
>> + * so adjust size if necessary to round up (if possible).
>> */
>> - if (size != size_up &&
>> - (disk->src.format == VIR_STORAGE_FILE_QCOW2 ||
>> - disk->src.format == VIR_STORAGE_FILE_QED)) {
>> - if (size_up > ULLONG_MAX) {
>> - virReportError(VIR_ERR_OVERFLOW,
>> - _("size must be less than %llu KiB"),
>> - ULLONG_MAX / 1024);
>> - goto endjob;
>> - }
>> - size = size_up;
>> + if ((disk->src.format == VIR_STORAGE_FILE_QCOW2 ||
>> + disk->src.format == VIR_STORAGE_FILE_QED) &&
>> + (size % 512)) {
>
> The (size % 512) condition is not necessary - VIR_ROUND_UP won't change the
> value if the number is divisible by 512 if it does not overflow.
>
>> + if ((ULLONG_MAX - size) < 512)
>> + size = ULLONG_MAX;
>
> ULLONG_MAX is not divisible by 512 thus I don't think it's any better than
> what the user entered.
>
>> + else
>> + size = VIR_ROUND_UP(size, 512);
>> }
>>
>> if (virAsprintf(&device, "%s%s", QEMU_DRIVE_HOST_PREFIX,
>>
>
> ACK with the ULLONG_MAX assignment removed - whether you do 'git revert' or not.
>
> Jan
>
More information about the libvir-list
mailing list