pfsync: fix incorrect unlock during destroy
During pfsync_clone_destroy() we clean up pending packets. This may involve calling pfsync_undefer() or callout_drain(). We may not hold the bucket lock during callout_drain(), but must hold it during pfsync_undefer(). We incorrectly always released the lock, leading to assertion failures during cleanup if there were pending deferred packets. MFC after: 1 week Sponsored by: Orange Business Services
This commit is contained in:
@@ -466,13 +466,13 @@ pfsync_clone_destroy(struct ifnet *ifp)
|
|||||||
TAILQ_FIRST(&b->b_deferrals);
|
TAILQ_FIRST(&b->b_deferrals);
|
||||||
|
|
||||||
ret = callout_stop(&pd->pd_tmo);
|
ret = callout_stop(&pd->pd_tmo);
|
||||||
PFSYNC_BUCKET_UNLOCK(b);
|
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
pfsync_undefer(pd, 1);
|
pfsync_undefer(pd, 1);
|
||||||
} else {
|
} else {
|
||||||
|
PFSYNC_BUCKET_UNLOCK(b);
|
||||||
callout_drain(&pd->pd_tmo);
|
callout_drain(&pd->pd_tmo);
|
||||||
|
PFSYNC_BUCKET_LOCK(b);
|
||||||
}
|
}
|
||||||
PFSYNC_BUCKET_LOCK(b);
|
|
||||||
}
|
}
|
||||||
MPASS(b->b_deferred == 0);
|
MPASS(b->b_deferred == 0);
|
||||||
MPASS(TAILQ_EMPTY(&b->b_deferrals));
|
MPASS(TAILQ_EMPTY(&b->b_deferrals));
|
||||||
|
|||||||
Reference in New Issue
Block a user