diff options
Diffstat (limited to 'net/core/rtnetlink.c')
-rw-r--r-- | net/core/rtnetlink.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index a9a77216310..6c8d7f0ea01 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -607,6 +607,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
607 | { | 607 | { |
608 | struct ifinfomsg *ifm; | 608 | struct ifinfomsg *ifm; |
609 | struct nlmsghdr *nlh; | 609 | struct nlmsghdr *nlh; |
610 | struct net_device_stats *stats; | ||
611 | struct nlattr *attr; | ||
610 | 612 | ||
611 | nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifm), flags); | 613 | nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifm), flags); |
612 | if (nlh == NULL) | 614 | if (nlh == NULL) |
@@ -653,19 +655,13 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
653 | NLA_PUT(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast); | 655 | NLA_PUT(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast); |
654 | } | 656 | } |
655 | 657 | ||
656 | if (dev->get_stats) { | 658 | attr = nla_reserve(skb, IFLA_STATS, |
657 | struct net_device_stats *stats = dev->get_stats(dev); | 659 | sizeof(struct rtnl_link_stats)); |
658 | if (stats) { | 660 | if (attr == NULL) |
659 | struct nlattr *attr; | 661 | goto nla_put_failure; |
660 | 662 | ||
661 | attr = nla_reserve(skb, IFLA_STATS, | 663 | stats = dev->get_stats(dev); |
662 | sizeof(struct rtnl_link_stats)); | 664 | copy_rtnl_link_stats(nla_data(attr), stats); |
663 | if (attr == NULL) | ||
664 | goto nla_put_failure; | ||
665 | |||
666 | copy_rtnl_link_stats(nla_data(attr), stats); | ||
667 | } | ||
668 | } | ||
669 | 665 | ||
670 | if (dev->rtnl_link_ops) { | 666 | if (dev->rtnl_link_ops) { |
671 | if (rtnl_link_fill(skb, dev) < 0) | 667 | if (rtnl_link_fill(skb, dev) < 0) |