mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-02 09:55:18 +00:00
network_driver: Use accessor for dnsmasqCaps
This is not an immutable pointer and can change during lifetime. Therefore, in order to drop network driver lock, we must use an internal accessor which does not lock the network driver yet, but it will soon. Now it merely returns an referenced object. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
1009a61ecb
commit
172acef486
@ -106,6 +106,27 @@ static void networkDriverUnlock(virNetworkDriverStatePtr driver)
|
|||||||
virMutexUnlock(&driver->lock);
|
virMutexUnlock(&driver->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static dnsmasqCapsPtr
|
||||||
|
networkGetDnsmasqCaps(virNetworkDriverStatePtr driver)
|
||||||
|
{
|
||||||
|
dnsmasqCapsPtr ret;
|
||||||
|
ret = virObjectRef(driver->dnsmasqCaps);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
networkDnsmasqCapsRefresh(virNetworkDriverStatePtr driver)
|
||||||
|
{
|
||||||
|
dnsmasqCapsPtr caps;
|
||||||
|
|
||||||
|
if (!(caps = dnsmasqCapsNewFromBinary(DNSMASQ)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
virObjectUnref(driver->dnsmasqCaps);
|
||||||
|
driver->dnsmasqCaps = caps;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int networkStateCleanup(void);
|
static int networkStateCleanup(void);
|
||||||
|
|
||||||
static int networkStartNetwork(virNetworkDriverStatePtr driver,
|
static int networkStartNetwork(virNetworkDriverStatePtr driver,
|
||||||
@ -364,6 +385,7 @@ networkUpdateState(virNetworkObjPtr obj,
|
|||||||
void *opaque)
|
void *opaque)
|
||||||
{
|
{
|
||||||
virNetworkDriverStatePtr driver = opaque;
|
virNetworkDriverStatePtr driver = opaque;
|
||||||
|
dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
virObjectLock(obj);
|
virObjectLock(obj);
|
||||||
@ -408,7 +430,7 @@ networkUpdateState(virNetworkObjPtr obj,
|
|||||||
ignore_value(virPidFileReadIfAlive(driver->pidDir,
|
ignore_value(virPidFileReadIfAlive(driver->pidDir,
|
||||||
obj->def->name,
|
obj->def->name,
|
||||||
&obj->dnsmasqPid,
|
&obj->dnsmasqPid,
|
||||||
dnsmasqCapsGetBinaryPath(driver->dnsmasqCaps)));
|
dnsmasqCapsGetBinaryPath(dnsmasq_caps)));
|
||||||
radvdpidbase = networkRadvdPidfileBasename(obj->def->name);
|
radvdpidbase = networkRadvdPidfileBasename(obj->def->name);
|
||||||
if (!radvdpidbase)
|
if (!radvdpidbase)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -422,6 +444,7 @@ networkUpdateState(virNetworkObjPtr obj,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
virObjectUnlock(obj);
|
virObjectUnlock(obj);
|
||||||
|
virObjectUnref(dnsmasq_caps);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1284,6 +1307,7 @@ networkBuildDhcpDaemonCommandLine(virNetworkDriverStatePtr driver,
|
|||||||
char *pidfile,
|
char *pidfile,
|
||||||
dnsmasqContext *dctx)
|
dnsmasqContext *dctx)
|
||||||
{
|
{
|
||||||
|
dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
|
||||||
virCommandPtr cmd = NULL;
|
virCommandPtr cmd = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
char *configfile = NULL;
|
char *configfile = NULL;
|
||||||
@ -1293,7 +1317,7 @@ networkBuildDhcpDaemonCommandLine(virNetworkDriverStatePtr driver,
|
|||||||
network->dnsmasqPid = -1;
|
network->dnsmasqPid = -1;
|
||||||
|
|
||||||
if (networkDnsmasqConfContents(network, pidfile, &configstr,
|
if (networkDnsmasqConfContents(network, pidfile, &configstr,
|
||||||
dctx, driver->dnsmasqCaps) < 0)
|
dctx, dnsmasq_caps) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
if (!configstr)
|
if (!configstr)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -1316,7 +1340,7 @@ networkBuildDhcpDaemonCommandLine(virNetworkDriverStatePtr driver,
|
|||||||
LIBEXECDIR)))
|
LIBEXECDIR)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
cmd = virCommandNew(dnsmasqCapsGetBinaryPath(driver->dnsmasqCaps));
|
cmd = virCommandNew(dnsmasqCapsGetBinaryPath(dnsmasq_caps));
|
||||||
virCommandAddArgFormat(cmd, "--conf-file=%s", configfile);
|
virCommandAddArgFormat(cmd, "--conf-file=%s", configfile);
|
||||||
/* Libvirt gains full control of leases database */
|
/* Libvirt gains full control of leases database */
|
||||||
virCommandAddArgFormat(cmd, "--leasefile-ro");
|
virCommandAddArgFormat(cmd, "--leasefile-ro");
|
||||||
@ -1326,6 +1350,7 @@ networkBuildDhcpDaemonCommandLine(virNetworkDriverStatePtr driver,
|
|||||||
*cmdout = cmd;
|
*cmdout = cmd;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
|
virObjectUnref(dnsmasq_caps);
|
||||||
VIR_FREE(configfile);
|
VIR_FREE(configfile);
|
||||||
VIR_FREE(configstr);
|
VIR_FREE(configstr);
|
||||||
VIR_FREE(leaseshelper_path);
|
VIR_FREE(leaseshelper_path);
|
||||||
@ -1369,7 +1394,7 @@ networkStartDhcpDaemon(virNetworkDriverStatePtr driver,
|
|||||||
if (dctx == NULL)
|
if (dctx == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (dnsmasqCapsRefresh(&driver->dnsmasqCaps, NULL) < 0)
|
if (networkDnsmasqCapsRefresh(driver) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
ret = networkBuildDhcpDaemonCommandLine(driver, network, &cmd, pidfile, dctx);
|
ret = networkBuildDhcpDaemonCommandLine(driver, network, &cmd, pidfile, dctx);
|
||||||
@ -1623,6 +1648,7 @@ static int
|
|||||||
networkStartRadvd(virNetworkDriverStatePtr driver,
|
networkStartRadvd(virNetworkDriverStatePtr driver,
|
||||||
virNetworkObjPtr network)
|
virNetworkObjPtr network)
|
||||||
{
|
{
|
||||||
|
dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
|
||||||
char *pidfile = NULL;
|
char *pidfile = NULL;
|
||||||
char *radvdpidbase = NULL;
|
char *radvdpidbase = NULL;
|
||||||
char *configfile = NULL;
|
char *configfile = NULL;
|
||||||
@ -1632,7 +1658,7 @@ networkStartRadvd(virNetworkDriverStatePtr driver,
|
|||||||
network->radvdPid = -1;
|
network->radvdPid = -1;
|
||||||
|
|
||||||
/* Is dnsmasq handling RA? */
|
/* Is dnsmasq handling RA? */
|
||||||
if (DNSMASQ_RA_SUPPORT(driver->dnsmasqCaps)) {
|
if (DNSMASQ_RA_SUPPORT(dnsmasq_caps)) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -1698,6 +1724,7 @@ networkStartRadvd(virNetworkDriverStatePtr driver,
|
|||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
|
virObjectUnref(dnsmasq_caps);
|
||||||
virCommandFree(cmd);
|
virCommandFree(cmd);
|
||||||
VIR_FREE(configfile);
|
VIR_FREE(configfile);
|
||||||
VIR_FREE(radvdpidbase);
|
VIR_FREE(radvdpidbase);
|
||||||
@ -1709,10 +1736,12 @@ static int
|
|||||||
networkRefreshRadvd(virNetworkDriverStatePtr driver,
|
networkRefreshRadvd(virNetworkDriverStatePtr driver,
|
||||||
virNetworkObjPtr network)
|
virNetworkObjPtr network)
|
||||||
{
|
{
|
||||||
|
dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
|
||||||
char *radvdpidbase;
|
char *radvdpidbase;
|
||||||
|
|
||||||
/* Is dnsmasq handling RA? */
|
/* Is dnsmasq handling RA? */
|
||||||
if (DNSMASQ_RA_SUPPORT(driver->dnsmasqCaps)) {
|
if (DNSMASQ_RA_SUPPORT(dnsmasq_caps)) {
|
||||||
|
virObjectUnref(dnsmasq_caps);
|
||||||
if (network->radvdPid <= 0)
|
if (network->radvdPid <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
/* radvd should not be running but in case it is */
|
/* radvd should not be running but in case it is */
|
||||||
@ -1726,6 +1755,7 @@ networkRefreshRadvd(virNetworkDriverStatePtr driver,
|
|||||||
network->radvdPid = -1;
|
network->radvdPid = -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
virObjectUnref(dnsmasq_caps);
|
||||||
|
|
||||||
/* if there's no running radvd, just start it */
|
/* if there's no running radvd, just start it */
|
||||||
if (network->radvdPid <= 0 || (kill(network->radvdPid, 0) < 0))
|
if (network->radvdPid <= 0 || (kill(network->radvdPid, 0) < 0))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user