diff options
Diffstat (limited to 'net/decnet')
-rw-r--r-- | net/decnet/af_decnet.c | 25 | ||||
-rw-r--r-- | net/decnet/dn_neigh.c | 8 | ||||
-rw-r--r-- | net/decnet/dn_nsp_in.c | 17 | ||||
-rw-r--r-- | net/decnet/dn_nsp_out.c | 14 | ||||
-rw-r--r-- | net/decnet/dn_route.c | 25 | ||||
-rw-r--r-- | net/decnet/dn_rules.c | 4 |
6 files changed, 37 insertions, 56 deletions
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 9647d911f916..a5e3a593e472 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
@@ -1075,6 +1075,7 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags) | |||
1075 | int err = 0; | 1075 | int err = 0; |
1076 | unsigned char type; | 1076 | unsigned char type; |
1077 | long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); | 1077 | long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); |
1078 | struct dst_entry *dst; | ||
1078 | 1079 | ||
1079 | lock_sock(sk); | 1080 | lock_sock(sk); |
1080 | 1081 | ||
@@ -1102,8 +1103,9 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags) | |||
1102 | } | 1103 | } |
1103 | release_sock(sk); | 1104 | release_sock(sk); |
1104 | 1105 | ||
1105 | dst_release(xchg(&newsk->sk_dst_cache, skb->dst)); | 1106 | dst = skb_dst(skb); |
1106 | skb->dst = NULL; | 1107 | dst_release(xchg(&newsk->sk_dst_cache, dst)); |
1108 | skb_dst_set(skb, NULL); | ||
1107 | 1109 | ||
1108 | DN_SK(newsk)->state = DN_CR; | 1110 | DN_SK(newsk)->state = DN_CR; |
1109 | DN_SK(newsk)->addrrem = cb->src_port; | 1111 | DN_SK(newsk)->addrrem = cb->src_port; |
@@ -1250,14 +1252,8 @@ static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
1250 | if (skb) { | 1252 | if (skb) { |
1251 | amount = skb->len; | 1253 | amount = skb->len; |
1252 | } else { | 1254 | } else { |
1253 | skb = sk->sk_receive_queue.next; | 1255 | skb_queue_walk(&sk->sk_receive_queue, skb) |
1254 | for (;;) { | ||
1255 | if (skb == | ||
1256 | (struct sk_buff *)&sk->sk_receive_queue) | ||
1257 | break; | ||
1258 | amount += skb->len; | 1256 | amount += skb->len; |
1259 | skb = skb->next; | ||
1260 | } | ||
1261 | } | 1257 | } |
1262 | release_sock(sk); | 1258 | release_sock(sk); |
1263 | err = put_user(amount, (int __user *)arg); | 1259 | err = put_user(amount, (int __user *)arg); |
@@ -1644,13 +1640,13 @@ static int __dn_getsockopt(struct socket *sock, int level,int optname, char __us | |||
1644 | 1640 | ||
1645 | static int dn_data_ready(struct sock *sk, struct sk_buff_head *q, int flags, int target) | 1641 | static int dn_data_ready(struct sock *sk, struct sk_buff_head *q, int flags, int target) |
1646 | { | 1642 | { |
1647 | struct sk_buff *skb = q->next; | 1643 | struct sk_buff *skb; |
1648 | int len = 0; | 1644 | int len = 0; |
1649 | 1645 | ||
1650 | if (flags & MSG_OOB) | 1646 | if (flags & MSG_OOB) |
1651 | return !skb_queue_empty(q) ? 1 : 0; | 1647 | return !skb_queue_empty(q) ? 1 : 0; |
1652 | 1648 | ||
1653 | while(skb != (struct sk_buff *)q) { | 1649 | skb_queue_walk(q, skb) { |
1654 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 1650 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
1655 | len += skb->len; | 1651 | len += skb->len; |
1656 | 1652 | ||
@@ -1666,8 +1662,6 @@ static int dn_data_ready(struct sock *sk, struct sk_buff_head *q, int flags, int | |||
1666 | /* minimum data length for read exceeded */ | 1662 | /* minimum data length for read exceeded */ |
1667 | if (len >= target) | 1663 | if (len >= target) |
1668 | return 1; | 1664 | return 1; |
1669 | |||
1670 | skb = skb->next; | ||
1671 | } | 1665 | } |
1672 | 1666 | ||
1673 | return 0; | 1667 | return 0; |
@@ -1683,7 +1677,7 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1683 | size_t target = size > 1 ? 1 : 0; | 1677 | size_t target = size > 1 ? 1 : 0; |
1684 | size_t copied = 0; | 1678 | size_t copied = 0; |
1685 | int rv = 0; | 1679 | int rv = 0; |
1686 | struct sk_buff *skb, *nskb; | 1680 | struct sk_buff *skb, *n; |
1687 | struct dn_skb_cb *cb = NULL; | 1681 | struct dn_skb_cb *cb = NULL; |
1688 | unsigned char eor = 0; | 1682 | unsigned char eor = 0; |
1689 | long timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); | 1683 | long timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); |
@@ -1758,7 +1752,7 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1758 | finish_wait(sk->sk_sleep, &wait); | 1752 | finish_wait(sk->sk_sleep, &wait); |
1759 | } | 1753 | } |
1760 | 1754 | ||
1761 | for(skb = queue->next; skb != (struct sk_buff *)queue; skb = nskb) { | 1755 | skb_queue_walk_safe(queue, skb, n) { |
1762 | unsigned int chunk = skb->len; | 1756 | unsigned int chunk = skb->len; |
1763 | cb = DN_SKB_CB(skb); | 1757 | cb = DN_SKB_CB(skb); |
1764 | 1758 | ||
@@ -1775,7 +1769,6 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1775 | skb_pull(skb, chunk); | 1769 | skb_pull(skb, chunk); |
1776 | 1770 | ||
1777 | eor = cb->nsp_flags & 0x40; | 1771 | eor = cb->nsp_flags & 0x40; |
1778 | nskb = skb->next; | ||
1779 | 1772 | ||
1780 | if (skb->len == 0) { | 1773 | if (skb->len == 0) { |
1781 | skb_unlink(skb, queue); | 1774 | skb_unlink(skb, queue); |
diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c index 05b5aa05e50e..923786bd6d01 100644 --- a/net/decnet/dn_neigh.c +++ b/net/decnet/dn_neigh.c | |||
@@ -204,7 +204,7 @@ static void dn_short_error_report(struct neighbour *neigh, struct sk_buff *skb) | |||
204 | 204 | ||
205 | static int dn_neigh_output_packet(struct sk_buff *skb) | 205 | static int dn_neigh_output_packet(struct sk_buff *skb) |
206 | { | 206 | { |
207 | struct dst_entry *dst = skb->dst; | 207 | struct dst_entry *dst = skb_dst(skb); |
208 | struct dn_route *rt = (struct dn_route *)dst; | 208 | struct dn_route *rt = (struct dn_route *)dst; |
209 | struct neighbour *neigh = dst->neighbour; | 209 | struct neighbour *neigh = dst->neighbour; |
210 | struct net_device *dev = neigh->dev; | 210 | struct net_device *dev = neigh->dev; |
@@ -224,7 +224,7 @@ static int dn_neigh_output_packet(struct sk_buff *skb) | |||
224 | 224 | ||
225 | static int dn_long_output(struct sk_buff *skb) | 225 | static int dn_long_output(struct sk_buff *skb) |
226 | { | 226 | { |
227 | struct dst_entry *dst = skb->dst; | 227 | struct dst_entry *dst = skb_dst(skb); |
228 | struct neighbour *neigh = dst->neighbour; | 228 | struct neighbour *neigh = dst->neighbour; |
229 | struct net_device *dev = neigh->dev; | 229 | struct net_device *dev = neigh->dev; |
230 | int headroom = dev->hard_header_len + sizeof(struct dn_long_packet) + 3; | 230 | int headroom = dev->hard_header_len + sizeof(struct dn_long_packet) + 3; |
@@ -270,7 +270,7 @@ static int dn_long_output(struct sk_buff *skb) | |||
270 | 270 | ||
271 | static int dn_short_output(struct sk_buff *skb) | 271 | static int dn_short_output(struct sk_buff *skb) |
272 | { | 272 | { |
273 | struct dst_entry *dst = skb->dst; | 273 | struct dst_entry *dst = skb_dst(skb); |
274 | struct neighbour *neigh = dst->neighbour; | 274 | struct neighbour *neigh = dst->neighbour; |
275 | struct net_device *dev = neigh->dev; | 275 | struct net_device *dev = neigh->dev; |
276 | int headroom = dev->hard_header_len + sizeof(struct dn_short_packet) + 2; | 276 | int headroom = dev->hard_header_len + sizeof(struct dn_short_packet) + 2; |
@@ -313,7 +313,7 @@ static int dn_short_output(struct sk_buff *skb) | |||
313 | */ | 313 | */ |
314 | static int dn_phase3_output(struct sk_buff *skb) | 314 | static int dn_phase3_output(struct sk_buff *skb) |
315 | { | 315 | { |
316 | struct dst_entry *dst = skb->dst; | 316 | struct dst_entry *dst = skb_dst(skb); |
317 | struct neighbour *neigh = dst->neighbour; | 317 | struct neighbour *neigh = dst->neighbour; |
318 | struct net_device *dev = neigh->dev; | 318 | struct net_device *dev = neigh->dev; |
319 | int headroom = dev->hard_header_len + sizeof(struct dn_short_packet) + 2; | 319 | int headroom = dev->hard_header_len + sizeof(struct dn_short_packet) + 2; |
diff --git a/net/decnet/dn_nsp_in.c b/net/decnet/dn_nsp_in.c index 5d8a2a56fd39..932408dca86d 100644 --- a/net/decnet/dn_nsp_in.c +++ b/net/decnet/dn_nsp_in.c | |||
@@ -578,6 +578,7 @@ out: | |||
578 | static __inline__ int dn_queue_skb(struct sock *sk, struct sk_buff *skb, int sig, struct sk_buff_head *queue) | 578 | static __inline__ int dn_queue_skb(struct sock *sk, struct sk_buff *skb, int sig, struct sk_buff_head *queue) |
579 | { | 579 | { |
580 | int err; | 580 | int err; |
581 | int skb_len; | ||
581 | 582 | ||
582 | /* Cast skb->rcvbuf to unsigned... It's pointless, but reduces | 583 | /* Cast skb->rcvbuf to unsigned... It's pointless, but reduces |
583 | number of warnings when compiling with -W --ANK | 584 | number of warnings when compiling with -W --ANK |
@@ -592,22 +593,12 @@ static __inline__ int dn_queue_skb(struct sock *sk, struct sk_buff *skb, int sig | |||
592 | if (err) | 593 | if (err) |
593 | goto out; | 594 | goto out; |
594 | 595 | ||
596 | skb_len = skb->len; | ||
595 | skb_set_owner_r(skb, sk); | 597 | skb_set_owner_r(skb, sk); |
596 | skb_queue_tail(queue, skb); | 598 | skb_queue_tail(queue, skb); |
597 | 599 | ||
598 | /* This code only runs from BH or BH protected context. | 600 | if (!sock_flag(sk, SOCK_DEAD)) |
599 | * Therefore the plain read_lock is ok here. -DaveM | 601 | sk->sk_data_ready(sk, skb_len); |
600 | */ | ||
601 | read_lock(&sk->sk_callback_lock); | ||
602 | if (!sock_flag(sk, SOCK_DEAD)) { | ||
603 | struct socket *sock = sk->sk_socket; | ||
604 | wake_up_interruptible(sk->sk_sleep); | ||
605 | if (sock && sock->fasync_list && | ||
606 | !test_bit(SOCK_ASYNC_WAITDATA, &sock->flags)) | ||
607 | __kill_fasync(sock->fasync_list, sig, | ||
608 | (sig == SIGURG) ? POLL_PRI : POLL_IN); | ||
609 | } | ||
610 | read_unlock(&sk->sk_callback_lock); | ||
611 | out: | 602 | out: |
612 | return err; | 603 | return err; |
613 | } | 604 | } |
diff --git a/net/decnet/dn_nsp_out.c b/net/decnet/dn_nsp_out.c index 2013c25b7f5a..a65e929ce76c 100644 --- a/net/decnet/dn_nsp_out.c +++ b/net/decnet/dn_nsp_out.c | |||
@@ -85,7 +85,7 @@ static void dn_nsp_send(struct sk_buff *skb) | |||
85 | dst = sk_dst_check(sk, 0); | 85 | dst = sk_dst_check(sk, 0); |
86 | if (dst) { | 86 | if (dst) { |
87 | try_again: | 87 | try_again: |
88 | skb->dst = dst; | 88 | skb_dst_set(skb, dst); |
89 | dst_output(skb); | 89 | dst_output(skb); |
90 | return; | 90 | return; |
91 | } | 91 | } |
@@ -382,7 +382,7 @@ int dn_nsp_check_xmit_queue(struct sock *sk, struct sk_buff *skb, struct sk_buff | |||
382 | { | 382 | { |
383 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 383 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
384 | struct dn_scp *scp = DN_SK(sk); | 384 | struct dn_scp *scp = DN_SK(sk); |
385 | struct sk_buff *skb2, *list, *ack = NULL; | 385 | struct sk_buff *skb2, *n, *ack = NULL; |
386 | int wakeup = 0; | 386 | int wakeup = 0; |
387 | int try_retrans = 0; | 387 | int try_retrans = 0; |
388 | unsigned long reftime = cb->stamp; | 388 | unsigned long reftime = cb->stamp; |
@@ -390,9 +390,7 @@ int dn_nsp_check_xmit_queue(struct sock *sk, struct sk_buff *skb, struct sk_buff | |||
390 | unsigned short xmit_count; | 390 | unsigned short xmit_count; |
391 | unsigned short segnum; | 391 | unsigned short segnum; |
392 | 392 | ||
393 | skb2 = q->next; | 393 | skb_queue_walk_safe(q, skb2, n) { |
394 | list = (struct sk_buff *)q; | ||
395 | while(list != skb2) { | ||
396 | struct dn_skb_cb *cb2 = DN_SKB_CB(skb2); | 394 | struct dn_skb_cb *cb2 = DN_SKB_CB(skb2); |
397 | 395 | ||
398 | if (dn_before_or_equal(cb2->segnum, acknum)) | 396 | if (dn_before_or_equal(cb2->segnum, acknum)) |
@@ -400,8 +398,6 @@ int dn_nsp_check_xmit_queue(struct sock *sk, struct sk_buff *skb, struct sk_buff | |||
400 | 398 | ||
401 | /* printk(KERN_DEBUG "ack: %s %04x %04x\n", ack ? "ACK" : "SKIP", (int)cb2->segnum, (int)acknum); */ | 399 | /* printk(KERN_DEBUG "ack: %s %04x %04x\n", ack ? "ACK" : "SKIP", (int)cb2->segnum, (int)acknum); */ |
402 | 400 | ||
403 | skb2 = skb2->next; | ||
404 | |||
405 | if (ack == NULL) | 401 | if (ack == NULL) |
406 | continue; | 402 | continue; |
407 | 403 | ||
@@ -586,7 +582,7 @@ static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg, | |||
586 | * to be able to send disc packets out which have no socket | 582 | * to be able to send disc packets out which have no socket |
587 | * associations. | 583 | * associations. |
588 | */ | 584 | */ |
589 | skb->dst = dst_clone(dst); | 585 | skb_dst_set(skb, dst_clone(dst)); |
590 | dst_output(skb); | 586 | dst_output(skb); |
591 | } | 587 | } |
592 | 588 | ||
@@ -615,7 +611,7 @@ void dn_nsp_return_disc(struct sk_buff *skb, unsigned char msgflg, | |||
615 | int ddl = 0; | 611 | int ddl = 0; |
616 | gfp_t gfp = GFP_ATOMIC; | 612 | gfp_t gfp = GFP_ATOMIC; |
617 | 613 | ||
618 | dn_nsp_do_disc(NULL, msgflg, reason, gfp, skb->dst, ddl, | 614 | dn_nsp_do_disc(NULL, msgflg, reason, gfp, skb_dst(skb), ddl, |
619 | NULL, cb->src_port, cb->dst_port); | 615 | NULL, cb->src_port, cb->dst_port); |
620 | } | 616 | } |
621 | 617 | ||
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 0cc4394117df..1d6ca8a98dc6 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
@@ -678,7 +678,7 @@ out: | |||
678 | 678 | ||
679 | static int dn_output(struct sk_buff *skb) | 679 | static int dn_output(struct sk_buff *skb) |
680 | { | 680 | { |
681 | struct dst_entry *dst = skb->dst; | 681 | struct dst_entry *dst = skb_dst(skb); |
682 | struct dn_route *rt = (struct dn_route *)dst; | 682 | struct dn_route *rt = (struct dn_route *)dst; |
683 | struct net_device *dev = dst->dev; | 683 | struct net_device *dev = dst->dev; |
684 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 684 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
@@ -717,7 +717,7 @@ error: | |||
717 | static int dn_forward(struct sk_buff *skb) | 717 | static int dn_forward(struct sk_buff *skb) |
718 | { | 718 | { |
719 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 719 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
720 | struct dst_entry *dst = skb->dst; | 720 | struct dst_entry *dst = skb_dst(skb); |
721 | struct dn_dev *dn_db = dst->dev->dn_ptr; | 721 | struct dn_dev *dn_db = dst->dev->dn_ptr; |
722 | struct dn_route *rt; | 722 | struct dn_route *rt; |
723 | struct neighbour *neigh = dst->neighbour; | 723 | struct neighbour *neigh = dst->neighbour; |
@@ -730,7 +730,7 @@ static int dn_forward(struct sk_buff *skb) | |||
730 | goto drop; | 730 | goto drop; |
731 | 731 | ||
732 | /* Ensure that we have enough space for headers */ | 732 | /* Ensure that we have enough space for headers */ |
733 | rt = (struct dn_route *)skb->dst; | 733 | rt = (struct dn_route *)skb_dst(skb); |
734 | header_len = dn_db->use_long ? 21 : 6; | 734 | header_len = dn_db->use_long ? 21 : 6; |
735 | if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+header_len)) | 735 | if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+header_len)) |
736 | goto drop; | 736 | goto drop; |
@@ -1392,7 +1392,8 @@ make_route: | |||
1392 | goto e_neighbour; | 1392 | goto e_neighbour; |
1393 | 1393 | ||
1394 | hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst); | 1394 | hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst); |
1395 | dn_insert_route(rt, hash, (struct dn_route **)&skb->dst); | 1395 | dn_insert_route(rt, hash, &rt); |
1396 | skb_dst_set(skb, &rt->u.dst); | ||
1396 | 1397 | ||
1397 | done: | 1398 | done: |
1398 | if (neigh) | 1399 | if (neigh) |
@@ -1424,7 +1425,7 @@ static int dn_route_input(struct sk_buff *skb) | |||
1424 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 1425 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
1425 | unsigned hash = dn_hash(cb->src, cb->dst); | 1426 | unsigned hash = dn_hash(cb->src, cb->dst); |
1426 | 1427 | ||
1427 | if (skb->dst) | 1428 | if (skb_dst(skb)) |
1428 | return 0; | 1429 | return 0; |
1429 | 1430 | ||
1430 | rcu_read_lock(); | 1431 | rcu_read_lock(); |
@@ -1437,7 +1438,7 @@ static int dn_route_input(struct sk_buff *skb) | |||
1437 | (rt->fl.iif == cb->iif)) { | 1438 | (rt->fl.iif == cb->iif)) { |
1438 | dst_use(&rt->u.dst, jiffies); | 1439 | dst_use(&rt->u.dst, jiffies); |
1439 | rcu_read_unlock(); | 1440 | rcu_read_unlock(); |
1440 | skb->dst = (struct dst_entry *)rt; | 1441 | skb_dst_set(skb, (struct dst_entry *)rt); |
1441 | return 0; | 1442 | return 0; |
1442 | } | 1443 | } |
1443 | } | 1444 | } |
@@ -1449,7 +1450,7 @@ static int dn_route_input(struct sk_buff *skb) | |||
1449 | static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, | 1450 | static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, |
1450 | int event, int nowait, unsigned int flags) | 1451 | int event, int nowait, unsigned int flags) |
1451 | { | 1452 | { |
1452 | struct dn_route *rt = (struct dn_route *)skb->dst; | 1453 | struct dn_route *rt = (struct dn_route *)skb_dst(skb); |
1453 | struct rtmsg *r; | 1454 | struct rtmsg *r; |
1454 | struct nlmsghdr *nlh; | 1455 | struct nlmsghdr *nlh; |
1455 | unsigned char *b = skb_tail_pointer(skb); | 1456 | unsigned char *b = skb_tail_pointer(skb); |
@@ -1554,7 +1555,7 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
1554 | err = dn_route_input(skb); | 1555 | err = dn_route_input(skb); |
1555 | local_bh_enable(); | 1556 | local_bh_enable(); |
1556 | memset(cb, 0, sizeof(struct dn_skb_cb)); | 1557 | memset(cb, 0, sizeof(struct dn_skb_cb)); |
1557 | rt = (struct dn_route *)skb->dst; | 1558 | rt = (struct dn_route *)skb_dst(skb); |
1558 | if (!err && -rt->u.dst.error) | 1559 | if (!err && -rt->u.dst.error) |
1559 | err = rt->u.dst.error; | 1560 | err = rt->u.dst.error; |
1560 | } else { | 1561 | } else { |
@@ -1570,7 +1571,7 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
1570 | skb->dev = NULL; | 1571 | skb->dev = NULL; |
1571 | if (err) | 1572 | if (err) |
1572 | goto out_free; | 1573 | goto out_free; |
1573 | skb->dst = &rt->u.dst; | 1574 | skb_dst_set(skb, &rt->u.dst); |
1574 | if (rtm->rtm_flags & RTM_F_NOTIFY) | 1575 | if (rtm->rtm_flags & RTM_F_NOTIFY) |
1575 | rt->rt_flags |= RTCF_NOTIFY; | 1576 | rt->rt_flags |= RTCF_NOTIFY; |
1576 | 1577 | ||
@@ -1622,15 +1623,15 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
1622 | rt = rcu_dereference(rt->u.dst.dn_next), idx++) { | 1623 | rt = rcu_dereference(rt->u.dst.dn_next), idx++) { |
1623 | if (idx < s_idx) | 1624 | if (idx < s_idx) |
1624 | continue; | 1625 | continue; |
1625 | skb->dst = dst_clone(&rt->u.dst); | 1626 | skb_dst_set(skb, dst_clone(&rt->u.dst)); |
1626 | if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).pid, | 1627 | if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).pid, |
1627 | cb->nlh->nlmsg_seq, RTM_NEWROUTE, | 1628 | cb->nlh->nlmsg_seq, RTM_NEWROUTE, |
1628 | 1, NLM_F_MULTI) <= 0) { | 1629 | 1, NLM_F_MULTI) <= 0) { |
1629 | dst_release(xchg(&skb->dst, NULL)); | 1630 | skb_dst_drop(skb); |
1630 | rcu_read_unlock_bh(); | 1631 | rcu_read_unlock_bh(); |
1631 | goto done; | 1632 | goto done; |
1632 | } | 1633 | } |
1633 | dst_release(xchg(&skb->dst, NULL)); | 1634 | skb_dst_drop(skb); |
1634 | } | 1635 | } |
1635 | rcu_read_unlock_bh(); | 1636 | rcu_read_unlock_bh(); |
1636 | } | 1637 | } |
diff --git a/net/decnet/dn_rules.c b/net/decnet/dn_rules.c index 14fbca55e908..72495f25269f 100644 --- a/net/decnet/dn_rules.c +++ b/net/decnet/dn_rules.c | |||
@@ -115,7 +115,7 @@ static int dn_fib_rule_match(struct fib_rule *rule, struct flowi *fl, int flags) | |||
115 | } | 115 | } |
116 | 116 | ||
117 | static int dn_fib_rule_configure(struct fib_rule *rule, struct sk_buff *skb, | 117 | static int dn_fib_rule_configure(struct fib_rule *rule, struct sk_buff *skb, |
118 | struct nlmsghdr *nlh, struct fib_rule_hdr *frh, | 118 | struct fib_rule_hdr *frh, |
119 | struct nlattr **tb) | 119 | struct nlattr **tb) |
120 | { | 120 | { |
121 | int err = -EINVAL; | 121 | int err = -EINVAL; |
@@ -192,7 +192,7 @@ unsigned dnet_addr_type(__le16 addr) | |||
192 | } | 192 | } |
193 | 193 | ||
194 | static int dn_fib_rule_fill(struct fib_rule *rule, struct sk_buff *skb, | 194 | static int dn_fib_rule_fill(struct fib_rule *rule, struct sk_buff *skb, |
195 | struct nlmsghdr *nlh, struct fib_rule_hdr *frh) | 195 | struct fib_rule_hdr *frh) |
196 | { | 196 | { |
197 | struct dn_fib_rule *r = (struct dn_fib_rule *)rule; | 197 | struct dn_fib_rule *r = (struct dn_fib_rule *)rule; |
198 | 198 | ||