aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/ipmr.c
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2010-10-01 12:14:55 -0400
committerDavid S. Miller <davem@davemloft.net>2010-10-04 00:50:52 -0400
commit55747a0a73ea74a25fcebb0731e8d3f13fe8c09d (patch)
treead041d4c50fab573499e49b48f73e9a198bd7164 /net/ipv4/ipmr.c
parentddcb4541e917780ef7ccc68dd8df18ca0bc055d0 (diff)
ipmr: __pim_rcv() is called under rcu_read_lock
No need to get a reference on reg_dev and release it, we are in a rcu_read_lock() protected section. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/ipmr.c')
-rw-r--r--net/ipv4/ipmr.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index 10b24c02deb0..1a92ebd85196 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -1805,6 +1805,7 @@ dont_forward:
1805} 1805}
1806 1806
1807#ifdef CONFIG_IP_PIMSM 1807#ifdef CONFIG_IP_PIMSM
1808/* called with rcu_read_lock() */
1808static int __pim_rcv(struct mr_table *mrt, struct sk_buff *skb, 1809static int __pim_rcv(struct mr_table *mrt, struct sk_buff *skb,
1809 unsigned int pimlen) 1810 unsigned int pimlen)
1810{ 1811{
@@ -1826,26 +1827,23 @@ static int __pim_rcv(struct mr_table *mrt, struct sk_buff *skb,
1826 read_lock(&mrt_lock); 1827 read_lock(&mrt_lock);
1827 if (mrt->mroute_reg_vif_num >= 0) 1828 if (mrt->mroute_reg_vif_num >= 0)
1828 reg_dev = mrt->vif_table[mrt->mroute_reg_vif_num].dev; 1829 reg_dev = mrt->vif_table[mrt->mroute_reg_vif_num].dev;
1829 if (reg_dev)
1830 dev_hold(reg_dev);
1831 read_unlock(&mrt_lock); 1830 read_unlock(&mrt_lock);
1832 1831
1833 if (reg_dev == NULL) 1832 if (reg_dev == NULL)
1834 return 1; 1833 return 1;
1835 1834
1836 skb->mac_header = skb->network_header; 1835 skb->mac_header = skb->network_header;
1837 skb_pull(skb, (u8*)encap - skb->data); 1836 skb_pull(skb, (u8 *)encap - skb->data);
1838 skb_reset_network_header(skb); 1837 skb_reset_network_header(skb);
1839 skb->protocol = htons(ETH_P_IP); 1838 skb->protocol = htons(ETH_P_IP);
1840 skb->ip_summed = 0; 1839 skb->ip_summed = CHECKSUM_NONE;
1841 skb->pkt_type = PACKET_HOST; 1840 skb->pkt_type = PACKET_HOST;
1842 1841
1843 skb_tunnel_rx(skb, reg_dev); 1842 skb_tunnel_rx(skb, reg_dev);
1844 1843
1845 netif_rx(skb); 1844 netif_rx(skb);
1846 dev_put(reg_dev);
1847 1845
1848 return 0; 1846 return NET_RX_SUCCESS;
1849} 1847}
1850#endif 1848#endif
1851 1849