diff options
-rw-r--r-- | include/net/sctp/structs.h | 3 | ||||
-rw-r--r-- | net/sctp/sm_sideeffect.c | 7 | ||||
-rw-r--r-- | net/sctp/ulpqueue.c | 4 |
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; |
1746 | nomem: | 1753 | nomem: |
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 | ||
270 | out_free: | 270 | out_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 | } |