netfilter: nft_set: introduce nft_{hash, rbtree}_deactivate_one()
This new function allows us to deactivate one single element, this is required by the set flush command that comes in a follow up patch. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
1a37ef769d
commit
37df5301a3
@ -167,6 +167,19 @@ static void nft_hash_activate(const struct net *net, const struct nft_set *set,
|
||||
nft_set_elem_clear_busy(&he->ext);
|
||||
}
|
||||
|
||||
static bool nft_hash_deactivate_one(const struct net *net,
|
||||
const struct nft_set *set, void *priv)
|
||||
{
|
||||
struct nft_hash_elem *he = priv;
|
||||
|
||||
if (!nft_set_elem_mark_busy(&he->ext) ||
|
||||
!nft_is_active(net, &he->ext)) {
|
||||
nft_set_elem_change_active(net, set, &he->ext);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void *nft_hash_deactivate(const struct net *net,
|
||||
const struct nft_set *set,
|
||||
const struct nft_set_elem *elem)
|
||||
@ -181,13 +194,10 @@ static void *nft_hash_deactivate(const struct net *net,
|
||||
|
||||
rcu_read_lock();
|
||||
he = rhashtable_lookup_fast(&priv->ht, &arg, nft_hash_params);
|
||||
if (he != NULL) {
|
||||
if (!nft_set_elem_mark_busy(&he->ext) ||
|
||||
!nft_is_active(net, &he->ext))
|
||||
nft_set_elem_change_active(net, set, &he->ext);
|
||||
else
|
||||
he = NULL;
|
||||
}
|
||||
if (he != NULL &&
|
||||
!nft_hash_deactivate_one(net, set, he))
|
||||
he = NULL;
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
return he;
|
||||
|
@ -171,6 +171,15 @@ static void nft_rbtree_activate(const struct net *net,
|
||||
nft_set_elem_change_active(net, set, &rbe->ext);
|
||||
}
|
||||
|
||||
static bool nft_rbtree_deactivate_one(const struct net *net,
|
||||
const struct nft_set *set, void *priv)
|
||||
{
|
||||
struct nft_rbtree_elem *rbe = priv;
|
||||
|
||||
nft_set_elem_change_active(net, set, &rbe->ext);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void *nft_rbtree_deactivate(const struct net *net,
|
||||
const struct nft_set *set,
|
||||
const struct nft_set_elem *elem)
|
||||
@ -204,7 +213,7 @@ static void *nft_rbtree_deactivate(const struct net *net,
|
||||
parent = parent->rb_right;
|
||||
continue;
|
||||
}
|
||||
nft_set_elem_change_active(net, set, &rbe->ext);
|
||||
nft_rbtree_deactivate_one(net, set, rbe);
|
||||
return rbe;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user