diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2009-11-02 06:21:06 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-11-02 06:42:41 -0500 |
commit | 536b2e92f1b7a86e177aeced097e4c051eeebe7d (patch) | |
tree | 4630684ca8119dfcfd6e0ba87666dd193b4b6615 /net/ipv6 | |
parent | 16ba5e8e7c01d2da87ff1d17e83545f164665b5c (diff) |
ipv6: no more dev_put() in datagram_send_ctl()
Avoids touching device refcount in datagram_send_ctl(), thanks to RCU
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/datagram.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 9f70452a69e7..e6f9cdf780fe 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -537,12 +537,17 @@ int datagram_send_ctl(struct net *net, | |||
537 | 537 | ||
538 | addr_type = __ipv6_addr_type(&src_info->ipi6_addr); | 538 | addr_type = __ipv6_addr_type(&src_info->ipi6_addr); |
539 | 539 | ||
540 | rcu_read_lock(); | ||
540 | if (fl->oif) { | 541 | if (fl->oif) { |
541 | dev = dev_get_by_index(net, fl->oif); | 542 | dev = dev_get_by_index_rcu(net, fl->oif); |
542 | if (!dev) | 543 | if (!dev) { |
544 | rcu_read_unlock(); | ||
543 | return -ENODEV; | 545 | return -ENODEV; |
544 | } else if (addr_type & IPV6_ADDR_LINKLOCAL) | 546 | } |
547 | } else if (addr_type & IPV6_ADDR_LINKLOCAL) { | ||
548 | rcu_read_unlock(); | ||
545 | return -EINVAL; | 549 | return -EINVAL; |
550 | } | ||
546 | 551 | ||
547 | if (addr_type != IPV6_ADDR_ANY) { | 552 | if (addr_type != IPV6_ADDR_ANY) { |
548 | int strict = __ipv6_addr_src_scope(addr_type) <= IPV6_ADDR_SCOPE_LINKLOCAL; | 553 | int strict = __ipv6_addr_src_scope(addr_type) <= IPV6_ADDR_SCOPE_LINKLOCAL; |
@@ -553,8 +558,7 @@ int datagram_send_ctl(struct net *net, | |||
553 | ipv6_addr_copy(&fl->fl6_src, &src_info->ipi6_addr); | 558 | ipv6_addr_copy(&fl->fl6_src, &src_info->ipi6_addr); |
554 | } | 559 | } |
555 | 560 | ||
556 | if (dev) | 561 | rcu_read_unlock(); |
557 | dev_put(dev); | ||
558 | 562 | ||
559 | if (err) | 563 | if (err) |
560 | goto exit_f; | 564 | goto exit_f; |