@@ -195,14 +195,13 @@ static inline int nf_hook_iterate(struct sk_buff *skb,
int ret;
entry = rcu_dereference(state->hook_entries);
- while (entry) {
+ for (; entry; entry = rcu_dereference(entry->next)) {
RCU_INIT_POINTER(state->hook_entries, entry);
repeat:
verdict = nf_hook_entry_hookfn(entry)(nf_hook_entry_priv(entry),
skb, state);
switch (verdict) {
case NF_ACCEPT:
- entry = rcu_dereference(entry->next);
break;
case NF_DROP:
kfree_skb(skb);
@@ -1008,10 +1008,10 @@ int br_nf_hook_thresh(unsigned int hook, struct net *net,
struct nf_hook_state state;
int ret;
- elem = rcu_dereference(net->nf.hooks[NFPROTO_BRIDGE][hook]);
-
- while (elem && (nf_hook_entry_priority(elem) <= NF_BR_PRI_BRNF))
- elem = rcu_dereference(elem->next);
+ for (elem = rcu_dereference(net->nf.hooks[NFPROTO_BRIDGE][hook]);
+ elem && (nf_hook_entry_priority(elem) <= NF_BR_PRI_BRNF);
+ elem = rcu_dereference(elem->next))
+ ;
if (!elem)
return okfn(net, sk, skb);
@@ -107,10 +107,9 @@ int nf_register_net_hook(struct net *net, const struct nf_hook_ops *reg)
mutex_lock(&nf_hook_mutex);
/* Find the spot in the list */
- while ((p = nf_entry_dereference(*pp)) != NULL) {
+ for (; (p = nf_entry_dereference(*pp)) != NULL; pp = &p->next) {
if (reg->priority < nf_hook_entry_priority(p))
break;
- pp = &p->next;
}
rcu_assign_pointer(entry->next, p);
rcu_assign_pointer(*pp, entry);
@@ -137,12 +136,11 @@ void nf_unregister_net_hook(struct net *net, const struct nf_hook_ops *reg)
return;
mutex_lock(&nf_hook_mutex);
- while ((p = nf_entry_dereference(*pp)) != NULL) {
+ for (; (p = nf_entry_dereference(*pp)) != NULL; pp = &p->next) {
if (nf_hook_entry_ops(p) == reg) {
rcu_assign_pointer(*pp, p->next);
break;
}
- pp = &p->next;
}
mutex_unlock(&nf_hook_mutex);
if (!p) {
@@ -183,7 +183,7 @@ static unsigned int nf_iterate(struct sk_buff *skb,
{
unsigned int verdict;
- while (*entryp) {
+ for (; *entryp; *entryp = rcu_dereference((*entryp)->next)) {
RCU_INIT_POINTER(state->hook_entries, *entryp);
repeat:
verdict = nf_hook_entry_hookfn(*entryp)
@@ -193,7 +193,6 @@ static unsigned int nf_iterate(struct sk_buff *skb,
return verdict;
goto repeat;
}
- *entryp = rcu_dereference((*entryp)->next);
}
return NF_ACCEPT;
}
This is to facilitate converting from a singly-linked list to an array of elements. Signed-off-by: Aaron Conole <aconole@bytheb.org> --- include/linux/netfilter.h | 3 +-- net/bridge/br_netfilter_hooks.c | 8 ++++---- net/netfilter/core.c | 6 ++---- net/netfilter/nf_queue.c | 3 +-- 4 files changed, 8 insertions(+), 12 deletions(-)