aboutsummaryrefslogtreecommitdiffstats
path: root/net/netfilter
diff options
context:
space:
mode:
authorJulian Anastasov <ja@ssi.bg>2013-04-17 16:50:45 -0400
committerSimon Horman <horms@verge.net.au>2013-04-22 22:43:05 -0400
commitd717bb2a9815f21ad962574daff821379f485ee3 (patch)
tree9ba8124685d345bb08215d9172c860ac0d347aac /net/netfilter
parent3e3251b3f289528732edab386ddf73ac428359b7 (diff)
ipvs: properly dereference dest_dst in ip_vs_forget_dev
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>
Diffstat (limited to 'net/netfilter')
-rw-r--r--net/netfilter/ipvs/ip_vs_ctl.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
index 9e4074c26dc2..5a6544475b3c 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -1460,8 +1460,11 @@ void ip_vs_service_net_cleanup(struct net *net)
1460static inline void 1460static inline void
1461ip_vs_forget_dev(struct ip_vs_dest *dest, struct net_device *dev) 1461ip_vs_forget_dev(struct ip_vs_dest *dest, struct net_device *dev)
1462{ 1462{
1463 struct ip_vs_dest_dst *dest_dst;
1464
1463 spin_lock_bh(&dest->dst_lock); 1465 spin_lock_bh(&dest->dst_lock);
1464 if (dest->dest_dst && dest->dest_dst->dst_cache->dev == dev) { 1466 dest_dst = rcu_dereference_protected(dest->dest_dst, 1);
1467 if (dest_dst && dest_dst->dst_cache->dev == dev) {
1465 IP_VS_DBG_BUF(3, "Reset dev:%s dest %s:%u ,dest->refcnt=%d\n", 1468 IP_VS_DBG_BUF(3, "Reset dev:%s dest %s:%u ,dest->refcnt=%d\n",
1466 dev->name, 1469 dev->name,
1467 IP_VS_DBG_ADDR(dest->af, &dest->addr), 1470 IP_VS_DBG_ADDR(dest->af, &dest->addr),