提交 8fa78dd4 编写于 作者: S Stefan Berger 提交者: Stefan Berger

nwfilter: Force instantiation of filters upon driver reload

Introduce a function that rebuilds all running VMs' filters. Call
this function when reloading the nwfilter driver.

This addresses a problem introduced by the 2nd patch that typically
causes no filters to be reinstantiate anymore upon driver reload
since their XML has not changed. Yet the current behavior is that
upon a SIGHUP all filters get reinstantiated.
上级 65c27e29
...@@ -2723,6 +2723,29 @@ virNWFilterCallbackDriversUnlock(void) ...@@ -2723,6 +2723,29 @@ virNWFilterCallbackDriversUnlock(void)
static virHashIterator virNWFilterDomainFWUpdateCB; static virHashIterator virNWFilterDomainFWUpdateCB;
/**
* virNWFilterInstFiltersOnAllVMs:
* Apply all filters on all running VMs. Don't terminate in case of an
* error. This should be called upon reloading of the driver.
*/
int
virNWFilterInstFiltersOnAllVMs(virConnectPtr conn)
{
int i;
struct domUpdateCBStruct cb = {
.conn = conn,
.err = 0, /* ignored here */
.step = STEP_APPLY_CURRENT,
.skipInterfaces = NULL, /* not needed */
};
for (i = 0; i < nCallbackDriver; i++)
callbackDrvArray[i]->vmFilterRebuild(conn,
virNWFilterDomainFWUpdateCB,
&cb);
return 0;
}
static int static int
virNWFilterTriggerVMFilterRebuild(virConnectPtr conn) virNWFilterTriggerVMFilterRebuild(virConnectPtr conn)
......
...@@ -577,6 +577,7 @@ enum UpdateStep { ...@@ -577,6 +577,7 @@ enum UpdateStep {
STEP_APPLY_NEW, STEP_APPLY_NEW,
STEP_TEAR_NEW, STEP_TEAR_NEW,
STEP_TEAR_OLD, STEP_TEAR_OLD,
STEP_APPLY_CURRENT,
}; };
struct domUpdateCBStruct { struct domUpdateCBStruct {
...@@ -722,6 +723,8 @@ void virNWFilterUnlockFilterUpdates(void); ...@@ -722,6 +723,8 @@ void virNWFilterUnlockFilterUpdates(void);
int virNWFilterConfLayerInit(virHashIterator domUpdateCB); int virNWFilterConfLayerInit(virHashIterator domUpdateCB);
void virNWFilterConfLayerShutdown(void); void virNWFilterConfLayerShutdown(void);
int virNWFilterInstFiltersOnAllVMs(virConnectPtr conn);
# define virNWFilterReportError(code, fmt...) \ # define virNWFilterReportError(code, fmt...) \
virReportErrorHelper(VIR_FROM_NWFILTER, code, __FILE__, \ virReportErrorHelper(VIR_FROM_NWFILTER, code, __FILE__, \
__FUNCTION__, __LINE__, fmt) __FUNCTION__, __LINE__, fmt)
......
...@@ -811,6 +811,7 @@ virNWFilterConfLayerShutdown; ...@@ -811,6 +811,7 @@ virNWFilterConfLayerShutdown;
virNWFilterDefFormat; virNWFilterDefFormat;
virNWFilterDefFree; virNWFilterDefFree;
virNWFilterDefParseString; virNWFilterDefParseString;
virNWFilterInstFiltersOnAllVMs;
virNWFilterJumpTargetTypeToString; virNWFilterJumpTargetTypeToString;
virNWFilterLoadAllConfigs; virNWFilterLoadAllConfigs;
virNWFilterLockFilterUpdates; virNWFilterLockFilterUpdates;
......
...@@ -162,6 +162,8 @@ nwfilterDriverReload(void) { ...@@ -162,6 +162,8 @@ nwfilterDriverReload(void) {
virNWFilterCallbackDriversUnlock(); virNWFilterCallbackDriversUnlock();
nwfilterDriverUnlock(driverState); nwfilterDriverUnlock(driverState);
virNWFilterInstFiltersOnAllVMs(conn);
virConnectClose(conn); virConnectClose(conn);
} }
......
...@@ -1122,7 +1122,7 @@ virNWFilterDomainFWUpdateCB(void *payload, ...@@ -1122,7 +1122,7 @@ virNWFilterDomainFWUpdateCB(void *payload,
virDomainObjPtr obj = payload; virDomainObjPtr obj = payload;
virDomainDefPtr vm = obj->def; virDomainDefPtr vm = obj->def;
struct domUpdateCBStruct *cb = data; struct domUpdateCBStruct *cb = data;
int i; int i, err;
bool skipIface; bool skipIface;
virDomainObjLock(obj); virDomainObjLock(obj);
...@@ -1156,6 +1156,16 @@ virNWFilterDomainFWUpdateCB(void *payload, ...@@ -1156,6 +1156,16 @@ virNWFilterDomainFWUpdateCB(void *payload,
cb->err = virNWFilterTearOldFilter(net); cb->err = virNWFilterTearOldFilter(net);
} }
break; break;
case STEP_APPLY_CURRENT:
err = virNWFilterInstantiateFilter(cb->conn,
vm->uuid,
net);
if (err)
virNWFilterReportError(VIR_ERR_INTERNAL_ERROR,
_("Failure while applying current filter on "
"VM %s"), vm->name);
break;
} }
if (cb->err) if (cb->err)
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册