From a86252afbb6b9d2272fd65694f089707de025e4c 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 (cherry picked from commit e31ab02fd049aa72bea9cfabde15b2dd17e37f98) --- 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 | 8 ++++---- src/qemu/qemu_driver.c | 29 +++++++++++++++++++++++++++++ 6 files changed, 41 insertions(+), 9 deletions(-) diff --git a/libvirt.spec.in b/libvirt.spec.in index ea37be1949..9ee565a3fe 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -1965,8 +1965,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 @@ -2068,8 +2066,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 e65177f1bd..cf39cf5ccc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2683,7 +2683,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 81dcdb7021..9c5ccaf88b 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -161,6 +161,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; @@ -200,6 +203,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) @@ -289,6 +295,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 cb01fb688b..b8aae1b885 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 76fcccec96..bec7cf218c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1158,11 +1158,11 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, !dev->data.chr->source.data.nix.path && (driver && (cfg = virQEMUDriverGetConfig(driver)))) { - 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 3cb7a8301c..9a265110ef 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -97,6 +97,7 @@ #include "virhostdev.h" #include "domain_capabilities.h" #include "vircgroup.h" +#include "dirname.h" #define VIR_FROM_THIS VIR_FROM_QEMU @@ -701,6 +702,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) @@ -760,6 +767,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"), @@ -795,6 +804,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;