diff options
Diffstat (limited to 'net/sctp/output.c')
-rw-r--r-- | net/sctp/output.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/net/sctp/output.c b/net/sctp/output.c index 838e18b4d7ea..4e90188bf489 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
@@ -364,6 +364,25 @@ finish: | |||
364 | return retval; | 364 | return retval; |
365 | } | 365 | } |
366 | 366 | ||
367 | static void sctp_packet_release_owner(struct sk_buff *skb) | ||
368 | { | ||
369 | sk_free(skb->sk); | ||
370 | } | ||
371 | |||
372 | static void sctp_packet_set_owner_w(struct sk_buff *skb, struct sock *sk) | ||
373 | { | ||
374 | skb_orphan(skb); | ||
375 | skb->sk = sk; | ||
376 | skb->destructor = sctp_packet_release_owner; | ||
377 | |||
378 | /* | ||
379 | * The data chunks have already been accounted for in sctp_sendmsg(), | ||
380 | * therefore only reserve a single byte to keep socket around until | ||
381 | * the packet has been transmitted. | ||
382 | */ | ||
383 | atomic_inc(&sk->sk_wmem_alloc); | ||
384 | } | ||
385 | |||
367 | /* All packets are sent to the network through this function from | 386 | /* All packets are sent to the network through this function from |
368 | * sctp_outq_tail(). | 387 | * sctp_outq_tail(). |
369 | * | 388 | * |
@@ -405,7 +424,7 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
405 | /* Set the owning socket so that we know where to get the | 424 | /* Set the owning socket so that we know where to get the |
406 | * destination IP address. | 425 | * destination IP address. |
407 | */ | 426 | */ |
408 | skb_set_owner_w(nskb, sk); | 427 | sctp_packet_set_owner_w(nskb, sk); |
409 | 428 | ||
410 | if (!sctp_transport_dst_check(tp)) { | 429 | if (!sctp_transport_dst_check(tp)) { |
411 | sctp_transport_route(tp, NULL, sctp_sk(sk)); | 430 | sctp_transport_route(tp, NULL, sctp_sk(sk)); |
@@ -597,7 +616,7 @@ out: | |||
597 | return err; | 616 | return err; |
598 | no_route: | 617 | no_route: |
599 | kfree_skb(nskb); | 618 | kfree_skb(nskb); |
600 | IP_INC_STATS_BH(&init_net, IPSTATS_MIB_OUTNOROUTES); | 619 | IP_INC_STATS_BH(sock_net(asoc->base.sk), IPSTATS_MIB_OUTNOROUTES); |
601 | 620 | ||
602 | /* FIXME: Returning the 'err' will effect all the associations | 621 | /* FIXME: Returning the 'err' will effect all the associations |
603 | * associated with a socket, although only one of the paths of the | 622 | * associated with a socket, although only one of the paths of the |