diff options
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/rtnetlink.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 2b1af17e6389..f5300b5dd0fd 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -630,20 +630,22 @@ static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb) | |||
630 | void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change) | 630 | void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change) |
631 | { | 631 | { |
632 | struct sk_buff *skb; | 632 | struct sk_buff *skb; |
633 | int size = NLMSG_SPACE(sizeof(struct ifinfomsg) + | 633 | int err = -ENOBUFS; |
634 | sizeof(struct rtnl_link_ifmap) + | ||
635 | sizeof(struct rtnl_link_stats) + 128); | ||
636 | 634 | ||
637 | skb = nlmsg_new(size, GFP_KERNEL); | 635 | skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); |
638 | if (!skb) | 636 | if (skb == NULL) |
639 | return; | 637 | goto errout; |
640 | 638 | ||
641 | if (rtnl_fill_ifinfo(skb, dev, NULL, 0, type, 0, 0, change, 0) < 0) { | 639 | err = rtnl_fill_ifinfo(skb, dev, NULL, 0, type, 0, 0, change, 0); |
640 | if (err < 0) { | ||
642 | kfree_skb(skb); | 641 | kfree_skb(skb); |
643 | return; | 642 | goto errout; |
644 | } | 643 | } |
645 | NETLINK_CB(skb).dst_group = RTNLGRP_LINK; | 644 | |
646 | netlink_broadcast(rtnl, skb, 0, RTNLGRP_LINK, GFP_KERNEL); | 645 | err = rtnl_notify(skb, 0, RTNLGRP_LINK, NULL, GFP_KERNEL); |
646 | errout: | ||
647 | if (err < 0) | ||
648 | rtnl_set_sk_err(RTNLGRP_LINK, err); | ||
647 | } | 649 | } |
648 | 650 | ||
649 | /* Protected by RTNL sempahore. */ | 651 | /* Protected by RTNL sempahore. */ |