diff options
Diffstat (limited to 'net/ipv6/ndisc.c')
-rw-r--r-- | net/ipv6/ndisc.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 3e2970841bd8..9f061d1adbc2 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -1095,11 +1095,7 @@ static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt) | |||
1095 | &ipv6_hdr(ra)->saddr); | 1095 | &ipv6_hdr(ra)->saddr); |
1096 | nlmsg_end(skb, nlh); | 1096 | nlmsg_end(skb, nlh); |
1097 | 1097 | ||
1098 | err = rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, | 1098 | rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC); |
1099 | GFP_ATOMIC); | ||
1100 | if (err < 0) | ||
1101 | goto errout; | ||
1102 | |||
1103 | return; | 1099 | return; |
1104 | 1100 | ||
1105 | nla_put_failure: | 1101 | nla_put_failure: |
@@ -1538,13 +1534,10 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh, | |||
1538 | if (rt->rt6i_flags & RTF_GATEWAY) { | 1534 | if (rt->rt6i_flags & RTF_GATEWAY) { |
1539 | ND_PRINTK2(KERN_WARNING | 1535 | ND_PRINTK2(KERN_WARNING |
1540 | "ICMPv6 Redirect: destination is not a neighbour.\n"); | 1536 | "ICMPv6 Redirect: destination is not a neighbour.\n"); |
1541 | dst_release(dst); | 1537 | goto release; |
1542 | return; | ||
1543 | } | ||
1544 | if (!xrlim_allow(dst, 1*HZ)) { | ||
1545 | dst_release(dst); | ||
1546 | return; | ||
1547 | } | 1538 | } |
1539 | if (!xrlim_allow(dst, 1*HZ)) | ||
1540 | goto release; | ||
1548 | 1541 | ||
1549 | if (dev->addr_len) { | 1542 | if (dev->addr_len) { |
1550 | read_lock_bh(&neigh->lock); | 1543 | read_lock_bh(&neigh->lock); |
@@ -1570,8 +1563,7 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh, | |||
1570 | ND_PRINTK0(KERN_ERR | 1563 | ND_PRINTK0(KERN_ERR |
1571 | "ICMPv6 Redirect: %s() failed to allocate an skb.\n", | 1564 | "ICMPv6 Redirect: %s() failed to allocate an skb.\n", |
1572 | __func__); | 1565 | __func__); |
1573 | dst_release(dst); | 1566 | goto release; |
1574 | return; | ||
1575 | } | 1567 | } |
1576 | 1568 | ||
1577 | skb_reserve(buff, LL_RESERVED_SPACE(dev)); | 1569 | skb_reserve(buff, LL_RESERVED_SPACE(dev)); |
@@ -1631,6 +1623,10 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh, | |||
1631 | 1623 | ||
1632 | if (likely(idev != NULL)) | 1624 | if (likely(idev != NULL)) |
1633 | in6_dev_put(idev); | 1625 | in6_dev_put(idev); |
1626 | return; | ||
1627 | |||
1628 | release: | ||
1629 | dst_release(dst); | ||
1634 | } | 1630 | } |
1635 | 1631 | ||
1636 | static void pndisc_redo(struct sk_buff *skb) | 1632 | static void pndisc_redo(struct sk_buff *skb) |