[libvirt] Fix network driver when using qemu:///session (bz #958907).

Richard W.M. Jones rjones at fedoraproject.org
Fri May 3 14:15:55 UTC 2013


commit 56be2c5e383c00492e112bb02146c8830e726457
Author: Richard W.M. Jones <rjones at redhat.com>
Date:   Fri May 3 14:07:32 2013 +0100

    Fix network driver when using qemu:///session (bz #958907).

 ...5-fix-network-driver-startup-qemu-session.patch |  447 ++++++++++++++++++++
 libvirt.spec                                       |    8 +-
 2 files changed, 454 insertions(+), 1 deletions(-)
---
diff --git a/libvirt-1.0.5-fix-network-driver-startup-qemu-session.patch b/libvirt-1.0.5-fix-network-driver-startup-qemu-session.patch
new file mode 100644
index 0000000..2f82793
--- /dev/null
+++ b/libvirt-1.0.5-fix-network-driver-startup-qemu-session.patch
@@ -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));
diff --git a/libvirt.spec b/libvirt.spec
index bb90593..671cf83 100644
--- a/libvirt.spec
+++ b/libvirt.spec
@@ -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 at redhat.com> - 1.0.5-2
+- Fix network driver when using qemu:///session (bz #958907).
+
 * Thu May  2 2013 Daniel Veillard <veillard at redhat.com> - 1.0.5-1
 - Update to 1.0.5 release
 - add support for NVRAM device


More information about the scm-commits mailing list