diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
index b1bd2689bb7019b792ab1023a9d6fdcd4ecfeb41..df4c6321996d75c1368ce282365637ad42cd875a 100644
--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -628,7 +628,7 @@ struct sctp_datamsg {
 	/* Chunks waiting to be submitted to lower layer. */
 	struct list_head chunks;
 	/* Chunks that have been transmitted. */
-	struct list_head track;
+	size_t msg_size;
 	/* Reference counting. */
 	atomic_t refcnt;
 	/* When is this message no longer interesting to the peer? */
diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c
index 645577ddc33e378ed1e33ffbe9cd043c6aeab9a9..acf7c4d128f7389c8cd18477e5a527b0580a9887 100644
--- a/net/sctp/chunk.c
+++ b/net/sctp/chunk.c
@@ -59,6 +59,7 @@ static void sctp_datamsg_init(struct sctp_datamsg *msg)
 	msg->can_abandon = 0;
 	msg->expires_at = 0;
 	INIT_LIST_HEAD(&msg->chunks);
+	msg->msg_size = 0;
 }
 
 /* Allocate and initialize datamsg. */
@@ -155,6 +156,7 @@ static void sctp_datamsg_assign(struct sctp_datamsg *msg, struct sctp_chunk *chu
 {
 	sctp_datamsg_hold(msg);
 	chunk->msg = msg;
+	msg->msg_size += chunk->skb->len;
 }
 
 
diff --git a/net/sctp/output.c b/net/sctp/output.c
index d0b84f6eba4dd49b9de2536707784c97b89a2102..b801bc9fb63969c8beccad3f827966ce5149fc14 100644
--- a/net/sctp/output.c
+++ b/net/sctp/output.c
@@ -703,8 +703,10 @@ static sctp_xmit_t sctp_packet_can_append_data(struct sctp_packet *packet,
 		/* Check whether this chunk and all the rest of pending
 		 * data will fit or delay in hopes of bundling a full
 		 * sized packet.
+		 * Don't delay large message writes that may have been
+		 * fragmeneted into small peices.
 		 */
-		if (len < max) {
+		if ((len < max) && (chunk->msg->msg_size < max)) {
 			retval = SCTP_XMIT_NAGLE_DELAY;
 			goto finish;
 		}