[libvirt] [PATCH 2/2] Implementation deficiency in virInitctlSetRunLevel v4
Daniel P. Berrange
berrange at redhat.com
Fri Dec 20 16:35:21 UTC 2013
On Fri, Dec 20, 2013 at 08:24:52PM +0400, Reco wrote:
> Use helper virProcessRunInMountNamespace in lxcDomainShutdownFlags and
> lxcDomainReboot.
>
> ---
> src/lxc/lxc_driver.c | 44 ++++++++++++++++++++++++++++----------------
> 1 file changed, 28 insertions(+), 16 deletions(-)
>
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index e5298d1..2385f5b 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -2694,12 +2694,21 @@ lxcConnectListAllDomains(virConnectPtr conn,
>
>
> static int
> +virDomainShutdownCallback(pid_t pid ATTRIBUTE_UNUSED,
> + void *opaque ATTRIBUTE_UNUSED)
> +{
> + int rc;
> + rc = virInitctlSetRunLevel(VIR_INITCTL_RUNLEVEL_POWEROFF, NULL);
> + return rc;
> +}
> +
> +
> +static int
> lxcDomainShutdownFlags(virDomainPtr dom,
> unsigned int flags)
> {
> virLXCDomainObjPrivatePtr priv;
> virDomainObjPtr vm;
> - char *vroot = NULL;
> int ret = -1;
> int rc;
>
> @@ -2726,14 +2735,12 @@ lxcDomainShutdownFlags(virDomainPtr dom,
> goto cleanup;
> }
>
> - if (virAsprintf(&vroot, "/proc/%llu/root",
> - (unsigned long long)priv->initpid) < 0)
> - goto cleanup;
> -
> if (flags == 0 ||
> (flags & VIR_DOMAIN_SHUTDOWN_INITCTL)) {
> - if ((rc = virInitctlSetRunLevel(VIR_INITCTL_RUNLEVEL_POWEROFF,
> - vroot)) < 0) {
> + rc = virProcessRunInMountNamespace(priv->initpid,
> + virDomainShutdownCallback,
> + NULL);
> + if (rc < 0) {
> goto cleanup;
> }
> if (rc == 0 && flags != 0 &&
> @@ -2761,7 +2768,6 @@ lxcDomainShutdownFlags(virDomainPtr dom,
> ret = 0;
>
> cleanup:
> - VIR_FREE(vroot);
> if (vm)
> virObjectUnlock(vm);
> return ret;
> @@ -2773,13 +2779,22 @@ lxcDomainShutdown(virDomainPtr dom)
> return lxcDomainShutdownFlags(dom, 0);
> }
>
> +
> +virDomainRebootCallback(pid_t pid ATTRIBUTE_UNUSED,
> + void *opaque ATTRIBUTE_UNUSED)
> +{
> + int rc;
> + rc = virInitctlSetRunLevel(VIR_INITCTL_RUNLEVEL_REBOOT, NULL);
> + return rc;
> +}
> +
> +
> static int
> lxcDomainReboot(virDomainPtr dom,
> unsigned int flags)
> {
> virLXCDomainObjPrivatePtr priv;
> virDomainObjPtr vm;
> - char *vroot = NULL;
> int ret = -1;
> int rc;
>
> @@ -2806,14 +2821,12 @@ lxcDomainReboot(virDomainPtr dom,
> goto cleanup;
> }
>
> - if (virAsprintf(&vroot, "/proc/%llu/root",
> - (unsigned long long)priv->initpid) < 0)
> - goto cleanup;
> -
> if (flags == 0 ||
> (flags & VIR_DOMAIN_REBOOT_INITCTL)) {
> - if ((rc = virInitctlSetRunLevel(VIR_INITCTL_RUNLEVEL_REBOOT,
> - vroot)) < 0) {
> + rc = virProcessRunInMountNamespace(priv->initpid,
> + virDomainRebootCallback,
> + NULL);
> + if (rc < 0) {
> goto cleanup;
> }
> if (rc == 0 && flags != 0 &&
> @@ -2841,7 +2854,6 @@ lxcDomainReboot(virDomainPtr dom,
> ret = 0;
>
> cleanup:
> - VIR_FREE(vroot);
> if (vm)
> virObjectUnlock(vm);
> return ret;
ACK
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list