basePath = qemuMonitorDiskNameLookup(priv->mon, device, disk->src,
baseSource);
if (!baseSource || basePath)
- ret = qemuMonitorBlockStream(priv->mon, device, basePath, backingPath,
- speed);
+ ret = qemuMonitorBlockStream(priv->mon, device, NULL, false, basePath,
+ NULL, backingPath, speed);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
int
qemuMonitorBlockStream(qemuMonitorPtr mon,
const char *device,
+ const char *jobname,
+ bool persistjob,
const char *base,
+ const char *baseNode,
const char *backingName,
unsigned long long bandwidth)
{
- VIR_DEBUG("device=%s, base=%s, backingName=%s, bandwidth=%lluB",
- device, NULLSTR(base), NULLSTR(backingName), bandwidth);
+ VIR_DEBUG("device=%s, jobname=%s, persistjob=%d, base=%s, baseNode=%s, "
+ "backingName=%s, bandwidth=%lluB",
+ device, NULLSTR(jobname), persistjob, NULLSTR(base),
+ NULLSTR(baseNode), NULLSTR(backingName), bandwidth);
QEMU_CHECK_MONITOR(mon);
- return qemuMonitorJSONBlockStream(mon, device, base, backingName, bandwidth);
+ if (base && baseNode) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("'base' and 'baseNode' can't be used together"));
+ return -1;
+ }
+
+ return qemuMonitorJSONBlockStream(mon, device, jobname, persistjob, base,
+ baseNode, backingName, bandwidth);
}
int qemuMonitorBlockStream(qemuMonitorPtr mon,
const char *device,
+ const char *jobname,
+ bool persistjob,
const char *base,
+ const char *baseNode,
const char *backingName,
unsigned long long bandwidth)
ATTRIBUTE_NONNULL(2);
int
qemuMonitorJSONBlockStream(qemuMonitorPtr mon,
const char *device,
+ const char *jobname,
+ bool persistjob,
const char *base,
+ const char *baseNode,
const char *backingName,
unsigned long long speed)
{
int ret = -1;
virJSONValuePtr cmd = NULL;
virJSONValuePtr reply = NULL;
+ virTristateBool autofinalize = VIR_TRISTATE_BOOL_ABSENT;
+ virTristateBool autodismiss = VIR_TRISTATE_BOOL_ABSENT;
+
+ if (persistjob) {
+ autofinalize = VIR_TRISTATE_BOOL_YES;
+ autodismiss = VIR_TRISTATE_BOOL_NO;
+ }
if (!(cmd = qemuMonitorJSONMakeCommand("block-stream",
"s:device", device,
+ "S:job-id", jobname,
"Y:speed", speed,
"S:base", base,
+ "S:base-node", baseNode,
"S:backing-file", backingName,
+ "T:auto-finalize", autofinalize,
+ "T:auto-dismiss", autodismiss,
NULL)))
return -1;
int qemuMonitorJSONBlockStream(qemuMonitorPtr mon,
const char *device,
+ const char *jobname,
+ bool persistjob,
const char *base,
+ const char *baseNode,
const char *backingName,
unsigned long long speed)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
GEN_TEST_FUNC(qemuMonitorJSONAddDevice, "some_dummy_devicestr")
GEN_TEST_FUNC(qemuMonitorJSONDriveMirror, "vdb", "/foo/bar", "formatstr", 1024, 1234, 31234, true, true)
GEN_TEST_FUNC(qemuMonitorJSONBlockdevMirror, "jobname", "vdb", "targetnode", 1024, 1234, 31234, true)
-GEN_TEST_FUNC(qemuMonitorJSONBlockStream, "vdb", "/foo/bar1", "backingfilename", 1024)
+GEN_TEST_FUNC(qemuMonitorJSONBlockStream, "vdb", "jobname", true, "/foo/bar1", "backingnode", "backingfilename", 1024)
GEN_TEST_FUNC(qemuMonitorJSONBlockCommit, "vdb", "/foo/bar1", "/foo/bar2", "backingfilename", 1024)
GEN_TEST_FUNC(qemuMonitorJSONDrivePivot, "vdb")
GEN_TEST_FUNC(qemuMonitorJSONScreendump, "devicename", 1, "/foo/bar")