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

Commit 753ea8e9 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

net: ipv6: sit: fix rcu annotations



Fix minor __rcu annotations and remove sparse warnings

Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2ffa007e
Loading
Loading
Loading
Loading
+13 −10
Original line number Original line Diff line number Diff line
@@ -412,7 +412,7 @@ static void prl_list_destroy_rcu(struct rcu_head *head)


	p = container_of(head, struct ip_tunnel_prl_entry, rcu_head);
	p = container_of(head, struct ip_tunnel_prl_entry, rcu_head);
	do {
	do {
		n = p->next;
		n = rcu_dereference_protected(p->next, 1);
		kfree(p);
		kfree(p);
		p = n;
		p = n;
	} while (p);
	} while (p);
@@ -421,15 +421,17 @@ static void prl_list_destroy_rcu(struct rcu_head *head)
static int
static int
ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
{
{
	struct ip_tunnel_prl_entry *x, **p;
	struct ip_tunnel_prl_entry *x;
	struct ip_tunnel_prl_entry __rcu **p;
	int err = 0;
	int err = 0;


	ASSERT_RTNL();
	ASSERT_RTNL();


	if (a && a->addr != htonl(INADDR_ANY)) {
	if (a && a->addr != htonl(INADDR_ANY)) {
		for (p = &t->prl; *p; p = &(*p)->next) {
		for (p = &t->prl;
			if ((*p)->addr == a->addr) {
		     (x = rtnl_dereference(*p)) != NULL;
				x = *p;
		     p = &x->next) {
			if (x->addr == a->addr) {
				*p = x->next;
				*p = x->next;
				call_rcu(&x->rcu_head, prl_entry_destroy_rcu);
				call_rcu(&x->rcu_head, prl_entry_destroy_rcu);
				t->prl_count--;
				t->prl_count--;
@@ -438,9 +440,9 @@ ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
		}
		}
		err = -ENXIO;
		err = -ENXIO;
	} else {
	} else {
		if (t->prl) {
		x = rtnl_dereference(t->prl);
		if (x) {
			t->prl_count = 0;
			t->prl_count = 0;
			x = t->prl;
			call_rcu(&x->rcu_head, prl_list_destroy_rcu);
			call_rcu(&x->rcu_head, prl_list_destroy_rcu);
			t->prl = NULL;
			t->prl = NULL;
		}
		}
@@ -1179,7 +1181,7 @@ static int __net_init ipip6_fb_tunnel_init(struct net_device *dev)
	if (!dev->tstats)
	if (!dev->tstats)
		return -ENOMEM;
		return -ENOMEM;
	dev_hold(dev);
	dev_hold(dev);
	sitn->tunnels_wc[0]	= tunnel;
	rcu_assign_pointer(sitn->tunnels_wc[0], tunnel);
	return 0;
	return 0;
}
}


@@ -1196,11 +1198,12 @@ static void __net_exit sit_destroy_tunnels(struct sit_net *sitn, struct list_hea
	for (prio = 1; prio < 4; prio++) {
	for (prio = 1; prio < 4; prio++) {
		int h;
		int h;
		for (h = 0; h < HASH_SIZE; h++) {
		for (h = 0; h < HASH_SIZE; h++) {
			struct ip_tunnel *t = sitn->tunnels[prio][h];
			struct ip_tunnel *t;


			t = rtnl_dereference(sitn->tunnels[prio][h]);
			while (t != NULL) {
			while (t != NULL) {
				unregister_netdevice_queue(t->dev, head);
				unregister_netdevice_queue(t->dev, head);
				t = t->next;
				t = rtnl_dereference(t->next);
			}
			}
		}
		}
	}
	}