diff options
Diffstat (limited to 'net/sctp/output.c')
-rw-r--r-- | net/sctp/output.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/net/sctp/output.c b/net/sctp/output.c index 838e18b4d7ea..be50aa234dcd 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)); |