nwfilter_driver: Use automatic mutex management

Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Tim Wiederhake 2022-03-08 10:54:23 +01:00
parent 183804c043
commit d115fe8d11

View File

@ -57,15 +57,6 @@ static int nwfilterStateReload(void);
static virMutex driverMutex = VIR_MUTEX_INITIALIZER; static virMutex driverMutex = VIR_MUTEX_INITIALIZER;
static void nwfilterDriverLock(void)
{
virMutexLock(&driverMutex);
}
static void nwfilterDriverUnlock(void)
{
virMutexUnlock(&driverMutex);
}
#ifdef WITH_FIREWALLD #ifdef WITH_FIREWALLD
static void static void
@ -204,6 +195,7 @@ nwfilterStateInitialize(bool privileged,
virStateInhibitCallback callback G_GNUC_UNUSED, virStateInhibitCallback callback G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED) void *opaque G_GNUC_UNUSED)
{ {
VIR_LOCK_GUARD lock = virLockGuardLock(&driverMutex);
GDBusConnection *sysbus = NULL; GDBusConnection *sysbus = NULL;
if (root != NULL) { if (root != NULL) {
@ -230,8 +222,6 @@ nwfilterStateInitialize(bool privileged,
if (!privileged) if (!privileged)
return VIR_DRV_STATE_INIT_SKIPPED; return VIR_DRV_STATE_INIT_SKIPPED;
nwfilterDriverLock();
driver->stateDir = g_strdup(RUNSTATEDIR "/libvirt/nwfilter"); driver->stateDir = g_strdup(RUNSTATEDIR "/libvirt/nwfilter");
if (g_mkdir_with_parents(driver->stateDir, S_IRWXU) < 0) { if (g_mkdir_with_parents(driver->stateDir, S_IRWXU) < 0) {
@ -290,13 +280,10 @@ nwfilterStateInitialize(bool privileged,
if (virNWFilterBuildAll(driver, false) < 0) if (virNWFilterBuildAll(driver, false) < 0)
goto error; goto error;
nwfilterDriverUnlock();
return VIR_DRV_STATE_INIT_COMPLETE; return VIR_DRV_STATE_INIT_COMPLETE;
error: error:
nwfilterDriverUnlock(); nwfilterStateCleanupLocked();
nwfilterStateCleanup();
return VIR_DRV_STATE_INIT_ERROR; return VIR_DRV_STATE_INIT_ERROR;
@ -335,16 +322,15 @@ nwfilterStateReload(void)
/* shut down all threads -- they will be restarted if necessary */ /* shut down all threads -- they will be restarted if necessary */
virNWFilterLearnThreadsTerminate(true); virNWFilterLearnThreadsTerminate(true);
nwfilterDriverLock(); VIR_WITH_MUTEX_LOCK_GUARD(&driverMutex) {
virNWFilterWriteLockFilterUpdates(); virNWFilterWriteLockFilterUpdates();
virNWFilterObjListLoadAllConfigs(driver->nwfilters, driver->configDir); virNWFilterObjListLoadAllConfigs(driver->nwfilters, driver->configDir);
virNWFilterUnlockFilterUpdates(); virNWFilterUnlockFilterUpdates();
virNWFilterBuildAll(driver, false); virNWFilterBuildAll(driver, false);
}
nwfilterDriverUnlock();
return 0; return 0;
} }
@ -422,13 +408,13 @@ static virNWFilterPtr
nwfilterLookupByUUID(virConnectPtr conn, nwfilterLookupByUUID(virConnectPtr conn,
const unsigned char *uuid) const unsigned char *uuid)
{ {
virNWFilterObj *obj; virNWFilterObj *obj = NULL;
virNWFilterDef *def; virNWFilterDef *def;
virNWFilterPtr nwfilter = NULL; virNWFilterPtr nwfilter = NULL;
nwfilterDriverLock(); VIR_WITH_MUTEX_LOCK_GUARD(&driverMutex) {
obj = nwfilterObjFromNWFilter(uuid); obj = nwfilterObjFromNWFilter(uuid);
nwfilterDriverUnlock(); }
if (!obj) if (!obj)
return NULL; return NULL;
@ -449,13 +435,13 @@ static virNWFilterPtr
nwfilterLookupByName(virConnectPtr conn, nwfilterLookupByName(virConnectPtr conn,
const char *name) const char *name)
{ {
virNWFilterObj *obj; virNWFilterObj *obj = NULL;
virNWFilterDef *def; virNWFilterDef *def;
virNWFilterPtr nwfilter = NULL; virNWFilterPtr nwfilter = NULL;
nwfilterDriverLock(); VIR_WITH_MUTEX_LOCK_GUARD(&driverMutex) {
obj = virNWFilterObjListFindByName(driver->nwfilters, name); obj = virNWFilterObjListFindByName(driver->nwfilters, name);
nwfilterDriverUnlock(); }
if (!obj) { if (!obj) {
virReportError(VIR_ERR_NO_NWFILTER, virReportError(VIR_ERR_NO_NWFILTER,
@ -478,14 +464,15 @@ nwfilterLookupByName(virConnectPtr conn,
static int static int
nwfilterConnectNumOfNWFilters(virConnectPtr conn) nwfilterConnectNumOfNWFilters(virConnectPtr conn)
{ {
int ret; int ret = -1;
if (virConnectNumOfNWFiltersEnsureACL(conn) < 0) if (virConnectNumOfNWFiltersEnsureACL(conn) < 0)
return -1; return -1;
nwfilterDriverLock(); VIR_WITH_MUTEX_LOCK_GUARD(&driverMutex) {
ret = virNWFilterObjListNumOfNWFilters(driver->nwfilters, conn, ret = virNWFilterObjListNumOfNWFilters(driver->nwfilters, conn,
virConnectNumOfNWFiltersCheckACL); virConnectNumOfNWFiltersCheckACL);
nwfilterDriverUnlock(); }
return ret; return ret;
} }
@ -495,16 +482,17 @@ nwfilterConnectListNWFilters(virConnectPtr conn,
char **const names, char **const names,
int maxnames) int maxnames)
{ {
int nnames; int nnames = -1;
if (virConnectListNWFiltersEnsureACL(conn) < 0) if (virConnectListNWFiltersEnsureACL(conn) < 0)
return -1; return -1;
nwfilterDriverLock(); VIR_WITH_MUTEX_LOCK_GUARD(&driverMutex) {
nnames = virNWFilterObjListGetNames(driver->nwfilters, conn, nnames = virNWFilterObjListGetNames(driver->nwfilters, conn,
virConnectListNWFiltersCheckACL, virConnectListNWFiltersCheckACL,
names, maxnames); names, maxnames);
nwfilterDriverUnlock(); }
return nnames; return nnames;
} }
@ -514,17 +502,17 @@ nwfilterConnectListAllNWFilters(virConnectPtr conn,
virNWFilterPtr **nwfilters, virNWFilterPtr **nwfilters,
unsigned int flags) unsigned int flags)
{ {
int ret; int ret = -1;
virCheckFlags(0, -1); virCheckFlags(0, -1);
if (virConnectListAllNWFiltersEnsureACL(conn) < 0) if (virConnectListAllNWFiltersEnsureACL(conn) < 0)
return -1; return -1;
nwfilterDriverLock(); VIR_WITH_MUTEX_LOCK_GUARD(&driverMutex) {
ret = virNWFilterObjListExport(conn, driver->nwfilters, nwfilters, ret = virNWFilterObjListExport(conn, driver->nwfilters, nwfilters,
virConnectListAllNWFiltersCheckACL); virConnectListAllNWFiltersCheckACL);
nwfilterDriverUnlock(); }
return ret; return ret;
} }
@ -535,6 +523,7 @@ nwfilterDefineXMLFlags(virConnectPtr conn,
const char *xml, const char *xml,
unsigned int flags) unsigned int flags)
{ {
VIR_LOCK_GUARD lock = virLockGuardLock(&driverMutex);
virNWFilterDef *def; virNWFilterDef *def;
virNWFilterObj *obj = NULL; virNWFilterObj *obj = NULL;
virNWFilterDef *objdef; virNWFilterDef *objdef;
@ -549,7 +538,6 @@ nwfilterDefineXMLFlags(virConnectPtr conn,
return NULL; return NULL;
} }
nwfilterDriverLock();
virNWFilterWriteLockFilterUpdates(); virNWFilterWriteLockFilterUpdates();
if (!(def = virNWFilterDefParseString(xml, flags))) if (!(def = virNWFilterDefParseString(xml, flags)))
@ -576,7 +564,6 @@ nwfilterDefineXMLFlags(virConnectPtr conn,
virNWFilterObjUnlock(obj); virNWFilterObjUnlock(obj);
virNWFilterUnlockFilterUpdates(); virNWFilterUnlockFilterUpdates();
nwfilterDriverUnlock();
return nwfilter; return nwfilter;
} }
@ -592,11 +579,11 @@ nwfilterDefineXML(virConnectPtr conn,
static int static int
nwfilterUndefine(virNWFilterPtr nwfilter) nwfilterUndefine(virNWFilterPtr nwfilter)
{ {
VIR_LOCK_GUARD lock = virLockGuardLock(&driverMutex);
virNWFilterObj *obj; virNWFilterObj *obj;
virNWFilterDef *def; virNWFilterDef *def;
int ret = -1; int ret = -1;
nwfilterDriverLock();
virNWFilterWriteLockFilterUpdates(); virNWFilterWriteLockFilterUpdates();
if (!(obj = nwfilterObjFromNWFilter(nwfilter->uuid))) if (!(obj = nwfilterObjFromNWFilter(nwfilter->uuid)))
@ -625,7 +612,6 @@ nwfilterUndefine(virNWFilterPtr nwfilter)
virNWFilterObjUnlock(obj); virNWFilterObjUnlock(obj);
virNWFilterUnlockFilterUpdates(); virNWFilterUnlockFilterUpdates();
nwfilterDriverUnlock();
return ret; return ret;
} }
@ -634,15 +620,15 @@ static char *
nwfilterGetXMLDesc(virNWFilterPtr nwfilter, nwfilterGetXMLDesc(virNWFilterPtr nwfilter,
unsigned int flags) unsigned int flags)
{ {
virNWFilterObj *obj; virNWFilterObj *obj = NULL;
virNWFilterDef *def; virNWFilterDef *def;
char *ret = NULL; char *ret = NULL;
virCheckFlags(0, NULL); virCheckFlags(0, NULL);
nwfilterDriverLock(); VIR_WITH_MUTEX_LOCK_GUARD(&driverMutex) {
obj = nwfilterObjFromNWFilter(nwfilter->uuid); obj = nwfilterObjFromNWFilter(nwfilter->uuid);
nwfilterDriverUnlock(); }
if (!obj) if (!obj)
return NULL; return NULL;