mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-25 23:25:24 +00:00
qemu: Adjust size for qcow2/qed if not on sector boundary
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@redhat.com>
This commit is contained in:
parent
f3be5f0c50
commit
e3d66229a1
@ -9413,6 +9413,7 @@ qemuDomainBlockResize(virDomainPtr dom,
|
|||||||
virDomainObjPtr vm;
|
virDomainObjPtr vm;
|
||||||
qemuDomainObjPrivatePtr priv;
|
qemuDomainObjPrivatePtr priv;
|
||||||
int ret = -1, idx;
|
int ret = -1, idx;
|
||||||
|
unsigned long long size_up;
|
||||||
char *device = NULL;
|
char *device = NULL;
|
||||||
virDomainDiskDefPtr disk = NULL;
|
virDomainDiskDefPtr disk = NULL;
|
||||||
|
|
||||||
@ -9433,6 +9434,12 @@ qemuDomainBlockResize(virDomainPtr dom,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
size *= 1024;
|
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)))
|
if (!(vm = qemuDomObjFromDomain(dom)))
|
||||||
@ -9459,6 +9466,21 @@ qemuDomainBlockResize(virDomainPtr dom,
|
|||||||
}
|
}
|
||||||
disk = vm->def->disks[idx];
|
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) {
|
||||||
|
virReportError(VIR_ERR_OVERFLOW,
|
||||||
|
_("size must be less than %llu KiB"),
|
||||||
|
ULLONG_MAX / 1024);
|
||||||
|
goto endjob;
|
||||||
|
}
|
||||||
|
size = size_up;
|
||||||
|
}
|
||||||
|
|
||||||
if (virAsprintf(&device, "%s%s", QEMU_DRIVE_HOST_PREFIX,
|
if (virAsprintf(&device, "%s%s", QEMU_DRIVE_HOST_PREFIX,
|
||||||
disk->info.alias) < 0)
|
disk->info.alias) < 0)
|
||||||
goto endjob;
|
goto endjob;
|
||||||
|
Loading…
Reference in New Issue
Block a user