From e31ab02fd049aa72bea9cfabde15b2dd17e37f98 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Thu, 23 Apr 2015 19:24:50 -0400 Subject: [PATCH] qemu: Build channel autosocket directory at driver startup Rather than depend on the RPM to put it in place, since this doesn't cover the qemu:///session case. Currently auto allocated socket path is completely busted with qemu:///session https://bugzilla.redhat.com/show_bug.cgi?id=1105274 And because we chown the directory at driver startup now, this also fixes autosocket startup failures when using user/group=root https://bugzilla.redhat.com/show_bug.cgi?id=1044561 https://bugzilla.redhat.com/show_bug.cgi?id=1146886 --- libvirt.spec.in | 4 ---- src/Makefile.am | 1 - src/qemu/qemu_conf.c | 7 +++++++ src/qemu/qemu_conf.h | 1 + src/qemu/qemu_domain.c | 9 ++++----- src/qemu/qemu_driver.c | 29 +++++++++++++++++++++++++++++ 6 files changed, 41 insertions(+), 10 deletions(-) diff --git a/libvirt.spec.in b/libvirt.spec.in index b32b68aa83..2f19c7f991 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -1985,8 +1985,6 @@ exit 0 %dir %attr(0700, root, root) %{_localstatedir}/log/libvirt/qemu/ %ghost %dir %attr(0700, root, root) %{_localstatedir}/run/libvirt/qemu/ %dir %attr(0750, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/ -%dir %attr(0750, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/ -%dir %attr(0750, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/target/ %dir %attr(0711, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/nvram/ %dir %attr(0750, %{qemu_user}, %{qemu_group}) %{_localstatedir}/cache/libvirt/qemu/ %{_datadir}/augeas/lenses/libvirtd_qemu.aug @@ -2091,8 +2089,6 @@ exit 0 %config(noreplace) %{_sysconfdir}/logrotate.d/libvirtd.qemu %ghost %dir %attr(0700, root, root) %{_localstatedir}/run/libvirt/qemu/ %dir %attr(0750, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/ -%dir %attr(0750, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/ -%dir %attr(0750, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/target/ %dir %attr(0711, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/nvram/ %dir %attr(0750, %{qemu_user}, %{qemu_group}) %{_localstatedir}/cache/libvirt/qemu/ %{_datadir}/augeas/lenses/libvirtd_qemu.aug diff --git a/src/Makefile.am b/src/Makefile.am index 9a5f16cb9e..dd41b45e41 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2705,7 +2705,6 @@ if WITH_SANLOCK endif WITH_SANLOCK if WITH_QEMU $(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/qemu" - $(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/qemu/channel/target" $(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/qemu/nvram" $(MKDIR_P) "$(DESTDIR)$(localstatedir)/run/libvirt/qemu" $(MKDIR_P) "$(DESTDIR)$(localstatedir)/cache/libvirt/qemu" diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 1075e26c62..4b5fa392f8 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -205,6 +205,9 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged) goto error; if (virAsprintf(&cfg->autoDumpPath, "%s/dump", cfg->libDir) < 0) goto error; + if (virAsprintf(&cfg->channelTargetDir, + "%s/channel/target", cfg->libDir) < 0) + goto error; } else { char *rundir; char *cachedir; @@ -244,6 +247,9 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged) goto error; if (virAsprintf(&cfg->autoDumpPath, "%s/qemu/dump", cfg->configBaseDir) < 0) goto error; + if (virAsprintf(&cfg->channelTargetDir, + "%s/qemu/channel/target", cfg->configBaseDir) < 0) + goto error; } if (virAsprintf(&cfg->configDir, "%s/qemu", cfg->configBaseDir) < 0) @@ -342,6 +348,7 @@ static void virQEMUDriverConfigDispose(void *obj) VIR_FREE(cfg->cacheDir); VIR_FREE(cfg->saveDir); VIR_FREE(cfg->snapshotDir); + VIR_FREE(cfg->channelTargetDir); VIR_FREE(cfg->vncTLSx509certdir); VIR_FREE(cfg->vncListen); diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 4b02d19809..6e9f8153a9 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -104,6 +104,7 @@ struct _virQEMUDriverConfig { char *cacheDir; char *saveDir; char *snapshotDir; + char *channelTargetDir; bool vncAutoUnixSocket; bool vncTLS; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 6c480c6daf..39973a9182 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1193,12 +1193,11 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, dev->data.chr->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO && dev->data.chr->source.type == VIR_DOMAIN_CHR_TYPE_UNIX && !dev->data.chr->source.data.nix.path && cfg) { - - if (virAsprintf(&dev->data.chr->source.data.nix.path, - "%s/channel/target/%s.%s", - cfg->libDir, def->name, - dev->data.chr->target.name) < 0) + if (virAsprintf(&dev->data.chr->source.data.nix.path, "%s/%s.%s", + cfg->channelTargetDir, + def->name, dev->data.chr->target.name) < 0) goto cleanup; + dev->data.chr->source.data.nix.listen = true; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 101f9dd1ff..e59aec4ada 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -98,6 +98,7 @@ #include "domain_capabilities.h" #include "vircgroup.h" #include "virnuma.h" +#include "dirname.h" #define VIR_FROM_THIS VIR_FROM_QEMU @@ -702,6 +703,12 @@ qemuStateInitialize(bool privileged, cfg->autoDumpPath, virStrerror(errno, ebuf, sizeof(ebuf))); goto error; } + if (virFileMakePath(cfg->channelTargetDir) < 0) { + VIR_ERROR(_("Failed to create channel target dir '%s': %s"), + cfg->channelTargetDir, + virStrerror(errno, ebuf, sizeof(ebuf))); + goto error; + } qemu_driver->qemuImgBinary = virFindFileInPath("kvm-img"); if (!qemu_driver->qemuImgBinary) @@ -761,6 +768,8 @@ qemuStateInitialize(bool privileged, goto error; if (privileged) { + char *channeldir; + if (chown(cfg->libDir, cfg->user, cfg->group) < 0) { virReportSystemError(errno, _("unable to set ownership of '%s' to user %d:%d"), @@ -796,6 +805,26 @@ qemuStateInitialize(bool privileged, (int) cfg->group); goto error; } + if (!(channeldir = mdir_name(cfg->channelTargetDir))) { + virReportOOMError(); + goto error; + } + if (chown(channeldir, cfg->user, cfg->group) < 0) { + virReportSystemError(errno, + _("unable to set ownership of '%s' to %d:%d"), + channeldir, (int) cfg->user, + (int) cfg->group); + VIR_FREE(channeldir); + goto error; + } + VIR_FREE(channeldir); + if (chown(cfg->channelTargetDir, cfg->user, cfg->group) < 0) { + virReportSystemError(errno, + _("unable to set ownership of '%s' to %d:%d"), + cfg->channelTargetDir, (int) cfg->user, + (int) cfg->group); + goto error; + } run_uid = cfg->user; run_gid = cfg->group;