[libvirt] [PATCH] Fix handling of security driver restore failures in QEMU domain save
Daniel Veillard
veillard at redhat.com
Fri Apr 23 12:15:47 UTC 2010
On Fri, Apr 23, 2010 at 11:49:38AM +0100, Daniel P. Berrange wrote:
> In cases where the security driver failed to restore a label after a
> guest has saved, we mistakenly jumped to the error cleanup paths.
> This is not good, because the operation has in fact completed and
> cannot be rolled back completely. Label restore is non-critical, so
> just log the problem instead. Also add a missing restore call in
> the error cleanup path
>
> * src/qemu/qemu_driver.c: Fix handling of security driver
> restore failures in QEMU domain save
> ---
> src/qemu/qemu_driver.c | 48 +++++++++++++++++++++++++-----------------------
> 1 files changed, 25 insertions(+), 23 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index faecfb7..862c030 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -5052,16 +5052,13 @@ static int qemudDomainSaveFlag(virDomainPtr dom, const char *path,
> driver->securityDriver &&
> driver->securityDriver->domainRestoreSavedStateLabel &&
> driver->securityDriver->domainRestoreSavedStateLabel(vm, path) == -1)
> - goto endjob;
> + VIR_WARN("failed to restore save state label on %s", path);
>
> if (cgroup != NULL) {
> rc = virCgroupDenyDevicePath(cgroup, path);
> - if (rc != 0) {
> - virReportSystemError(-rc,
> - _("Unable to deny device %s for %s"),
> - path, vm->def->name);
> - goto endjob;
> - }
> + if (rc != 0)
> + VIR_WARN("Unable to deny device %s for %s %d",
> + path, vm->def->name, rc);
> }
>
> ret = 0;
> @@ -5080,24 +5077,29 @@ static int qemudDomainSaveFlag(virDomainPtr dom, const char *path,
>
> endjob:
> if (vm) {
> - if (ret != 0 && header.was_running && priv->mon) {
> - qemuDomainObjEnterMonitorWithDriver(driver, vm);
> - rc = qemuMonitorStartCPUs(priv->mon, dom->conn);
> - qemuDomainObjExitMonitorWithDriver(driver, vm);
> - if (rc < 0)
> - VIR_WARN0("Unable to resume guest CPUs after save failure");
> - else
> - vm->state = VIR_DOMAIN_RUNNING;
> - }
> + if (ret != 0) {
> + if (header.was_running && priv->mon) {
> + qemuDomainObjEnterMonitorWithDriver(driver, vm);
> + rc = qemuMonitorStartCPUs(priv->mon, dom->conn);
> + qemuDomainObjExitMonitorWithDriver(driver, vm);
> + if (rc < 0)
> + VIR_WARN0("Unable to resume guest CPUs after save failure");
> + else
> + vm->state = VIR_DOMAIN_RUNNING;
> + }
>
> - if (ret != 0 && cgroup != NULL) {
> - rc = virCgroupDenyDevicePath(cgroup, path);
> - if (rc != 0) {
> - virReportSystemError(-rc,
> - _("Unable to deny device %s for %s"),
> - path, vm->def->name);
> - goto endjob;
> + if (cgroup != NULL) {
> + rc = virCgroupDenyDevicePath(cgroup, path);
> + if (rc != 0)
> + VIR_WARN("Unable to deny device %s for %s: %d",
> + path, vm->def->name, rc);
> }
> +
> + if ((!bypassSecurityDriver) &&
> + driver->securityDriver &&
> + driver->securityDriver->domainRestoreSavedStateLabel &&
> + driver->securityDriver->domainRestoreSavedStateLabel(vm, path) == -1)
> + VIR_WARN("failed to restore save state label on %s", path);
> }
>
> if (qemuDomainObjEndJob(vm) == 0)
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list