diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-10-01 12:14:55 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-10-04 00:50:52 -0400 |
commit | 55747a0a73ea74a25fcebb0731e8d3f13fe8c09d (patch) | |
tree | ad041d4c50fab573499e49b48f73e9a198bd7164 /net/ipv4/ipmr.c | |
parent | ddcb4541e917780ef7ccc68dd8df18ca0bc055d0 (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.c | 10 |
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() */ | ||
1808 | static int __pim_rcv(struct mr_table *mrt, struct sk_buff *skb, | 1809 | static 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 | ||