To allow changing the name that is recorded in the overlay of the TOP
image used in a block commit operation, we need to specify the backing
name to qemu. This is done via the "backing-file" attribute to the
block-commit command.
---
src/qemu/qemu_capabilities.c | 2 +-
src/qemu/qemu_driver.c | 1 +
src/qemu/qemu_monitor.c | 8 +++++---
src/qemu/qemu_monitor.h | 1 +
src/qemu/qemu_monitor_json.c | 2 ++
src/qemu/qemu_monitor_json.h | 1 +
tests/qemumonitorjsontest.c | 6 +++---
7 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index df3f529..2b7cfad 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2182,7 +2182,7 @@ virQEMUCapsProbeQMPCommands(virQEMUCapsPtr qemuCaps,
/* Probe for active commit of qemu 2.1 (for now, we are choosing
* to ignore the fact that qemu 2.0 can also do active commit) */
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCK_COMMIT) &&
- qemuMonitorBlockCommit(mon, "bogus", NULL, NULL, 0) == -2)
+ qemuMonitorBlockCommit(mon, "bogus", NULL, NULL, NULL, 0) == -2)
virQEMUCapsSet(qemuCaps, QEMU_CAPS_ACTIVE_COMMIT);
return 0;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 38c5ecb..41604a1 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -15639,6 +15639,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
ret = qemuMonitorBlockCommit(priv->mon, device,
top && !topIndex ? top : topSource->path,
base && !baseIndex ? base :
baseSource->path,
+ NULL,
bandwidth);
qemuDomainObjExitMonitor(driver, vm);
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 013a6ad..66fa39a 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3234,13 +3234,14 @@ qemuMonitorTransaction(qemuMonitorPtr mon, virJSONValuePtr
actions)
int
qemuMonitorBlockCommit(qemuMonitorPtr mon, const char *device,
const char *top, const char *base,
+ const char *backingName,
unsigned long bandwidth)
{
int ret = -1;
unsigned long long speed;
- VIR_DEBUG("mon=%p, device=%s, top=%s, base=%s, bandwidth=%ld",
- mon, device, NULLSTR(top), NULLSTR(base), bandwidth);
+ VIR_DEBUG("mon=%p, device=%s, top=%s, base=%s, backingName=%s,
bandwidth=%lu",
+ mon, device, NULLSTR(top), NULLSTR(base), NULLSTR(backingName),
bandwidth);
/* Convert bandwidth MiB to bytes - unfortunately the JSON QMP protocol is
* limited to LLONG_MAX also for unsigned values */
@@ -3254,7 +3255,8 @@ qemuMonitorBlockCommit(qemuMonitorPtr mon, const char *device,
speed <<= 20;
if (mon->json)
- ret = qemuMonitorJSONBlockCommit(mon, device, top, base, speed);
+ ret = qemuMonitorJSONBlockCommit(mon, device, top, base,
+ backingName, speed);
else
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("block-commit requires JSON monitor"));
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 1c7857e..96af5fd 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -662,6 +662,7 @@ int qemuMonitorBlockCommit(qemuMonitorPtr mon,
const char *device,
const char *top,
const char *base,
+ const char *backingName,
unsigned long bandwidth)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 0e4262d..3dd09b5 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -3458,6 +3458,7 @@ qemuMonitorJSONTransaction(qemuMonitorPtr mon, virJSONValuePtr
actions)
int
qemuMonitorJSONBlockCommit(qemuMonitorPtr mon, const char *device,
const char *top, const char *base,
+ const char *backingName,
unsigned long long speed)
{
int ret = -1;
@@ -3469,6 +3470,7 @@ qemuMonitorJSONBlockCommit(qemuMonitorPtr mon, const char *device,
"U:speed", speed,
"S:top", top,
"S:base", base,
+ "S:backing-file", backingName,
NULL);
if (!cmd)
return -1;
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index 89e668c..652a4b6 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -261,6 +261,7 @@ int qemuMonitorJSONBlockCommit(qemuMonitorPtr mon,
const char *device,
const char *top,
const char *base,
+ const char *backingName,
unsigned long long bandwidth)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
index faa968f..ac0b92f 100644
--- a/tests/qemumonitorjsontest.c
+++ b/tests/qemumonitorjsontest.c
@@ -1164,7 +1164,7 @@ GEN_TEST_FUNC(qemuMonitorJSONAddDevice,
"some_dummy_devicestr")
GEN_TEST_FUNC(qemuMonitorJSONSetDrivePassphrase, "vda",
"secret_passhprase")
GEN_TEST_FUNC(qemuMonitorJSONDriveMirror, "vdb", "/foo/bar", NULL,
1024,
VIR_DOMAIN_BLOCK_REBASE_SHALLOW | VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT)
-GEN_TEST_FUNC(qemuMonitorJSONBlockCommit, "vdb", "/foo/bar1",
"/foo/bar2", 1024)
+GEN_TEST_FUNC(qemuMonitorJSONBlockCommit, "vdb", "/foo/bar1",
"/foo/bar2", NULL, 1024)
GEN_TEST_FUNC(qemuMonitorJSONDrivePivot, "vdb", NULL, NULL)
GEN_TEST_FUNC(qemuMonitorJSONScreendump, "/foo/bar")
GEN_TEST_FUNC(qemuMonitorJSONOpenGraphics, "spice", "spicefd",
false)
@@ -2021,7 +2021,7 @@ testQemuMonitorJSONqemuMonitorJSONBlockCommit2(const void *data)
goto cleanup;
if (qemuMonitorBlockCommit(qemuMonitorTestGetMonitor(test),
- "bogus", NULL, NULL, 0) != -2)
+ "bogus", NULL, NULL, NULL, 0) != -2)
goto cleanup;
if (qemuMonitorTestAddItemParams(test, "block-commit", error2,
@@ -2030,7 +2030,7 @@ testQemuMonitorJSONqemuMonitorJSONBlockCommit2(const void *data)
goto cleanup;
if (qemuMonitorBlockCommit(qemuMonitorTestGetMonitor(test),
- "bogus", NULL, NULL, 0) != -3)
+ "bogus", NULL, NULL, NULL, 0) != -3)
goto cleanup;
ret = 0;
--
1.9.3