ipvs: properly dereference dest_dst in ip_vs_forget_dev
authorJulian Anastasov <ja@ssi.bg>
Wed, 17 Apr 2013 20:50:45 +0000 (23:50 +0300)
committerSimon Horman <horms@verge.net.au>
Tue, 23 Apr 2013 02:43:05 +0000 (11:43 +0900)
Use rcu_dereference_protected to resolve
sparse warning, found by kbuild test robot:

net/netfilter/ipvs/ip_vs_ctl.c:1464:35: warning: dereference of
noderef expression

Problem from commit 026ace060dfe29
("ipvs: optimize dst usage for real server")

Signed-off-by: Julian Anastasov <ja@ssi.bg>
Signed-off-by: Simon Horman <horms@verge.net.au>
net/netfilter/ipvs/ip_vs_ctl.c

index 9e4074c26dc29c8abc6439ea6baf3a219968d91c..5a6544475b3c81297b4209303d9bec8f7ae10cf2 100644 (file)
@@ -1460,8 +1460,11 @@ void ip_vs_service_net_cleanup(struct net *net)
 static inline void
 ip_vs_forget_dev(struct ip_vs_dest *dest, struct net_device *dev)
 {
+       struct ip_vs_dest_dst *dest_dst;
+
        spin_lock_bh(&dest->dst_lock);
-       if (dest->dest_dst && dest->dest_dst->dst_cache->dev == dev) {
+       dest_dst = rcu_dereference_protected(dest->dest_dst, 1);
+       if (dest_dst && dest_dst->dst_cache->dev == dev) {
                IP_VS_DBG_BUF(3, "Reset dev:%s dest %s:%u ,dest->refcnt=%d\n",
                              dev->name,
                              IP_VS_DBG_ADDR(dest->af, &dest->addr),