As more clients start to want to know this information, doing
a PATH stat walk and malloc for every client adds up.
* src/qemu/qemu_conf.h (qemud_driver): Add member.
* src/qemu/qemu_driver.c (qemudShutdown): Cleanup.
(qemuFindQemuImgBinary): Add an argument, and cache result.
(qemuDomainSnapshotDiscard, qemuDomainSnapshotCreateInactive)
(qemuDomainSnapshotRevertInactive, qemuDomainSnapshotCreateXML)
(qemuDomainRevertToSnapshot): Update callers.
---
src/qemu/qemu_conf.h | 1 +
src/qemu/qemu_driver.c | 42 +++++++++++++++++++++---------------------
2 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 0a60d32..5469a63 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -82,6 +82,7 @@ struct qemud_driver {
char *cacheDir;
char *saveDir;
char *snapshotDir;
+ char *qemuImgBinary;
unsigned int vncAutoUnixSocket : 1;
unsigned int vncTLS : 1;
unsigned int vncTLSx509verify : 1;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 2db0d62..2c3a5c1 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -777,6 +777,7 @@ qemudShutdown(void) {
VIR_FREE(qemu_driver->cacheDir);
VIR_FREE(qemu_driver->saveDir);
VIR_FREE(qemu_driver->snapshotDir);
+ VIR_FREE(qemu_driver->qemuImgBinary);
VIR_FREE(qemu_driver->autoDumpPath);
VIR_FREE(qemu_driver->vncTLSx509certdir);
VIR_FREE(qemu_driver->vncListen);
@@ -1583,19 +1584,19 @@ cleanup:
/* Locate an appropriate 'qemu-img' binary. */
-static char *
-qemuFindQemuImgBinary(void)
+static const char *
+qemuFindQemuImgBinary(struct qemud_driver *driver)
{
- char *ret;
-
- ret = virFindFileInPath("kvm-img");
- if (ret == NULL)
- ret = virFindFileInPath("qemu-img");
- if (ret == NULL)
- qemuReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("unable to find kvm-img or
qemu-img"));
+ if (!driver->qemuImgBinary) {
+ driver->qemuImgBinary = virFindFileInPath("kvm-img");
+ if (!driver->qemuImgBinary)
+ driver->qemuImgBinary = virFindFileInPath("qemu-img");
+ if (!driver->qemuImgBinary)
+ qemuReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("unable to find kvm-img or
qemu-img"));
+ }
- return ret;
+ return driver->qemuImgBinary;
}
static int
@@ -1670,7 +1671,7 @@ qemuDomainSnapshotDiscard(struct qemud_driver *driver,
if (!metadata_only) {
if (!virDomainObjIsActive(vm)) {
- qemuimgarg[0] = qemuFindQemuImgBinary();
+ qemuimgarg[0] = qemuFindQemuImgBinary(driver);
if (qemuimgarg[0] == NULL)
/* qemuFindQemuImgBinary set the error */
goto cleanup;
@@ -1742,7 +1743,6 @@ qemuDomainSnapshotDiscard(struct qemud_driver *driver,
cleanup:
VIR_FREE(snapFile);
- VIR_FREE(qemuimgarg[0]);
return ret;
}
@@ -8606,14 +8606,15 @@ static int qemuDomainSnapshotIsAllowed(virDomainObjPtr vm)
/* The domain is expected to be locked and inactive. */
static int
-qemuDomainSnapshotCreateInactive(virDomainObjPtr vm,
+qemuDomainSnapshotCreateInactive(struct qemud_driver *driver,
+ virDomainObjPtr vm,
virDomainSnapshotObjPtr snap)
{
const char *qemuimgarg[] = { NULL, "snapshot", "-c", NULL, NULL,
NULL };
int ret = -1;
int i;
- qemuimgarg[0] = qemuFindQemuImgBinary();
+ qemuimgarg[0] = qemuFindQemuImgBinary(driver);
if (qemuimgarg[0] == NULL) {
/* qemuFindQemuImgBinary set the error */
goto cleanup;
@@ -8646,7 +8647,6 @@ qemuDomainSnapshotCreateInactive(virDomainObjPtr vm,
ret = 0;
cleanup:
- VIR_FREE(qemuimgarg[0]);
return ret;
}
@@ -8801,7 +8801,7 @@ static virDomainSnapshotPtr qemuDomainSnapshotCreateXML(virDomainPtr
domain,
* qemu-img recognizes the snapshot name in at least one of
* the domain's disks? */
} else if (!virDomainObjIsActive(vm)) {
- if (qemuDomainSnapshotCreateInactive(vm, snap) < 0)
+ if (qemuDomainSnapshotCreateInactive(driver, vm, snap) < 0)
goto cleanup;
} else {
if (qemuDomainSnapshotCreateActive(domain->conn, driver,
@@ -9038,14 +9038,15 @@ cleanup:
/* The domain is expected to be locked and inactive. */
static int
-qemuDomainSnapshotRevertInactive(virDomainObjPtr vm,
+qemuDomainSnapshotRevertInactive(struct qemud_driver *driver,
+ virDomainObjPtr vm,
virDomainSnapshotObjPtr snap)
{
const char *qemuimgarg[] = { NULL, "snapshot", "-a", NULL, NULL,
NULL };
int ret = -1;
int i;
- qemuimgarg[0] = qemuFindQemuImgBinary();
+ qemuimgarg[0] = qemuFindQemuImgBinary(driver);
if (qemuimgarg[0] == NULL) {
/* qemuFindQemuImgBinary set the error */
goto cleanup;
@@ -9078,7 +9079,6 @@ qemuDomainSnapshotRevertInactive(virDomainObjPtr vm,
ret = 0;
cleanup:
- VIR_FREE(qemuimgarg[0]);
return ret;
}
@@ -9270,7 +9270,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr
snapshot,
detail);
}
- if (qemuDomainSnapshotRevertInactive(vm, snap) < 0) {
+ if (qemuDomainSnapshotRevertInactive(driver, vm, snap) < 0) {
if (!vm->persistent) {
if (qemuDomainObjEndJob(driver, vm) > 0)
virDomainRemoveInactive(&driver->domains, vm);
--
1.7.4.4