diff options
Diffstat (limited to 'net/decnet/dn_table.c')
-rw-r--r-- | net/decnet/dn_table.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/net/decnet/dn_table.c b/net/decnet/dn_table.c index 10e87262b6fb..317904bb5896 100644 --- a/net/decnet/dn_table.c +++ b/net/decnet/dn_table.c | |||
@@ -333,24 +333,24 @@ static void dn_rtmsg_fib(int event, struct dn_fib_node *f, int z, u32 tb_id, | |||
333 | { | 333 | { |
334 | struct sk_buff *skb; | 334 | struct sk_buff *skb; |
335 | u32 pid = req ? req->pid : 0; | 335 | u32 pid = req ? req->pid : 0; |
336 | int size = NLMSG_SPACE(sizeof(struct rtmsg) + 256); | 336 | int err = -ENOBUFS; |
337 | 337 | ||
338 | skb = alloc_skb(size, GFP_KERNEL); | 338 | skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); |
339 | if (!skb) | 339 | if (skb == NULL) |
340 | return; | 340 | goto errout; |
341 | 341 | ||
342 | if (dn_fib_dump_info(skb, pid, nlh->nlmsg_seq, event, tb_id, | 342 | err = dn_fib_dump_info(skb, pid, nlh->nlmsg_seq, event, tb_id, |
343 | f->fn_type, f->fn_scope, &f->fn_key, z, | 343 | f->fn_type, f->fn_scope, &f->fn_key, z, |
344 | DN_FIB_INFO(f), 0) < 0) { | 344 | DN_FIB_INFO(f), 0); |
345 | if (err < 0) { | ||
345 | kfree_skb(skb); | 346 | kfree_skb(skb); |
346 | return; | 347 | goto errout; |
347 | } | 348 | } |
348 | NETLINK_CB(skb).dst_group = RTNLGRP_DECnet_ROUTE; | 349 | |
349 | if (nlh->nlmsg_flags & NLM_F_ECHO) | 350 | err = rtnl_notify(skb, pid, RTNLGRP_DECnet_ROUTE, nlh, GFP_KERNEL); |
350 | atomic_inc(&skb->users); | 351 | errout: |
351 | netlink_broadcast(rtnl, skb, pid, RTNLGRP_DECnet_ROUTE, GFP_KERNEL); | 352 | if (err < 0) |
352 | if (nlh->nlmsg_flags & NLM_F_ECHO) | 353 | rtnl_set_sk_err(RTNLGRP_DECnet_ROUTE, err); |
353 | netlink_unicast(rtnl, skb, pid, MSG_DONTWAIT); | ||
354 | } | 354 | } |
355 | 355 | ||
356 | static __inline__ int dn_hash_dump_bucket(struct sk_buff *skb, | 356 | static __inline__ int dn_hash_dump_bucket(struct sk_buff *skb, |