[libvirt] PATCH: Fix startup of LXC vms without cgroups

If cgroups was not mounted at all, LXC would fail to start any VM, since we missed an error code check Daniel commit 8713c7e8111e73879f8380b920995ff3d1f3f9e9 Author: Daniel P. Berrange <berrange@redhat.com> Date: Fri Jul 31 14:37:25 2009 +0100 Don't try to activate cgroups if not present for LXC * src/lxc_controller.c: Don't throw error in LXC startup if the cgroups driver mount isn't available. Improve error logging for resource setup diff --git a/src/lxc_controller.c b/src/lxc_controller.c index 9ad48a7..8d11238 100644 --- a/src/lxc_controller.c +++ b/src/lxc_controller.c @@ -84,25 +84,38 @@ static int lxcSetContainerResources(virDomainDefPtr def) rc = virCgroupForDriver("lxc", &driver, 1, 0); if (rc != 0) { - lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to get cgroup for driver")); + /* Skip all if no driver cgroup is configured */ + if (rc == -ENXIO || rc == -ENOENT) + return 0; + + virReportSystemError(NULL, -rc, "%s", + _("Unable to get cgroup for driver")); return rc; } rc = virCgroupForDomain(driver, def->name, &cgroup, 1); if (rc != 0) { - lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, - _("Unable to create cgroup for domain %s"), def->name); + virReportSystemError(NULL, -rc, + _("Unable to create cgroup for domain %s"), + def->name); goto cleanup; } rc = virCgroupSetMemory(cgroup, def->maxmem); - if (rc != 0) - goto out; + if (rc != 0) { + virReportSystemError(NULL, -rc, + _("Unable to set memory limit for domain %s"), + def->name); + goto cleanup; + } rc = virCgroupDenyAllDevices(cgroup); - if (rc != 0) - goto out; + if (rc != 0) { + virReportSystemError(NULL, -rc, + _("Unable to deny devices for domain %s"), + def->name); + goto cleanup; + } for (i = 0; devices[i].type != 0; i++) { struct cgroup_device_policy *dev = &devices[i]; @@ -110,19 +123,27 @@ static int lxcSetContainerResources(virDomainDefPtr def) dev->type, dev->major, dev->minor); - if (rc != 0) - goto out; + if (rc != 0) { + virReportSystemError(NULL, -rc, + _("Unable to allow device %c:%d:%d for domain %s"), + dev->type, dev->major, dev->minor, def->name); + goto cleanup; + } } rc = virCgroupAllowDeviceMajor(cgroup, 'c', LXC_DEV_MAJ_PTY); - if (rc != 0) - goto out; + if (rc != 0) { + virReportSystemError(NULL, -rc, + _("Unable to allow PYT devices for domain %s"), + def->name); + goto cleanup; + } rc = virCgroupAddTask(cgroup, getpid()); -out: if (rc != 0) { - virReportSystemError(NULL, -rc, "%s", - _("Failed to set lxc resources")); + virReportSystemError(NULL, -rc, + _("Unable to add task %d to cgroup for domain %s"), + getpid(), def->name); } cleanup: -- |: 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 :|

On Fri, Jul 31, 2009 at 03:54:30PM +0100, Daniel P. Berrange wrote:
If cgroups was not mounted at all, LXC would fail to start any VM, since we missed an error code check
ACK, looks fine Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/
participants (2)
-
Daniel P. Berrange
-
Daniel Veillard