Fix network driver when using qemu:///session (bz #958907).
This commit is contained in:
parent
4aa9c4f1a3
commit
56be2c5e38
447
libvirt-1.0.5-fix-network-driver-startup-qemu-session.patch
Normal file
447
libvirt-1.0.5-fix-network-driver-startup-qemu-session.patch
Normal file
@ -0,0 +1,447 @@
|
||||
diff -ur libvirt-1.0.5.old/src/network/bridge_driver.c libvirt-1.0.5/src/network/bridge_driver.c
|
||||
--- libvirt-1.0.5.old/src/network/bridge_driver.c 2013-05-02 03:18:51.000000000 +0100
|
||||
+++ libvirt-1.0.5/src/network/bridge_driver.c 2013-05-03 14:20:03.666753641 +0100
|
||||
@@ -1,4 +1,3 @@
|
||||
-
|
||||
/*
|
||||
* bridge_driver.c: core driver methods for managing network
|
||||
*
|
||||
@@ -67,12 +66,6 @@
|
||||
#include "virdbus.h"
|
||||
#include "virfile.h"
|
||||
|
||||
-#define NETWORK_PID_DIR LOCALSTATEDIR "/run/libvirt/network"
|
||||
-#define NETWORK_STATE_DIR LOCALSTATEDIR "/lib/libvirt/network"
|
||||
-
|
||||
-#define DNSMASQ_STATE_DIR LOCALSTATEDIR "/lib/libvirt/dnsmasq"
|
||||
-#define RADVD_STATE_DIR LOCALSTATEDIR "/lib/libvirt/radvd"
|
||||
-
|
||||
#define VIR_FROM_THIS VIR_FROM_NETWORK
|
||||
|
||||
/* Main driver state */
|
||||
@@ -84,7 +77,10 @@
|
||||
iptablesContext *iptables;
|
||||
char *networkConfigDir;
|
||||
char *networkAutostartDir;
|
||||
- char *logDir;
|
||||
+ char *stateDir;
|
||||
+ char *pidDir;
|
||||
+ char *dnsmasqStateDir;
|
||||
+ char *radvdStateDir;
|
||||
dnsmasqCapsPtr dnsmasqCaps;
|
||||
};
|
||||
|
||||
@@ -133,8 +129,8 @@
|
||||
{
|
||||
char *leasefile;
|
||||
|
||||
- ignore_value(virAsprintf(&leasefile, DNSMASQ_STATE_DIR "/%s.leases",
|
||||
- netname));
|
||||
+ ignore_value(virAsprintf(&leasefile, "%s/%s.leases",
|
||||
+ driverState->dnsmasqStateDir, netname));
|
||||
return leasefile;
|
||||
}
|
||||
|
||||
@@ -146,8 +142,8 @@
|
||||
{
|
||||
char *conffile;
|
||||
|
||||
- ignore_value(virAsprintf(&conffile, DNSMASQ_STATE_DIR "/%s.conf",
|
||||
- netname));
|
||||
+ ignore_value(virAsprintf(&conffile, "%s/%s.conf",
|
||||
+ driverState->dnsmasqStateDir, netname));
|
||||
return conffile;
|
||||
}
|
||||
|
||||
@@ -166,8 +162,8 @@
|
||||
{
|
||||
char *configfile;
|
||||
|
||||
- ignore_value(virAsprintf(&configfile, RADVD_STATE_DIR "/%s-radvd.conf",
|
||||
- netname));
|
||||
+ ignore_value(virAsprintf(&configfile, "%s/%s-radvd.conf",
|
||||
+ driverState->radvdStateDir, netname));
|
||||
return configfile;
|
||||
}
|
||||
|
||||
@@ -187,8 +183,10 @@
|
||||
int ret = -1;
|
||||
|
||||
/* remove the (possibly) existing dnsmasq and radvd files */
|
||||
- if (!(dctx = dnsmasqContextNew(def->name, DNSMASQ_STATE_DIR)))
|
||||
+ if (!(dctx = dnsmasqContextNew(def->name,
|
||||
+ driverState->dnsmasqStateDir))) {
|
||||
goto cleanup;
|
||||
+ }
|
||||
|
||||
if (!(leasefile = networkDnsmasqLeaseFileName(def->name)))
|
||||
goto cleanup;
|
||||
@@ -202,7 +200,8 @@
|
||||
if (!(configfile = networkDnsmasqConfigFileName(def->name)))
|
||||
goto no_memory;
|
||||
|
||||
- if (!(statusfile = virNetworkConfigFile(NETWORK_STATE_DIR, def->name)))
|
||||
+ if (!(statusfile
|
||||
+ = virNetworkConfigFile(driverState->stateDir, def->name)))
|
||||
goto no_memory;
|
||||
|
||||
/* dnsmasq */
|
||||
@@ -212,7 +211,7 @@
|
||||
|
||||
/* radvd */
|
||||
unlink(radvdconfigfile);
|
||||
- virPidFileDelete(NETWORK_PID_DIR, radvdpidbase);
|
||||
+ virPidFileDelete(driverState->pidDir, radvdpidbase);
|
||||
|
||||
/* remove status file */
|
||||
unlink(statusfile);
|
||||
@@ -279,7 +278,7 @@
|
||||
if (obj->def->ips && (obj->def->nips > 0)) {
|
||||
char *radvdpidbase;
|
||||
|
||||
- ignore_value(virPidFileReadIfAlive(NETWORK_PID_DIR, obj->def->name,
|
||||
+ ignore_value(virPidFileReadIfAlive(driverState->pidDir, obj->def->name,
|
||||
&obj->dnsmasqPid,
|
||||
dnsmasqCapsGetBinaryPath(driver->dnsmasqCaps)));
|
||||
|
||||
@@ -287,7 +286,7 @@
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
- ignore_value(virPidFileReadIfAlive(NETWORK_PID_DIR, radvdpidbase,
|
||||
+ ignore_value(virPidFileReadIfAlive(driverState->pidDir, radvdpidbase,
|
||||
&obj->radvdPid, RADVD));
|
||||
VIR_FREE(radvdpidbase);
|
||||
}
|
||||
@@ -359,7 +358,9 @@
|
||||
virStateInhibitCallback callback ATTRIBUTE_UNUSED,
|
||||
void *opaque ATTRIBUTE_UNUSED)
|
||||
{
|
||||
- char *base = NULL;
|
||||
+ int ret = -1;
|
||||
+ char *configdir = NULL;
|
||||
+ char *rundir = NULL;
|
||||
#ifdef HAVE_FIREWALLD
|
||||
DBusConnection *sysbus = NULL;
|
||||
#endif
|
||||
@@ -373,46 +374,53 @@
|
||||
}
|
||||
networkDriverLock(driverState);
|
||||
|
||||
+ /* Configuration paths one of
|
||||
+ * ~/.libvirt/... (old style session/unprivileged)
|
||||
+ * ~/.config/libvirt/... (new XDG session/unprivileged)
|
||||
+ * /etc/libvirt/... && /var/(run|lib)/libvirt/... (system/privileged).
|
||||
+ *
|
||||
+ * NB: The qemu driver puts its domain state in /var/run, and I
|
||||
+ * think the network driver should have used /var/run too (instead
|
||||
+ * of /var/lib), but it's been this way for a long time, and we
|
||||
+ * probably should change it now.
|
||||
+ */
|
||||
if (privileged) {
|
||||
- if (virAsprintf(&driverState->logDir,
|
||||
- "%s/log/libvirt/qemu", LOCALSTATEDIR) == -1)
|
||||
- goto out_of_memory;
|
||||
-
|
||||
- if ((base = strdup(SYSCONFDIR "/libvirt")) == NULL)
|
||||
+ if (!(driverState->networkConfigDir
|
||||
+ = strdup(SYSCONFDIR "/libvirt/qemu/networks")) ||
|
||||
+ !(driverState->networkAutostartDir
|
||||
+ = strdup(SYSCONFDIR "/libvirt/qemu/networks/autostart")) ||
|
||||
+ !(driverState->stateDir
|
||||
+ = strdup(LOCALSTATEDIR "/lib/libvirt/network")) ||
|
||||
+ !(driverState->pidDir
|
||||
+ = strdup(LOCALSTATEDIR "/run/libvirt/network")) ||
|
||||
+ !(driverState->dnsmasqStateDir
|
||||
+ = strdup(LOCALSTATEDIR "/lib/libvirt/dnsmasq")) ||
|
||||
+ !(driverState->radvdStateDir
|
||||
+ = strdup(LOCALSTATEDIR "/lib/libvirt/radvd"))) {
|
||||
goto out_of_memory;
|
||||
+ }
|
||||
} else {
|
||||
- char *userdir = virGetUserCacheDirectory();
|
||||
-
|
||||
- if (!userdir)
|
||||
+ configdir = virGetUserConfigDirectory();
|
||||
+ rundir = virGetUserRuntimeDirectory();
|
||||
+ if (!(configdir && rundir))
|
||||
goto error;
|
||||
|
||||
- if (virAsprintf(&driverState->logDir,
|
||||
- "%s/qemu/log", userdir) == -1) {
|
||||
- VIR_FREE(userdir);
|
||||
+ if ((virAsprintf(&driverState->networkConfigDir,
|
||||
+ "%s/qemu/networks", configdir) < 0) ||
|
||||
+ (virAsprintf(&driverState->networkAutostartDir,
|
||||
+ "%s/qemu/networks/autostart", configdir) < 0) ||
|
||||
+ (virAsprintf(&driverState->stateDir,
|
||||
+ "%s/network/lib", rundir) < 0) ||
|
||||
+ (virAsprintf(&driverState->pidDir,
|
||||
+ "%s/network/run", rundir) < 0) ||
|
||||
+ (virAsprintf(&driverState->dnsmasqStateDir,
|
||||
+ "%s/dnsmasq/lib", rundir) < 0) ||
|
||||
+ (virAsprintf(&driverState->radvdStateDir,
|
||||
+ "%s/radvd/lib", rundir) < 0)) {
|
||||
goto out_of_memory;
|
||||
}
|
||||
- VIR_FREE(userdir);
|
||||
-
|
||||
- userdir = virGetUserConfigDirectory();
|
||||
- if (virAsprintf(&base, "%s", userdir) == -1) {
|
||||
- VIR_FREE(userdir);
|
||||
- goto out_of_memory;
|
||||
- }
|
||||
- VIR_FREE(userdir);
|
||||
}
|
||||
|
||||
- /* Configuration paths are either ~/.libvirt/qemu/... (session) or
|
||||
- * /etc/libvirt/qemu/... (system).
|
||||
- */
|
||||
- if (virAsprintf(&driverState->networkConfigDir, "%s/qemu/networks", base) == -1)
|
||||
- goto out_of_memory;
|
||||
-
|
||||
- if (virAsprintf(&driverState->networkAutostartDir, "%s/qemu/networks/autostart",
|
||||
- base) == -1)
|
||||
- goto out_of_memory;
|
||||
-
|
||||
- VIR_FREE(base);
|
||||
-
|
||||
if (!(driverState->iptables = iptablesContextNew())) {
|
||||
goto out_of_memory;
|
||||
}
|
||||
@@ -421,7 +429,7 @@
|
||||
driverState->dnsmasqCaps = dnsmasqCapsNewFromBinary(DNSMASQ);
|
||||
|
||||
if (virNetworkLoadAllState(&driverState->networks,
|
||||
- NETWORK_STATE_DIR) < 0)
|
||||
+ driverState->stateDir) < 0)
|
||||
goto error;
|
||||
|
||||
if (virNetworkLoadAllConfigs(&driverState->networks,
|
||||
@@ -462,18 +470,19 @@
|
||||
}
|
||||
#endif
|
||||
|
||||
- return 0;
|
||||
+ ret = 0;
|
||||
+cleanup:
|
||||
+ VIR_FREE(configdir);
|
||||
+ VIR_FREE(rundir);
|
||||
+ return ret;
|
||||
|
||||
out_of_memory:
|
||||
virReportOOMError();
|
||||
-
|
||||
error:
|
||||
if (driverState)
|
||||
networkDriverUnlock(driverState);
|
||||
-
|
||||
- VIR_FREE(base);
|
||||
networkStateCleanup();
|
||||
- return -1;
|
||||
+ goto cleanup;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -489,7 +498,7 @@
|
||||
|
||||
networkDriverLock(driverState);
|
||||
virNetworkLoadAllState(&driverState->networks,
|
||||
- NETWORK_STATE_DIR);
|
||||
+ driverState->stateDir);
|
||||
virNetworkLoadAllConfigs(&driverState->networks,
|
||||
driverState->networkConfigDir,
|
||||
driverState->networkAutostartDir);
|
||||
@@ -516,9 +525,12 @@
|
||||
/* free inactive networks */
|
||||
virNetworkObjListFree(&driverState->networks);
|
||||
|
||||
- VIR_FREE(driverState->logDir);
|
||||
VIR_FREE(driverState->networkConfigDir);
|
||||
VIR_FREE(driverState->networkAutostartDir);
|
||||
+ VIR_FREE(driverState->stateDir);
|
||||
+ VIR_FREE(driverState->pidDir);
|
||||
+ VIR_FREE(driverState->dnsmasqStateDir);
|
||||
+ VIR_FREE(driverState->radvdStateDir);
|
||||
|
||||
if (driverState->iptables)
|
||||
iptablesContextFree(driverState->iptables);
|
||||
@@ -1060,32 +1072,33 @@
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- if (virFileMakePath(NETWORK_PID_DIR) < 0) {
|
||||
+ if (virFileMakePath(driverState->pidDir) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("cannot create directory %s"),
|
||||
- NETWORK_PID_DIR);
|
||||
+ driverState->pidDir);
|
||||
goto cleanup;
|
||||
}
|
||||
- if (virFileMakePath(NETWORK_STATE_DIR) < 0) {
|
||||
+ if (virFileMakePath(driverState->stateDir) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("cannot create directory %s"),
|
||||
- NETWORK_STATE_DIR);
|
||||
+ driverState->stateDir);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- if (!(pidfile = virPidFileBuildPath(NETWORK_PID_DIR, network->def->name))) {
|
||||
+ if (!(pidfile = virPidFileBuildPath(driverState->pidDir,
|
||||
+ network->def->name))) {
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- if (virFileMakePath(DNSMASQ_STATE_DIR) < 0) {
|
||||
+ if (virFileMakePath(driverState->dnsmasqStateDir) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("cannot create directory %s"),
|
||||
- DNSMASQ_STATE_DIR);
|
||||
+ driverState->dnsmasqStateDir);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- dctx = dnsmasqContextNew(network->def->name, DNSMASQ_STATE_DIR);
|
||||
+ dctx = dnsmasqContextNew(network->def->name, driverState->dnsmasqStateDir);
|
||||
if (dctx == NULL)
|
||||
goto cleanup;
|
||||
|
||||
@@ -1113,7 +1126,7 @@
|
||||
* pid
|
||||
*/
|
||||
|
||||
- ret = virPidFileRead(NETWORK_PID_DIR, network->def->name,
|
||||
+ ret = virPidFileRead(driverState->pidDir, network->def->name,
|
||||
&network->dnsmasqPid);
|
||||
if (ret < 0)
|
||||
goto cleanup;
|
||||
@@ -1150,8 +1163,10 @@
|
||||
return networkStartDhcpDaemon(driver, network);
|
||||
|
||||
VIR_INFO("Refreshing dnsmasq for network %s", network->def->bridge);
|
||||
- if (!(dctx = dnsmasqContextNew(network->def->name, DNSMASQ_STATE_DIR)))
|
||||
+ if (!(dctx = dnsmasqContextNew(network->def->name,
|
||||
+ driverState->dnsmasqStateDir))) {
|
||||
goto cleanup;
|
||||
+ }
|
||||
|
||||
/* Look for first IPv4 address that has dhcp defined.
|
||||
* We only support dhcp-host config on one IPv4 subnetwork
|
||||
@@ -1375,16 +1390,16 @@
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- if (virFileMakePath(NETWORK_PID_DIR) < 0) {
|
||||
+ if (virFileMakePath(driverState->pidDir) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("cannot create directory %s"),
|
||||
- NETWORK_PID_DIR);
|
||||
+ driverState->pidDir);
|
||||
goto cleanup;
|
||||
}
|
||||
- if (virFileMakePath(RADVD_STATE_DIR) < 0) {
|
||||
+ if (virFileMakePath(driverState->radvdStateDir) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("cannot create directory %s"),
|
||||
- RADVD_STATE_DIR);
|
||||
+ driverState->radvdStateDir);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@@ -1393,7 +1408,7 @@
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
- if (!(pidfile = virPidFileBuildPath(NETWORK_PID_DIR, radvdpidbase))) {
|
||||
+ if (!(pidfile = virPidFileBuildPath(driverState->pidDir, radvdpidbase))) {
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -1421,7 +1436,7 @@
|
||||
if (virCommandRun(cmd, NULL) < 0)
|
||||
goto cleanup;
|
||||
|
||||
- if (virPidFileRead(NETWORK_PID_DIR, radvdpidbase, &network->radvdPid) < 0)
|
||||
+ if (virPidFileRead(driverState->pidDir, radvdpidbase, &network->radvdPid) < 0)
|
||||
goto cleanup;
|
||||
|
||||
ret = 0;
|
||||
@@ -1448,7 +1463,7 @@
|
||||
network->def->name) >= 0) &&
|
||||
((radvdpidbase = networkRadvdPidfileBasename(network->def->name))
|
||||
!= NULL)) {
|
||||
- virPidFileDelete(NETWORK_PID_DIR, radvdpidbase);
|
||||
+ virPidFileDelete(driverState->pidDir, radvdpidbase);
|
||||
VIR_FREE(radvdpidbase);
|
||||
}
|
||||
network->radvdPid = -1;
|
||||
@@ -1488,7 +1503,7 @@
|
||||
network->def->name) >= 0) &&
|
||||
((radvdpidbase = networkRadvdPidfileBasename(network->def->name))
|
||||
!= NULL)) {
|
||||
- virPidFileDelete(NETWORK_PID_DIR, radvdpidbase);
|
||||
+ virPidFileDelete(driverState->pidDir, radvdpidbase);
|
||||
VIR_FREE(radvdpidbase);
|
||||
}
|
||||
network->radvdPid = -1;
|
||||
@@ -2572,7 +2587,7 @@
|
||||
if (!(radvdpidbase = networkRadvdPidfileBasename(network->def->name))) {
|
||||
virReportOOMError();
|
||||
} else {
|
||||
- virPidFileDelete(NETWORK_PID_DIR, radvdpidbase);
|
||||
+ virPidFileDelete(driverState->pidDir, radvdpidbase);
|
||||
VIR_FREE(radvdpidbase);
|
||||
}
|
||||
}
|
||||
@@ -2673,7 +2688,8 @@
|
||||
/* Persist the live configuration now that anything autogenerated
|
||||
* is setup.
|
||||
*/
|
||||
- if ((ret = virNetworkSaveStatus(NETWORK_STATE_DIR, network)) < 0) {
|
||||
+ if ((ret = virNetworkSaveStatus(driverState->stateDir,
|
||||
+ network)) < 0) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
@@ -2703,7 +2719,8 @@
|
||||
if (!virNetworkObjIsActive(network))
|
||||
return 0;
|
||||
|
||||
- stateFile = virNetworkConfigFile(NETWORK_STATE_DIR, network->def->name);
|
||||
+ stateFile = virNetworkConfigFile(driverState->stateDir,
|
||||
+ network->def->name);
|
||||
if (!stateFile)
|
||||
return -1;
|
||||
|
||||
@@ -3368,8 +3385,10 @@
|
||||
}
|
||||
|
||||
/* save current network state to disk */
|
||||
- if ((ret = virNetworkSaveStatus(NETWORK_STATE_DIR, network)) < 0)
|
||||
+ if ((ret = virNetworkSaveStatus(driverState->stateDir,
|
||||
+ network)) < 0) {
|
||||
goto cleanup;
|
||||
+ }
|
||||
}
|
||||
ret = 0;
|
||||
cleanup:
|
||||
@@ -4702,7 +4721,7 @@
|
||||
/* update sum of 'floor'-s of attached NICs */
|
||||
net->floor_sum += ifaceBand->in->floor;
|
||||
/* update status file */
|
||||
- if (virNetworkSaveStatus(NETWORK_STATE_DIR, net) < 0) {
|
||||
+ if (virNetworkSaveStatus(driverState->stateDir, net) < 0) {
|
||||
ignore_value(virBitmapClearBit(net->class_id, class_id));
|
||||
net->floor_sum -= ifaceBand->in->floor;
|
||||
iface->data.network.actual->class_id = 0;
|
||||
@@ -4748,7 +4767,7 @@
|
||||
ignore_value(virBitmapClearBit(net->class_id,
|
||||
iface->data.network.actual->class_id));
|
||||
/* update status file */
|
||||
- if (virNetworkSaveStatus(NETWORK_STATE_DIR, net) < 0) {
|
||||
+ if (virNetworkSaveStatus(driverState->stateDir, net) < 0) {
|
||||
net->floor_sum += ifaceBand->in->floor;
|
||||
ignore_value(virBitmapSetBit(net->class_id,
|
||||
iface->data.network.actual->class_id));
|
@ -341,7 +341,7 @@
|
||||
Summary: Library providing a simple virtualization API
|
||||
Name: libvirt
|
||||
Version: 1.0.5
|
||||
Release: 1%{?dist}%{?extra_release}
|
||||
Release: 2%{?dist}%{?extra_release}
|
||||
License: LGPLv2+
|
||||
Group: Development/Libraries
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
|
||||
@ -352,6 +352,8 @@ URL: http://libvirt.org/
|
||||
%endif
|
||||
Source: http://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.gz
|
||||
|
||||
Patch1: libvirt-1.0.5-fix-network-driver-startup-qemu-session.patch
|
||||
|
||||
%if %{with_libvirtd}
|
||||
Requires: libvirt-daemon = %{version}-%{release}
|
||||
%if %{with_network}
|
||||
@ -1081,6 +1083,7 @@ of recent versions of Linux (and other OSes).
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
%patch1 -p1
|
||||
|
||||
%build
|
||||
%if ! %{with_xen}
|
||||
@ -1998,6 +2001,9 @@ fi
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Fri May 3 2013 Richard W.M. Jones <rjones@redhat.com> - 1.0.5-2
|
||||
- Fix network driver when using qemu:///session (bz #958907).
|
||||
|
||||
* Thu May 2 2013 Daniel Veillard <veillard@redhat.com> - 1.0.5-1
|
||||
- Update to 1.0.5 release
|
||||
- add support for NVRAM device
|
||||
|
Loading…
Reference in New Issue
Block a user