[libvirt] [PATCH] qemu: Preserve fakeReboot flag in domain status

Daniel Veillard veillard at redhat.com
Wed Sep 28 13:06:29 UTC 2011


On Wed, Sep 28, 2011 at 12:13:35PM +0200, Jiri Denemark wrote:
> Thus, when libvirtd is restarted, it will know if a domain is supposed
> to be killed or reset when it shuts down.
> ---
>  src/qemu/qemu_domain.c  |   21 +++++++++++++++++++++
>  src/qemu/qemu_domain.h  |    4 ++++
>  src/qemu/qemu_driver.c  |   11 +++++------
>  src/qemu/qemu_process.c |    4 ++--
>  4 files changed, 32 insertions(+), 8 deletions(-)
> 
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 4023648..320a35c 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -302,6 +302,9 @@ static int qemuDomainObjPrivateXMLFormat(virBufferPtr buf, void *data)
>          virBufferAddLit(buf, "/>\n");
>      }
>  
> +    if (priv->fakeReboot)
> +        virBufferAsprintf(buf, "  <fakereboot/>\n");
> +
>      return 0;
>  }
>  
> @@ -445,6 +448,8 @@ static int qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, void *data)
>          }
>      }
>  
> +    priv->fakeReboot = virXPathBoolean("boolean(./fakereboot)", ctxt) == 1;
> +
>      return 0;
>  
>  error:
> @@ -1566,3 +1571,19 @@ qemuDomainRemoveInactive(struct qemud_driver *driver,
>      }
>      virDomainRemoveInactive(&driver->domains, vm);
>  }
> +
> +void
> +qemuDomainSetFakeReboot(struct qemud_driver *driver,
> +                        virDomainObjPtr vm,
> +                        bool value)
> +{
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +
> +    if (priv->fakeReboot == value)
> +        return;
> +
> +    priv->fakeReboot = value;
> +
> +    if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
> +        VIR_WARN("Failed to save status on vm %s", vm->def->name);
> +}
> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index 00cfa3a..3b09419 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -273,4 +273,8 @@ int qemuDomainSnapshotDiscardAllMetadata(struct qemud_driver *driver,
>  void qemuDomainRemoveInactive(struct qemud_driver *driver,
>                                virDomainObjPtr vm);
>  
> +void qemuDomainSetFakeReboot(struct qemud_driver *driver,
> +                             virDomainObjPtr vm,
> +                             bool value);
> +
>  #endif /* __QEMU_DOMAIN_H__ */
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 0d0bea2..8cbb850 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1512,13 +1512,13 @@ static int qemuDomainShutdown(virDomainPtr dom) {
>          goto endjob;
>      }
>  
> +    qemuDomainSetFakeReboot(driver, vm, false);
> +
>      priv = vm->privateData;
>      qemuDomainObjEnterMonitor(driver, vm);
>      ret = qemuMonitorSystemPowerdown(priv->mon);
>      qemuDomainObjExitMonitor(driver, vm);
>  
> -    priv->fakeReboot = false;
> -
>  endjob:
>      if (qemuDomainObjEndJob(driver, vm) == 0)
>          vm = NULL;
> @@ -1575,7 +1575,8 @@ static int qemuDomainReboot(virDomainPtr dom, unsigned int flags) {
>          ret = qemuMonitorSystemPowerdown(priv->mon);
>          qemuDomainObjExitMonitor(driver, vm);
>  
> -        priv->fakeReboot = true;
> +        if (ret == 0)
> +            qemuDomainSetFakeReboot(driver, vm, true);
>  
>      endjob:
>          if (qemuDomainObjEndJob(driver, vm) == 0)
> @@ -1616,7 +1617,6 @@ qemuDomainDestroyFlags(virDomainPtr dom,
>      virDomainObjPtr vm;
>      int ret = -1;
>      virDomainEventPtr event = NULL;
> -    qemuDomainObjPrivatePtr priv;
>  
>      virCheckFlags(0, -1);
>  
> @@ -1630,8 +1630,7 @@ qemuDomainDestroyFlags(virDomainPtr dom,
>          goto cleanup;
>      }
>  
> -    priv = vm->privateData;
> -    priv->fakeReboot = false;
> +    qemuDomainSetFakeReboot(driver, vm, false);
>  
>      /* Although qemuProcessStop does this already, there may
>       * be an outstanding job active. We want to make sure we
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 106a47c..4c6b4a4 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -442,7 +442,7 @@ qemuProcessShutdownOrReboot(virDomainObjPtr vm)
>  
>      priv->gotShutdown = true;
>      if (priv->fakeReboot) {
> -        priv->fakeReboot = false;
> +        qemuDomainSetFakeReboot(qemu_driver, vm, false);
>          virDomainObjRef(vm);
>          virThread th;
>          if (virThreadCreate(&th,
> @@ -2846,7 +2846,7 @@ int qemuProcessStart(virConnectPtr conn,
>          goto cleanup;
>  
>      vm->def->id = driver->nextvmid++;
> -    priv->fakeReboot = false;
> +    qemuDomainSetFakeReboot(driver, vm, false);
>      virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_UNKNOWN);
>  
>      /* Run an early hook to set-up missing devices */

  ACK, that sounds right, and look so too :-)

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