aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/sctp/structs.h3
-rw-r--r--net/sctp/sm_sideeffect.c7
-rw-r--r--net/sctp/ulpqueue.c4
3 files changed, 11 insertions, 3 deletions
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
index 1a6a626904bb..21cb11107e37 100644
--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -217,7 +217,8 @@ struct sctp_sock {
217 v4mapped:1, 217 v4mapped:1,
218 frag_interleave:1, 218 frag_interleave:1,
219 recvrcvinfo:1, 219 recvrcvinfo:1,
220 recvnxtinfo:1; 220 recvnxtinfo:1,
221 pending_data_ready:1;
221 222
222 atomic_t pd_mode; 223 atomic_t pd_mode;
223 /* Receive to here while partial delivery is in effect. */ 224 /* Receive to here while partial delivery is in effect. */
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
index 7fe56d0acabf..d06317de8730 100644
--- a/net/sctp/sm_sideeffect.c
+++ b/net/sctp/sm_sideeffect.c
@@ -1222,6 +1222,8 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
1222 sctp_cmd_seq_t *commands, 1222 sctp_cmd_seq_t *commands,
1223 gfp_t gfp) 1223 gfp_t gfp)
1224{ 1224{
1225 struct sock *sk = ep->base.sk;
1226 struct sctp_sock *sp = sctp_sk(sk);
1225 int error = 0; 1227 int error = 0;
1226 int force; 1228 int force;
1227 sctp_cmd_t *cmd; 1229 sctp_cmd_t *cmd;
@@ -1742,6 +1744,11 @@ out:
1742 error = sctp_outq_uncork(&asoc->outqueue, gfp); 1744 error = sctp_outq_uncork(&asoc->outqueue, gfp);
1743 } else if (local_cork) 1745 } else if (local_cork)
1744 error = sctp_outq_uncork(&asoc->outqueue, gfp); 1746 error = sctp_outq_uncork(&asoc->outqueue, gfp);
1747
1748 if (sp->pending_data_ready) {
1749 sk->sk_data_ready(sk);
1750 sp->pending_data_ready = 0;
1751 }
1745 return error; 1752 return error;
1746nomem: 1753nomem:
1747 error = -ENOMEM; 1754 error = -ENOMEM;
diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c
index ce469d648ffb..72e5b3e41cdd 100644
--- a/net/sctp/ulpqueue.c
+++ b/net/sctp/ulpqueue.c
@@ -264,7 +264,7 @@ int sctp_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event)
264 sctp_ulpq_clear_pd(ulpq); 264 sctp_ulpq_clear_pd(ulpq);
265 265
266 if (queue == &sk->sk_receive_queue) 266 if (queue == &sk->sk_receive_queue)
267 sk->sk_data_ready(sk); 267 sctp_sk(sk)->pending_data_ready = 1;
268 return 1; 268 return 1;
269 269
270out_free: 270out_free:
@@ -1140,5 +1140,5 @@ void sctp_ulpq_abort_pd(struct sctp_ulpq *ulpq, gfp_t gfp)
1140 1140
1141 /* If there is data waiting, send it up the socket now. */ 1141 /* If there is data waiting, send it up the socket now. */
1142 if (sctp_ulpq_clear_pd(ulpq) || ev) 1142 if (sctp_ulpq_clear_pd(ulpq) || ev)
1143 sk->sk_data_ready(sk); 1143 sctp_sk(sk)->pending_data_ready = 1;
1144} 1144}