Commit 37df5301 authored by Pablo Neira Ayuso's avatar Pablo Neira Ayuso

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: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 1a37ef76
...@@ -167,6 +167,19 @@ static void nft_hash_activate(const struct net *net, const struct nft_set *set, ...@@ -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); 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, static void *nft_hash_deactivate(const struct net *net,
const struct nft_set *set, const struct nft_set *set,
const struct nft_set_elem *elem) const struct nft_set_elem *elem)
...@@ -181,13 +194,10 @@ static void *nft_hash_deactivate(const struct net *net, ...@@ -181,13 +194,10 @@ static void *nft_hash_deactivate(const struct net *net,
rcu_read_lock(); rcu_read_lock();
he = rhashtable_lookup_fast(&priv->ht, &arg, nft_hash_params); he = rhashtable_lookup_fast(&priv->ht, &arg, nft_hash_params);
if (he != NULL) { if (he != NULL &&
if (!nft_set_elem_mark_busy(&he->ext) || !nft_hash_deactivate_one(net, set, he))
!nft_is_active(net, &he->ext))
nft_set_elem_change_active(net, set, &he->ext);
else
he = NULL; he = NULL;
}
rcu_read_unlock(); rcu_read_unlock();
return he; return he;
......
...@@ -171,6 +171,15 @@ static void nft_rbtree_activate(const struct net *net, ...@@ -171,6 +171,15 @@ static void nft_rbtree_activate(const struct net *net,
nft_set_elem_change_active(net, set, &rbe->ext); 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, static void *nft_rbtree_deactivate(const struct net *net,
const struct nft_set *set, const struct nft_set *set,
const struct nft_set_elem *elem) const struct nft_set_elem *elem)
...@@ -204,7 +213,7 @@ static void *nft_rbtree_deactivate(const struct net *net, ...@@ -204,7 +213,7 @@ static void *nft_rbtree_deactivate(const struct net *net,
parent = parent->rb_right; parent = parent->rb_right;
continue; continue;
} }
nft_set_elem_change_active(net, set, &rbe->ext); nft_rbtree_deactivate_one(net, set, rbe);
return rbe; return rbe;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment