From: Chen Hanxiao <chenhanxiao(a)gmail.com>
We check compress prog in qemuCompressProgramAvailable,
then test it again in virExec again.
This path will pass compress prog's path to virExec,
avoiding one extra virFindFileInPath call in during
virExec.
Signed-off-by: Chen Hanxiao <chenhanxiao(a)gmail.com>
---
v2: init compressed_path as NULL in qemuCompressProgramAvailable
src/qemu/qemu_driver.c | 38 ++++++++++++++++++++++++--------------
1 file changed, 24 insertions(+), 14 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 97e2ffc..f54aa98 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3037,6 +3037,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver,
const char *path,
const char *domXML,
int compressed,
+ const char *compressed_path,
bool was_running,
unsigned int flags,
qemuDomainAsyncJob asyncJob)
@@ -3084,7 +3085,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver,
goto cleanup;
/* Perform the migration */
- if (qemuMigrationToFile(driver, vm, fd, qemuCompressProgramName(compressed),
+ if (qemuMigrationToFile(driver, vm, fd, compressed_path,
asyncJob) < 0)
goto cleanup;
@@ -3137,7 +3138,8 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver,
static int
qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
virDomainObjPtr vm, const char *path,
- int compressed, const char *xmlin, unsigned int flags)
+ int compressed, const char *compressed_path,
+ const char *xmlin, unsigned int flags)
{
char *xml = NULL;
bool was_running = false;
@@ -3209,7 +3211,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
goto endjob;
}
- ret = qemuDomainSaveMemory(driver, vm, path, xml, compressed,
+ ret = qemuDomainSaveMemory(driver, vm, path, xml, compressed, compressed_path,
was_running, flags, QEMU_ASYNC_JOB_SAVE);
if (ret < 0)
goto endjob;
@@ -3250,17 +3252,16 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
/* Returns true if a compression program is available in PATH */
static bool
-qemuCompressProgramAvailable(virQEMUSaveFormat compress)
+qemuCompressProgramAvailable(virQEMUSaveFormat compress, char **compressed_path)
{
- char *path;
+ *compressed_path = NULL;
if (compress == QEMU_SAVE_FORMAT_RAW)
return true;
- if (!(path = virFindFileInPath(qemuSaveCompressionTypeToString(compress))))
+ if (!(*compressed_path =
virFindFileInPath(qemuSaveCompressionTypeToString(compress))))
return false;
- VIR_FREE(path);
return true;
}
@@ -3270,6 +3271,7 @@ qemuDomainSaveFlags(virDomainPtr dom, const char *path, const char
*dxml,
{
virQEMUDriverPtr driver = dom->conn->privateData;
int compressed = QEMU_SAVE_FORMAT_RAW;
+ char *compressed_path = NULL;
int ret = -1;
virDomainObjPtr vm = NULL;
virQEMUDriverConfigPtr cfg = NULL;
@@ -3287,7 +3289,7 @@ qemuDomainSaveFlags(virDomainPtr dom, const char *path, const char
*dxml,
"in configuration file"));
goto cleanup;
}
- if (!qemuCompressProgramAvailable(compressed)) {
+ if (!qemuCompressProgramAvailable(compressed, &compressed_path)) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("Compression program for image format "
"in configuration file isn't available"));
@@ -3308,11 +3310,12 @@ qemuDomainSaveFlags(virDomainPtr dom, const char *path, const char
*dxml,
}
ret = qemuDomainSaveInternal(driver, dom, vm, path, compressed,
- dxml, flags);
+ compressed_path, dxml, flags);
cleanup:
virDomainObjEndAPI(&vm);
virObjectUnref(cfg);
+ VIR_FREE(compressed_path);
return ret;
}
@@ -3343,6 +3346,7 @@ qemuDomainManagedSave(virDomainPtr dom, unsigned int flags)
virQEMUDriverPtr driver = dom->conn->privateData;
virQEMUDriverConfigPtr cfg = NULL;
int compressed = QEMU_SAVE_FORMAT_RAW;
+ char *compressed_path = NULL;
virDomainObjPtr vm;
char *name = NULL;
int ret = -1;
@@ -3377,7 +3381,7 @@ qemuDomainManagedSave(virDomainPtr dom, unsigned int flags)
"in configuration file"));
goto cleanup;
}
- if (!qemuCompressProgramAvailable(compressed)) {
+ if (!qemuCompressProgramAvailable(compressed, &compressed_path)) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("Compression program for image format "
"in configuration file isn't available"));
@@ -3391,13 +3395,14 @@ qemuDomainManagedSave(virDomainPtr dom, unsigned int flags)
VIR_INFO("Saving state of domain '%s' to '%s'",
vm->def->name, name);
ret = qemuDomainSaveInternal(driver, dom, vm, name,
- compressed, NULL, flags);
+ compressed, compressed_path, NULL, flags);
if (ret == 0)
vm->hasManagedSave = true;
cleanup:
virDomainObjEndAPI(&vm);
VIR_FREE(name);
+ VIR_FREE(compressed_path);
virObjectUnref(cfg);
return ret;
@@ -3617,6 +3622,7 @@ static virQEMUSaveFormat
getCompressionType(virQEMUDriverPtr driver)
{
int ret = QEMU_SAVE_FORMAT_RAW;
+ char *compressed_path = NULL;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
/*
@@ -3634,7 +3640,7 @@ getCompressionType(virQEMUDriverPtr driver)
ret = QEMU_SAVE_FORMAT_RAW;
goto cleanup;
}
- if (!qemuCompressProgramAvailable(ret)) {
+ if (!qemuCompressProgramAvailable(ret, &compressed_path)) {
VIR_WARN("%s", _("Compression program for dump image format
"
"in configuration file isn't available, "
"using raw"));
@@ -3644,6 +3650,7 @@ getCompressionType(virQEMUDriverPtr driver)
}
cleanup:
virObjectUnref(cfg);
+ VIR_FREE(compressed_path);
return ret;
}
@@ -14308,6 +14315,7 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
bool pmsuspended = false;
virQEMUDriverConfigPtr cfg = NULL;
int compressed = QEMU_SAVE_FORMAT_RAW;
+ char *compressed_path = NULL;
/* If quiesce was requested, then issue a freeze command, and a
* counterpart thaw command when it is actually sent to agent.
@@ -14377,7 +14385,7 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
goto cleanup;
}
- if (!qemuCompressProgramAvailable(compressed)) {
+ if (!qemuCompressProgramAvailable(compressed, &compressed_path)) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("Compression program for image format "
"in configuration file isn't
available"));
@@ -14389,7 +14397,8 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
goto cleanup;
if ((ret = qemuDomainSaveMemory(driver, vm, snap->def->file,
- xml, compressed, resume, 0,
+ xml, compressed, compressed_path,
+ resume, 0,
QEMU_ASYNC_JOB_SNAPSHOT)) < 0)
goto cleanup;
@@ -14459,6 +14468,7 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
}
VIR_FREE(xml);
+ VIR_FREE(compressed_path);
virObjectUnref(cfg);
if (memory_unlink && ret < 0)
unlink(snap->def->file);
--
1.8.3.1