Skip to content

Commit 37df530

Browse files
committed
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>
1 parent 1a37ef7 commit 37df530

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

net/netfilter/nft_set_hash.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,19 @@ static void nft_hash_activate(const struct net *net, const struct nft_set *set,
167167
nft_set_elem_clear_busy(&he->ext);
168168
}
169169

170+
static bool nft_hash_deactivate_one(const struct net *net,
171+
const struct nft_set *set, void *priv)
172+
{
173+
struct nft_hash_elem *he = priv;
174+
175+
if (!nft_set_elem_mark_busy(&he->ext) ||
176+
!nft_is_active(net, &he->ext)) {
177+
nft_set_elem_change_active(net, set, &he->ext);
178+
return true;
179+
}
180+
return false;
181+
}
182+
170183
static void *nft_hash_deactivate(const struct net *net,
171184
const struct nft_set *set,
172185
const struct nft_set_elem *elem)
@@ -181,13 +194,10 @@ static void *nft_hash_deactivate(const struct net *net,
181194

182195
rcu_read_lock();
183196
he = rhashtable_lookup_fast(&priv->ht, &arg, nft_hash_params);
184-
if (he != NULL) {
185-
if (!nft_set_elem_mark_busy(&he->ext) ||
186-
!nft_is_active(net, &he->ext))
187-
nft_set_elem_change_active(net, set, &he->ext);
188-
else
189-
he = NULL;
190-
}
197+
if (he != NULL &&
198+
!nft_hash_deactivate_one(net, set, he))
199+
he = NULL;
200+
191201
rcu_read_unlock();
192202

193203
return he;

net/netfilter/nft_set_rbtree.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,15 @@ static void nft_rbtree_activate(const struct net *net,
171171
nft_set_elem_change_active(net, set, &rbe->ext);
172172
}
173173

174+
static bool nft_rbtree_deactivate_one(const struct net *net,
175+
const struct nft_set *set, void *priv)
176+
{
177+
struct nft_rbtree_elem *rbe = priv;
178+
179+
nft_set_elem_change_active(net, set, &rbe->ext);
180+
return true;
181+
}
182+
174183
static void *nft_rbtree_deactivate(const struct net *net,
175184
const struct nft_set *set,
176185
const struct nft_set_elem *elem)
@@ -204,7 +213,7 @@ static void *nft_rbtree_deactivate(const struct net *net,
204213
parent = parent->rb_right;
205214
continue;
206215
}
207-
nft_set_elem_change_active(net, set, &rbe->ext);
216+
nft_rbtree_deactivate_one(net, set, rbe);
208217
return rbe;
209218
}
210219
}

0 commit comments

Comments
 (0)