aboutsummaryrefslogtreecommitdiff
path: root/net/sctp/output.c
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2012-09-21 13:48:01 -0700
committerTony Lindgren <tony@atomide.com>2012-09-21 13:48:01 -0700
commit0c9de3c52d2baed6bc2ee44885adb418152c71c4 (patch)
treee19ab2c41ae47250fd614418022b32aa783aa563 /net/sctp/output.c
parent6bfc82ff589a00e5fbc12b958c649d703d273c86 (diff)
parent3c7c5dab44d6c8861bc86dab924353d8d40344f8 (diff)
Merge branch 'for_3.7/omap5_arch_timer' of git://github.com/SantoshShilimkar/linux into devel-dt-arch-timer
Conflicts: arch/arm/mach-omap2/timer.c
Diffstat (limited to 'net/sctp/output.c')
-rw-r--r--net/sctp/output.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/net/sctp/output.c b/net/sctp/output.c
index 838e18b4d7e..be50aa234dc 100644
--- a/net/sctp/output.c
+++ b/net/sctp/output.c
@@ -364,6 +364,25 @@ finish:
return retval;
}
+static void sctp_packet_release_owner(struct sk_buff *skb)
+{
+ sk_free(skb->sk);
+}
+
+static void sctp_packet_set_owner_w(struct sk_buff *skb, struct sock *sk)
+{
+ skb_orphan(skb);
+ skb->sk = sk;
+ skb->destructor = sctp_packet_release_owner;
+
+ /*
+ * The data chunks have already been accounted for in sctp_sendmsg(),
+ * therefore only reserve a single byte to keep socket around until
+ * the packet has been transmitted.
+ */
+ atomic_inc(&sk->sk_wmem_alloc);
+}
+
/* All packets are sent to the network through this function from
* sctp_outq_tail().
*
@@ -405,7 +424,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)
/* Set the owning socket so that we know where to get the
* destination IP address.
*/
- skb_set_owner_w(nskb, sk);
+ sctp_packet_set_owner_w(nskb, sk);
if (!sctp_transport_dst_check(tp)) {
sctp_transport_route(tp, NULL, sctp_sk(sk));