const char *path,
virStorageSourcePtr mirror,
unsigned long long bandwidth,
+ unsigned int granularity,
+ unsigned long long buf_size,
unsigned int flags)
{
virQEMUDriverPtr driver = conn->privateData;
/* Actually start the mirroring */
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorDriveMirror(priv->mon, device, mirror->path, format,
- bandwidth, flags);
+ bandwidth, granularity, buf_size, flags);
virDomainAuditDisk(vm, NULL, mirror, "mirror", ret >= 0);
qemuDomainObjExitMonitor(driver, vm);
if (ret < 0) {
flags &= (VIR_DOMAIN_BLOCK_REBASE_SHALLOW |
VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT);
ret = qemuDomainBlockCopyCommon(vm, dom->conn, path, dest,
- bandwidth, flags);
+ bandwidth, 0, 0, flags);
vm = NULL;
dest = NULL;
buf_size = param->value.ul;
}
}
- if (granularity) {
- virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
- _("granularity tuning not supported yet"));
- goto cleanup;
- }
- if (buf_size) {
- virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
- _("buffer size tuning not supported yet"));
- goto cleanup;
- }
if (!(dest = virDomainDiskDefSourceParse(destxml, vm->def, driver->xmlopt,
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
ret = qemuDomainBlockCopyCommon(vm, dom->conn, disk, dest,
- bandwidth, flags);
+ bandwidth, granularity, buf_size, flags);
vm = NULL;
cleanup:
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
goto error;
mon_ret = qemuMonitorDriveMirror(priv->mon, diskAlias, nbd_dest,
- NULL, speed, mirror_flags);
+ NULL, speed, 0, 0, mirror_flags);
qemuDomainObjExitMonitor(driver, vm);
if (mon_ret < 0)
qemuMonitorDriveMirror(qemuMonitorPtr mon,
const char *device, const char *file,
const char *format, unsigned long long bandwidth,
+ unsigned int granularity, unsigned long long buf_size,
unsigned int flags)
{
int ret = -1;
VIR_DEBUG("mon=%p, device=%s, file=%s, format=%s, bandwidth=%lld, "
- "flags=%x",
- mon, device, file, NULLSTR(format), bandwidth, flags);
+ "granularity=%#x, buf_size=%lld, flags=%x",
+ mon, device, file, NULLSTR(format), bandwidth, granularity,
+ buf_size, flags);
if (mon->json)
ret = qemuMonitorJSONDriveMirror(mon, device, file, format, bandwidth,
- flags);
+ granularity, buf_size, flags);
else
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("drive-mirror requires JSON monitor"));
const char *file,
const char *format,
unsigned long long bandwidth,
+ unsigned int granularity,
+ unsigned long long buf_size,
unsigned int flags)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
int qemuMonitorDrivePivot(qemuMonitorPtr mon,
qemuMonitorJSONDriveMirror(qemuMonitorPtr mon,
const char *device, const char *file,
const char *format, unsigned long long speed,
+ unsigned int granularity,
+ unsigned long long buf_size,
unsigned int flags)
{
int ret = -1;
"s:device", device,
"s:target", file,
"Y:speed", speed,
+ "z:granularity", granularity,
+ "P:buf-size", buf_size,
"s:sync", shallow ? "top" : "full",
"s:mode", reuse ? "existing" : "absolute-paths",
"S:format", format,
const char *file,
const char *format,
unsigned long long speed,
+ unsigned int granularity,
+ unsigned long long buf_size,
unsigned int flags)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
int qemuMonitorJSONDrivePivot(qemuMonitorPtr mon,
GEN_TEST_FUNC(qemuMonitorJSONDelDevice, "ide0")
GEN_TEST_FUNC(qemuMonitorJSONAddDevice, "some_dummy_devicestr")
GEN_TEST_FUNC(qemuMonitorJSONSetDrivePassphrase, "vda", "secret_passhprase")
-GEN_TEST_FUNC(qemuMonitorJSONDriveMirror, "vdb", "/foo/bar", NULL, 1024,
+GEN_TEST_FUNC(qemuMonitorJSONDriveMirror, "vdb", "/foo/bar", NULL, 1024, 0, 0,
VIR_DOMAIN_BLOCK_REBASE_SHALLOW | VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT)
GEN_TEST_FUNC(qemuMonitorJSONBlockCommit, "vdb", "/foo/bar1", "/foo/bar2", NULL, 1024)
GEN_TEST_FUNC(qemuMonitorJSONDrivePivot, "vdb", NULL, NULL)