|
@@ -1198,6 +1198,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
|
|
struct hlist_head *head;
|
|
struct hlist_head *head;
|
|
struct nlattr *tb[IFLA_MAX+1];
|
|
struct nlattr *tb[IFLA_MAX+1];
|
|
u32 ext_filter_mask = 0;
|
|
u32 ext_filter_mask = 0;
|
|
|
|
+ int err;
|
|
|
|
|
|
s_h = cb->args[0];
|
|
s_h = cb->args[0];
|
|
s_idx = cb->args[1];
|
|
s_idx = cb->args[1];
|
|
@@ -1218,11 +1219,17 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
|
|
hlist_for_each_entry_rcu(dev, head, index_hlist) {
|
|
hlist_for_each_entry_rcu(dev, head, index_hlist) {
|
|
if (idx < s_idx)
|
|
if (idx < s_idx)
|
|
goto cont;
|
|
goto cont;
|
|
- if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK,
|
|
|
|
- NETLINK_CB(cb->skb).portid,
|
|
|
|
- cb->nlh->nlmsg_seq, 0,
|
|
|
|
- NLM_F_MULTI,
|
|
|
|
- ext_filter_mask) <= 0)
|
|
|
|
|
|
+ err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK,
|
|
|
|
+ NETLINK_CB(cb->skb).portid,
|
|
|
|
+ cb->nlh->nlmsg_seq, 0,
|
|
|
|
+ NLM_F_MULTI,
|
|
|
|
+ ext_filter_mask);
|
|
|
|
+ /* If we ran out of room on the first message,
|
|
|
|
+ * we're in trouble
|
|
|
|
+ */
|
|
|
|
+ WARN_ON((err == -EMSGSIZE) && (skb->len == 0));
|
|
|
|
+
|
|
|
|
+ if (err <= 0)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
nl_dump_check_consistent(cb, nlmsg_hdr(skb));
|
|
nl_dump_check_consistent(cb, nlmsg_hdr(skb));
|