* all its subfilters in a depth-first traversal of the tree of referenced
* filters. The name of the interface to which the rules belong must be
* provided. Apply the values of variables as needed.
+ *
+ * Call this function while holding the NWFilter filter update lock
*/
static int
virNWFilterInstantiate(virConnectPtr conn,
void **ptrs = NULL;
int instantiate = 1;
- virNWFilterLockFilterUpdates();
-
virNWFilterHashTablePtr missing_vars = virNWFilterHashTableCreate(0);
if (!missing_vars) {
virReportOOMError();
err_exit:
- virNWFilterUnlockFilterUpdates();
-
for (j = 0; j < nEntries; j++)
virNWFilterRuleInstFree(insts[j]);
}
+/*
+ * Call this function while holding the NWFilter filter update lock
+ */
static int
__virNWFilterInstantiateFilter(virConnectPtr conn,
bool teardownOld,
? net->data.direct.linkdev
: NULL;
int ifindex;
+ int rc;
if (ifaceGetIndex(true, net->ifname, &ifindex))
return 1;
- return __virNWFilterInstantiateFilter(conn,
- teardownOld,
- net->ifname,
- ifindex,
- linkdev,
- net->type,
- net->mac,
- net->filter,
- net->filterparams,
- useNewFilter,
- conn->nwfilterPrivateData,
- false,
- foundNewFilter);
+ virNWFilterLockFilterUpdates();
+
+ rc = __virNWFilterInstantiateFilter(conn,
+ teardownOld,
+ net->ifname,
+ ifindex,
+ linkdev,
+ net->type,
+ net->mac,
+ net->filter,
+ net->filterparams,
+ useNewFilter,
+ conn->nwfilterPrivateData,
+ false,
+ foundNewFilter);
+
+ virNWFilterUnlockFilterUpdates();
+
+ return rc;
}
int rc;
bool foundNewFilter = false;
+ virNWFilterLockFilterUpdates();
+
rc = __virNWFilterInstantiateFilter(conn,
1,
ifname,
_virNWFilterTeardownFilter(ifname);
}
}
+
+ virNWFilterUnlockFilterUpdates();
+
return rc;
}