mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 17:57:43 +03:00
qemu: Support mountpoints option of guest-fsfreeze-freeze
With this patch, virDomainFSFreeze will pass the mountpoints argument to qemu guest agent. For example, virDomainFSFreeze(dom, {"/mnt/vol1", "/mnt/vol2"}, 2, 0) will issue qemu guest agent command: {"execute":"guest-fsfreeze-freeze", "arguments":{"mountpoints":["/mnt/vol1","/mnt/vol2"]}} Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com> Acked-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
parent
061c6347e4
commit
2bb520c802
@ -1235,6 +1235,32 @@ qemuAgentMakeCommand(const char *cmdname,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static virJSONValuePtr
|
||||||
|
qemuAgentMakeStringsArray(const char **strings, unsigned int len)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
virJSONValuePtr ret = virJSONValueNewArray(), str;
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
str = virJSONValueNewString(strings[i]);
|
||||||
|
if (!str)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virJSONValueArrayAppend(ret, str) < 0) {
|
||||||
|
virJSONValueFree(str);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
error:
|
||||||
|
virJSONValueFree(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void qemuAgentNotifyEvent(qemuAgentPtr mon,
|
void qemuAgentNotifyEvent(qemuAgentPtr mon,
|
||||||
qemuAgentEvent event)
|
qemuAgentEvent event)
|
||||||
{
|
{
|
||||||
@ -1287,21 +1313,34 @@ int qemuAgentShutdown(qemuAgentPtr mon,
|
|||||||
/*
|
/*
|
||||||
* qemuAgentFSFreeze:
|
* qemuAgentFSFreeze:
|
||||||
* @mon: Agent
|
* @mon: Agent
|
||||||
|
* @mountpoints: Array of mountpoint paths to be frozen, or NULL for all
|
||||||
|
* @nmountpoints: Number of mountpoints to be frozen, or 0 for all
|
||||||
*
|
*
|
||||||
* Issue guest-fsfreeze-freeze command to guest agent,
|
* Issue guest-fsfreeze-freeze command to guest agent,
|
||||||
* which freezes all mounted file systems and returns
|
* which freezes file systems mounted on specified mountpoints
|
||||||
|
* (or all file systems when @mountpoints is NULL), and returns
|
||||||
* number of frozen file systems on success.
|
* number of frozen file systems on success.
|
||||||
*
|
*
|
||||||
* Returns: number of file system frozen on success,
|
* Returns: number of file system frozen on success,
|
||||||
* -1 on error.
|
* -1 on error.
|
||||||
*/
|
*/
|
||||||
int qemuAgentFSFreeze(qemuAgentPtr mon)
|
int qemuAgentFSFreeze(qemuAgentPtr mon, const char **mountpoints,
|
||||||
|
unsigned int nmountpoints)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
virJSONValuePtr cmd;
|
virJSONValuePtr cmd, arg;
|
||||||
virJSONValuePtr reply = NULL;
|
virJSONValuePtr reply = NULL;
|
||||||
|
|
||||||
cmd = qemuAgentMakeCommand("guest-fsfreeze-freeze", NULL);
|
if (mountpoints && nmountpoints) {
|
||||||
|
arg = qemuAgentMakeStringsArray(mountpoints, nmountpoints);
|
||||||
|
if (!arg)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
cmd = qemuAgentMakeCommand("guest-fsfreeze-freeze",
|
||||||
|
"a:mountpoints", arg, NULL);
|
||||||
|
} else {
|
||||||
|
cmd = qemuAgentMakeCommand("guest-fsfreeze-freeze", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if (!cmd)
|
if (!cmd)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -70,7 +70,8 @@ typedef enum {
|
|||||||
int qemuAgentShutdown(qemuAgentPtr mon,
|
int qemuAgentShutdown(qemuAgentPtr mon,
|
||||||
qemuAgentShutdownMode mode);
|
qemuAgentShutdownMode mode);
|
||||||
|
|
||||||
int qemuAgentFSFreeze(qemuAgentPtr mon);
|
int qemuAgentFSFreeze(qemuAgentPtr mon,
|
||||||
|
const char **mountpoints, unsigned int nmountpoints);
|
||||||
int qemuAgentFSThaw(qemuAgentPtr mon);
|
int qemuAgentFSThaw(qemuAgentPtr mon);
|
||||||
|
|
||||||
int qemuAgentSuspend(qemuAgentPtr mon,
|
int qemuAgentSuspend(qemuAgentPtr mon,
|
||||||
|
@ -12087,7 +12087,9 @@ qemuDomainPrepareDiskChainElement(virQEMUDriverPtr driver,
|
|||||||
* returned, FSThaw should be called revert the quiesced status. */
|
* returned, FSThaw should be called revert the quiesced status. */
|
||||||
static int
|
static int
|
||||||
qemuDomainSnapshotFSFreeze(virQEMUDriverPtr driver,
|
qemuDomainSnapshotFSFreeze(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm)
|
virDomainObjPtr vm,
|
||||||
|
const char **mountpoints,
|
||||||
|
unsigned int nmountpoints)
|
||||||
{
|
{
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
virQEMUDriverConfigPtr cfg;
|
virQEMUDriverConfigPtr cfg;
|
||||||
@ -12113,7 +12115,7 @@ qemuDomainSnapshotFSFreeze(virQEMUDriverPtr driver,
|
|||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
|
|
||||||
qemuDomainObjEnterAgent(vm);
|
qemuDomainObjEnterAgent(vm);
|
||||||
frozen = qemuAgentFSFreeze(priv->agent);
|
frozen = qemuAgentFSFreeze(priv->agent, mountpoints, nmountpoints);
|
||||||
qemuDomainObjExitAgent(vm);
|
qemuDomainObjExitAgent(vm);
|
||||||
return frozen < 0 ? -2 : frozen;
|
return frozen < 0 ? -2 : frozen;
|
||||||
}
|
}
|
||||||
@ -13160,7 +13162,7 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
|
|||||||
* The command will fail if the guest is paused or the guest agent
|
* The command will fail if the guest is paused or the guest agent
|
||||||
* is not running, or is already quiesced. */
|
* is not running, or is already quiesced. */
|
||||||
if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE) {
|
if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE) {
|
||||||
int freeze = qemuDomainSnapshotFSFreeze(driver, vm);
|
int freeze = qemuDomainSnapshotFSFreeze(driver, vm, NULL, 0);
|
||||||
if (freeze < 0) {
|
if (freeze < 0) {
|
||||||
/* the helper reported the error */
|
/* the helper reported the error */
|
||||||
if (freeze == -2)
|
if (freeze == -2)
|
||||||
@ -16561,12 +16563,6 @@ qemuDomainFSFreeze(virDomainPtr dom,
|
|||||||
|
|
||||||
virCheckFlags(0, -1);
|
virCheckFlags(0, -1);
|
||||||
|
|
||||||
if (mountpoints || nmountpoints) {
|
|
||||||
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
|
|
||||||
_("specifying mountpoints is not supported"));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(vm = qemuDomObjFromDomain(dom)))
|
if (!(vm = qemuDomObjFromDomain(dom)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -16582,7 +16578,7 @@ qemuDomainFSFreeze(virDomainPtr dom,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = qemuDomainSnapshotFSFreeze(driver, vm);
|
ret = qemuDomainSnapshotFSFreeze(driver, vm, mountpoints, nmountpoints);
|
||||||
if (ret == -2) {
|
if (ret == -2) {
|
||||||
qemuDomainSnapshotFSThaw(driver, vm, false);
|
qemuDomainSnapshotFSThaw(driver, vm, false);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
@ -36,6 +36,7 @@ testQemuAgentFSFreeze(const void *data)
|
|||||||
{
|
{
|
||||||
virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
|
virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
|
||||||
qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt);
|
qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt);
|
||||||
|
const char *mountpoints[] = {"/fs1", "/fs2", "/fs3", "/fs4", "/fs5"};
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
if (!test)
|
if (!test)
|
||||||
@ -55,7 +56,8 @@ testQemuAgentFSFreeze(const void *data)
|
|||||||
"{ \"return\" : 7 }") < 0)
|
"{ \"return\" : 7 }") < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((ret = qemuAgentFSFreeze(qemuMonitorTestGetAgent(test))) < 0)
|
if ((ret = qemuAgentFSFreeze(qemuMonitorTestGetAgent(test),
|
||||||
|
mountpoints, 5)) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (ret != 5) {
|
if (ret != 5) {
|
||||||
@ -64,7 +66,7 @@ testQemuAgentFSFreeze(const void *data)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = qemuAgentFSFreeze(qemuMonitorTestGetAgent(test))) < 0)
|
if ((ret = qemuAgentFSFreeze(qemuMonitorTestGetAgent(test), NULL, 0)) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (ret != 7) {
|
if (ret != 7) {
|
||||||
@ -547,7 +549,7 @@ testQemuAgentTimeout(const void *data)
|
|||||||
NULL, NULL) < 0)
|
NULL, NULL) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (qemuAgentFSFreeze(qemuMonitorTestGetAgent(test)) != -1) {
|
if (qemuAgentFSFreeze(qemuMonitorTestGetAgent(test), NULL, 0) != -1) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
"agent command should have failed");
|
"agent command should have failed");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user