[libvirt] [PATCH] lxc: suspend/resume support
Daniel P. Berrange
berrange at redhat.com
Mon Sep 21 12:05:12 UTC 2009
On Thu, Sep 17, 2009 at 12:42:08AM +0900, Ryota Ozaki wrote:
> +static int lxcDomainSuspend(virDomainPtr dom)
> +{
> + lxc_driver_t *driver = dom->conn->privateData;
> + virDomainObjPtr vm;
> + virDomainEventPtr event = NULL;
> + int ret = -1;
> +
> + lxcDriverLock(driver);
> + vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> +
> + if (!vm) {
> + char uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(dom->uuid, uuidstr);
> + lxcError(dom->conn, dom, VIR_ERR_NO_DOMAIN,
> + _("no domain with matching uuid '%s'"), uuidstr);
> + goto cleanup;
> + }
> +
> + if (!virDomainIsActive(vm)) {
> + lxcError(dom->conn, dom, VIR_ERR_OPERATION_INVALID,
> + "%s", _("domain is not running"));
> + goto cleanup;
> + }
> +
> + if (vm->state != VIR_DOMAIN_PAUSED) {
> + if (lxcFreezeContainer(driver, vm) < 0) {
> + lxcError(dom->conn, dom, VIR_ERR_OPERATION_FAILED,
> + "%s", _("suspend operation failed"));
> + goto cleanup;
> + }
> + vm->state = VIR_DOMAIN_PAUSED;
> + }
> +
> + if (virDomainSaveStatus(dom->conn, driver->stateDir, vm) < 0)
> + goto cleanup;
> + ret = 0;
> +
> + event = virDomainEventNewFromObj(vm,
> + VIR_DOMAIN_EVENT_SUSPENDED,
> + VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
The virDomainSaveStatus/virDomainEventNewFromObj calls need to be moved
up inside the "if (vm->state != VIR_DOMAIN_PAUSED) {" conditional, since
you don't want to dispatch an event if its already paused.
> +static int lxcDomainResume(virDomainPtr dom)
> +{
> + lxc_driver_t *driver = dom->conn->privateData;
> + virDomainObjPtr vm;
> + virDomainEventPtr event = NULL;
> + int ret = -1;
> +
> + lxcDriverLock(driver);
> + vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> +
> + if (!vm) {
> + char uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(dom->uuid, uuidstr);
> + lxcError(dom->conn, dom, VIR_ERR_NO_DOMAIN,
> + _("no domain with matching uuid '%s'"), uuidstr);
> + goto cleanup;
> + }
> +
> + if (!virDomainIsActive(vm)) {
> + lxcError(dom->conn, dom, VIR_ERR_OPERATION_INVALID,
> + "%s", _("domain is not running"));
> + goto cleanup;
> + }
> +
> + if (vm->state == VIR_DOMAIN_PAUSED) {
> + if (lxcUnfreezeContainer(driver, vm) < 0) {
> + lxcError(dom->conn, dom, VIR_ERR_OPERATION_FAILED,
> + "%s", _("resume operation failed"));
> + goto cleanup;
> + }
> + vm->state = VIR_DOMAIN_RUNNING;
> + }
> +
> + if (virDomainSaveStatus(dom->conn, driver->stateDir, vm) < 0)
> + goto cleanup;
> + ret = 0;
> +
> + event = virDomainEventNewFromObj(vm,
> + VIR_DOMAIN_EVENT_RESUMED,
> + VIR_DOMAIN_EVENT_RESUMED_UNPAUSED);
Same as above - the virDomainSaveStatus/virDomainEventNewFromObj cals
need to be moved inside the "if (vm->state == VIR_DOMAIN_PAUSED) "
conditional
Aside from that, this patch looks good.
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list