Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+17 −7
Original line number Diff line number Diff line
@@ -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
	if (he != NULL &&
	    !nft_hash_deactivate_one(net, set, he))
		he = NULL;
	}

	rcu_read_unlock();

	return he;
+10 −1
Original line number Diff line number Diff line
@@ -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;
		}
	}