diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f0e82e9fbf..4ff8a2d0d7 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -9413,6 +9413,7 @@ qemuDomainBlockResize(virDomainPtr dom, virDomainObjPtr vm; qemuDomainObjPrivatePtr priv; int ret = -1, idx; + unsigned long long size_up; char *device = NULL; virDomainDiskDefPtr disk = NULL; @@ -9433,6 +9434,12 @@ 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))) @@ -9459,6 +9466,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) { + 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, disk->info.alias) < 0) goto endjob;