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

Commit eb733162 authored by Eric Dumazet's avatar Eric Dumazet Committed by Patrick McHardy
Browse files

netfilter: add __rcu annotations



Use helpers to reduce number of sparse warnings
(CONFIG_SPARSE_RCU_POINTER=y)

Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
parent be9e9163
Loading
Loading
Loading
Loading
+11 −6
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@
#include <net/netfilter/nf_conntrack_l4proto.h>
#include <net/netfilter/nf_conntrack_l4proto.h>
#include <net/netfilter/nf_conntrack_expect.h>
#include <net/netfilter/nf_conntrack_expect.h>
#include <net/netfilter/nf_conntrack_acct.h>
#include <net/netfilter/nf_conntrack_acct.h>
#include <linux/rculist_nulls.h>


struct ct_iter_state {
struct ct_iter_state {
	struct seq_net_private p;
	struct seq_net_private p;
@@ -35,7 +36,8 @@ static struct hlist_nulls_node *ct_get_first(struct seq_file *seq)
	for (st->bucket = 0;
	for (st->bucket = 0;
	     st->bucket < net->ct.htable_size;
	     st->bucket < net->ct.htable_size;
	     st->bucket++) {
	     st->bucket++) {
		n = rcu_dereference(net->ct.hash[st->bucket].first);
		n = rcu_dereference(
			hlist_nulls_first_rcu(&net->ct.hash[st->bucket]));
		if (!is_a_nulls(n))
		if (!is_a_nulls(n))
			return n;
			return n;
	}
	}
@@ -48,13 +50,14 @@ static struct hlist_nulls_node *ct_get_next(struct seq_file *seq,
	struct net *net = seq_file_net(seq);
	struct net *net = seq_file_net(seq);
	struct ct_iter_state *st = seq->private;
	struct ct_iter_state *st = seq->private;


	head = rcu_dereference(head->next);
	head = rcu_dereference(hlist_nulls_next_rcu(head));
	while (is_a_nulls(head)) {
	while (is_a_nulls(head)) {
		if (likely(get_nulls_value(head) == st->bucket)) {
		if (likely(get_nulls_value(head) == st->bucket)) {
			if (++st->bucket >= net->ct.htable_size)
			if (++st->bucket >= net->ct.htable_size)
				return NULL;
				return NULL;
		}
		}
		head = rcu_dereference(net->ct.hash[st->bucket].first);
		head = rcu_dereference(
			hlist_nulls_first_rcu(&net->ct.hash[st->bucket]));
	}
	}
	return head;
	return head;
}
}
@@ -217,7 +220,8 @@ static struct hlist_node *ct_expect_get_first(struct seq_file *seq)
	struct hlist_node *n;
	struct hlist_node *n;


	for (st->bucket = 0; st->bucket < nf_ct_expect_hsize; st->bucket++) {
	for (st->bucket = 0; st->bucket < nf_ct_expect_hsize; st->bucket++) {
		n = rcu_dereference(net->ct.expect_hash[st->bucket].first);
		n = rcu_dereference(
			hlist_first_rcu(&net->ct.expect_hash[st->bucket]));
		if (n)
		if (n)
			return n;
			return n;
	}
	}
@@ -230,11 +234,12 @@ static struct hlist_node *ct_expect_get_next(struct seq_file *seq,
	struct net *net = seq_file_net(seq);
	struct net *net = seq_file_net(seq);
	struct ct_expect_iter_state *st = seq->private;
	struct ct_expect_iter_state *st = seq->private;


	head = rcu_dereference(head->next);
	head = rcu_dereference(hlist_next_rcu(head));
	while (head == NULL) {
	while (head == NULL) {
		if (++st->bucket >= nf_ct_expect_hsize)
		if (++st->bucket >= nf_ct_expect_hsize)
			return NULL;
			return NULL;
		head = rcu_dereference(net->ct.expect_hash[st->bucket].first);
		head = rcu_dereference(
			hlist_first_rcu(&net->ct.expect_hash[st->bucket]));
	}
	}
	return head;
	return head;
}
}
+4 −1
Original line number Original line Diff line number Diff line
@@ -502,7 +502,10 @@ int nf_nat_protocol_register(const struct nf_nat_protocol *proto)
	int ret = 0;
	int ret = 0;


	spin_lock_bh(&nf_nat_lock);
	spin_lock_bh(&nf_nat_lock);
	if (nf_nat_protos[proto->protonum] != &nf_nat_unknown_protocol) {
	if (rcu_dereference_protected(
			nf_nat_protos[proto->protonum],
			lockdep_is_held(&nf_nat_lock)
			) != &nf_nat_unknown_protocol) {
		ret = -EBUSY;
		ret = -EBUSY;
		goto out;
		goto out;
	}
	}