diff options
| -rw-r--r-- | include/net/ipv6.h | 8 | ||||
| -rw-r--r-- | net/ipv6/ip6_flowlabel.c | 11 | 
2 files changed, 12 insertions, 7 deletions
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 64d12e77719..988c9f28f0f 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -217,7 +217,7 @@ struct ipv6_txoptions {  };  struct ip6_flowlabel { -	struct ip6_flowlabel	*next; +	struct ip6_flowlabel __rcu *next;  	__be32			label;  	atomic_t		users;  	struct in6_addr		dst; @@ -238,9 +238,9 @@ struct ip6_flowlabel {  #define IPV6_FLOWLABEL_MASK	cpu_to_be32(0x000FFFFF)  struct ipv6_fl_socklist { -	struct ipv6_fl_socklist	*next; -	struct ip6_flowlabel	*fl; -	struct rcu_head		rcu; +	struct ipv6_fl_socklist	__rcu	*next; +	struct ip6_flowlabel		*fl; +	struct rcu_head			rcu;  };  extern struct ip6_flowlabel	*fl6_sock_lookup(struct sock *sk, __be32 label); diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index b973ed3d06c..46e88433ec7 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c @@ -144,7 +144,9 @@ static void ip6_fl_gc(unsigned long dummy)  	spin_lock(&ip6_fl_lock);  	for (i=0; i<=FL_HASH_MASK; i++) { -		struct ip6_flowlabel *fl, **flp; +		struct ip6_flowlabel *fl; +		struct ip6_flowlabel __rcu **flp; +  		flp = &fl_ht[i];  		while ((fl = rcu_dereference_protected(*flp,  						       lockdep_is_held(&ip6_fl_lock))) != NULL) { @@ -179,7 +181,9 @@ static void __net_exit ip6_fl_purge(struct net *net)  	spin_lock(&ip6_fl_lock);  	for (i = 0; i <= FL_HASH_MASK; i++) { -		struct ip6_flowlabel *fl, **flp; +		struct ip6_flowlabel *fl; +		struct ip6_flowlabel __rcu **flp; +  		flp = &fl_ht[i];  		while ((fl = rcu_dereference_protected(*flp,  						       lockdep_is_held(&ip6_fl_lock))) != NULL) { @@ -506,7 +510,8 @@ int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen)  	struct ipv6_pinfo *np = inet6_sk(sk);  	struct in6_flowlabel_req freq;  	struct ipv6_fl_socklist *sfl1=NULL; -	struct ipv6_fl_socklist *sfl, **sflp; +	struct ipv6_fl_socklist *sfl; +	struct ipv6_fl_socklist __rcu **sflp;  	struct ip6_flowlabel *fl, *fl1 = NULL;  |