[libvirt] [PATCH] qemu: Adjust size for qcow2/qed if not on sector boundary

Ján Tomko jtomko at redhat.com
Thu May 8 07:15:06 UTC 2014


On 05/07/2014 09:05 PM, John Ferlan wrote:
>>>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>>>> index 4bb4819..3e407d7 100644
>>>> --- a/src/qemu/qemu_driver.c
>>>> +++ b/src/qemu/qemu_driver.c
>>>> @@ -9421,6 +9421,7 @@ qemuDomainBlockResize(virDomainPtr dom,
>>>>      virDomainObjPtr vm;
>>>>      qemuDomainObjPrivatePtr priv;
>>>>      int ret = -1, idx;
>>>> +    unsigned long long size_up;
>>>>      char *device = NULL;
>>>>      virDomainDiskDefPtr disk = NULL;
>>>>  
>>>> @@ -9467,6 +9474,21 @@ 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
>>>> +     */
>>>> +    if (size != size_up &&
>>>> +        (disk->src.format == VIR_STORAGE_FILE_QCOW2 ||
>>>> +         disk->src.format == VIR_STORAGE_FILE_QED)) {
>>>> +        if (size_up > ULLONG_MAX) {
>>
>> This is always false.
>>
> 
> An OVERLy cautious check - I cannot remember what I was thinking about a
> month ago... I think this was the check can VIR_ROUND_UP provide an
> incorrect value. I can send a follow-up patch to remove those lines if
> that's desired.
> 

VIR_ROUND_UP can still overflow if the size was specified in bytes and is
larger than ULLONG_MAX-511. This is unlikely to happen in the real world, but
it would be nice to check for it.

>>>> +            virReportError(VIR_ERR_OVERFLOW,
>>>> +                           _("size must be less than %llu KiB"),
>>>> +                           ULLONG_MAX / 1024);
>>>> +            goto endjob;
>>>> +        }
>>>> +        size = size_up;
>>
>> Just a nitpick: rounding it up unconditionally here would get rid of the
>> temporary variable and have no effect on values specified without the BYTES flag.
>>
> 
> Only qcow2 and qed have this issue regarding needing to be on a 512 byte
> boundary. Since this is a generic routine I was limiting the rounding to
> the two types from the bz rather than taking a chance that some generic
> round up would cause some other issue.  Or am I misinterpreting your
> comment?

I meant unconditional on whether the size was specified in bytes or not,
something like:
if (qcow2 or qed) {
   size = VIR_ROUND_UP(size, 512);
}

Jan

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140508/3d7aa3f9/attachment-0001.sig>


More information about the libvir-list mailing list