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

Ján Tomko jtomko at redhat.com
Wed May 7 14:34:35 UTC 2014


On 05/07/2014 01:58 PM, John Ferlan wrote:
> 
> 
> On 04/08/2014 12:26 PM, John Ferlan wrote:
>> https://bugzilla.redhat.com/show_bug.cgi?id=1002813
>>
>> If qemuDomainBlockResize() is passed a size not on a KiB boundary - that
>> is passed a size based in bytes (VIR_DOMAIN_BLOCK_RESIZE_BYTES), then
>> depending on the source format (qcow2 or qed), the value passed must
>> be on a sector (or 512 byte) boundary. Since other libvirt code quietly
>> adjusts the capacity values, then do so here as well - of course ensuring
>> that adjustment still fits.
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>>  src/qemu/qemu_driver.c | 22 ++++++++++++++++++++++
>>  1 file changed, 22 insertions(+)
>>
> 
> Although discussion was taken off this list - the changes here were
> ACK'd and pushed today...

I think ACKs should be on-list.

> 
> Essentially the following API's will round up the value as well:
> 
>     virStorageBackendCreateQcowCreate()
>     virStorageBackendLogicalCreateVol()
>     virStorageBackendCreateQemuImgCmd()
> 
> For libvirt created volumes, virStorageBackendCreateQemuImgCmd() or
> virStorageBackendCreateQcowCreate() is called - both will take the
> capacity value and VIR_DIV_UP using 1024. For the vol-resize path (e.g.
> non running vm case), virStorageBackendFilesystemResizeQemuImg() will
> use ROUND_UP on 512 byte value because it knows (and comments) that
> qemu-img will fail to resize on non sector boundaries.
> 
> Additionally, it was noted that using "K" and "KiB" would produce 1024
> based results, it's libvirt's allowance of "KB" for sizes that results
> in the nuance. Being strict KB shouldn't be used for storage, but rather
> than penalize for not knowing the difference between KiB and KB the code
> just assumes KiB should have been used.
> 
> John
> 
>> 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.

>> +            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.

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/20140507/e3b967b9/attachment-0001.sig>


More information about the libvir-list mailing list