[libvirt] [PATCH] qemuStateInitialize: Create qemu log directory
Michal Privoznik
mprivozn at redhat.com
Tue Jan 7 13:21:50 UTC 2014
On 02.01.2014 13:28, Wangyufei (James) wrote:
>>From 51782a44eecf5801e5100920e5965d8dfc46e4cc Mon Sep 17 00:00:00 2001
> From: Zhou Yimin <zhouyimin at huawei.com>
> Date: Thu, 2 Jan 2014 16:32:46 +0800
> Subject: [PATCH] qemuStateInitialize: Create qemu log directory
>
> When an error occurred in qemuProcessStart before qemu log directory created,
> it will fail to create qemu log file in qemuProcessStop during
> qemuProcessStart's cleanup phase. So when I start a VM whose PCI device not
> exist, the last error will be overwrited as "failed to create logfile XXX:
> No such file or directory" not the real reason "Device XXX not found:could not
> access XXX: No such file or directory".
> I fix it as following.
>
> Signed-off-by: Zhou Yimin <zhouyimin at huawei.com>
> Reviewed-by: Wang Yufei <james.wangyufei at huawei.com>
> ---
> src/qemu/qemu_driver.c | 5 +++++
> src/qemu/qemu_process.c | 14 --------------
> 2 files changed, 5 insertions(+), 14 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 45d11cd..ca3208e 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -615,6 +615,11 @@ qemuStateInitialize(bool privileged,
> goto error;
> VIR_FREE(driverConf);
>
> + if (virFileMakePath(cfg->logDir) < 0) {
> + VIR_ERROR(_("Failed to create log dir '%s': %s"),
> + cfg->logDir, virStrerror(errno, ebuf, sizeof(ebuf)));
> + goto error;
> + }
> if (virFileMakePath(cfg->stateDir) < 0) {
> VIR_ERROR(_("Failed to create state dir '%s': %s"),
> cfg->stateDir, virStrerror(errno, ebuf, sizeof(ebuf)));
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index d0fde54..0382c06 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -3737,13 +3737,6 @@ int qemuProcessStart(virConnectPtr conn,
> }
> }
>
> - if (virFileMakePath(cfg->logDir) < 0) {
> - virReportSystemError(errno,
> - _("cannot create log directory %s"),
> - cfg->logDir);
> - goto cleanup;
> - }
> -
> VIR_DEBUG("Creating domain log file");
> if ((logfile = qemuDomainCreateLog(driver, vm, false)) < 0)
> goto cleanup;
> @@ -4503,13 +4496,6 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
> driver->inhibitCallback(true, driver->inhibitOpaque);
> active = true;
>
> - if (virFileMakePath(cfg->logDir) < 0) {
> - virReportSystemError(errno,
> - _("cannot create log directory %s"),
> - cfg->logDir);
> - goto error;
> - }
> -
> VIR_FREE(priv->pidfile);
> if (VIR_STRDUP(priv->pidfile, pidfile) < 0)
> goto error;
>
I think we need a different approach here. The error is overwritten in
qemuProcessStop(). And I think that's the actual place, that needs to be
fixed:
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index d0fde54..9331744 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4224,6 +4224,10 @@ void qemuProcessStop(virQEMUDriverPtr driver,
return;
}
+ /* This method is routinely used in clean up paths. Disable error
+ * reporting so we don't squash a legit error. */
+ orig_err = virSaveLastError();
+
/*
* We may unlock the vm in qemuProcessKill(), and another thread
* can lock the vm, and then call qemuProcessStop(). So we should
@@ -4256,10 +4260,6 @@ void qemuProcessStop(virQEMUDriverPtr driver,
virStrerror(errno, ebuf, sizeof(ebuf)));
}
- /* This method is routinely used in clean up paths. Disable error
- * reporting so we don't squash a legit error. */
- orig_err = virSaveLastError();
-
virDomainConfVMNWFilterTeardown(vm);
if (cfg->macFilter) {
Michal
More information about the libvir-list
mailing list