aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/output.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/dccp/output.c')
-rw-r--r--net/dccp/output.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/net/dccp/output.c b/net/dccp/output.c
index d6bb753bf6ad..aadbdb58758b 100644
--- a/net/dccp/output.c
+++ b/net/dccp/output.c
@@ -13,6 +13,7 @@
13#include <linux/dccp.h> 13#include <linux/dccp.h>
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15#include <linux/skbuff.h> 15#include <linux/skbuff.h>
16#include <linux/slab.h>
16 17
17#include <net/inet_sock.h> 18#include <net/inet_sock.h>
18#include <net/sock.h> 19#include <net/sock.h>
@@ -128,14 +129,14 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
128 break; 129 break;
129 } 130 }
130 131
131 icsk->icsk_af_ops->send_check(sk, 0, skb); 132 icsk->icsk_af_ops->send_check(sk, skb);
132 133
133 if (set_ack) 134 if (set_ack)
134 dccp_event_ack_sent(sk); 135 dccp_event_ack_sent(sk);
135 136
136 DCCP_INC_STATS(DCCP_MIB_OUTSEGS); 137 DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
137 138
138 err = icsk->icsk_af_ops->queue_xmit(skb, 0); 139 err = icsk->icsk_af_ops->queue_xmit(skb);
139 return net_xmit_eval(err); 140 return net_xmit_eval(err);
140 } 141 }
141 return -ENOBUFS; 142 return -ENOBUFS;
@@ -194,15 +195,17 @@ EXPORT_SYMBOL_GPL(dccp_sync_mss);
194 195
195void dccp_write_space(struct sock *sk) 196void dccp_write_space(struct sock *sk)
196{ 197{
197 read_lock(&sk->sk_callback_lock); 198 struct socket_wq *wq;
198 199
199 if (sk_has_sleeper(sk)) 200 rcu_read_lock();
200 wake_up_interruptible(sk->sk_sleep); 201 wq = rcu_dereference(sk->sk_wq);
202 if (wq_has_sleeper(wq))
203 wake_up_interruptible(&wq->wait);
201 /* Should agree with poll, otherwise some programs break */ 204 /* Should agree with poll, otherwise some programs break */
202 if (sock_writeable(sk)) 205 if (sock_writeable(sk))
203 sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); 206 sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT);
204 207
205 read_unlock(&sk->sk_callback_lock); 208 rcu_read_unlock();
206} 209}
207 210
208/** 211/**
@@ -224,7 +227,7 @@ static int dccp_wait_for_ccid(struct sock *sk, struct sk_buff *skb, int delay)
224 dccp_pr_debug("delayed send by %d msec\n", delay); 227 dccp_pr_debug("delayed send by %d msec\n", delay);
225 jiffdelay = msecs_to_jiffies(delay); 228 jiffdelay = msecs_to_jiffies(delay);
226 229
227 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); 230 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
228 231
229 sk->sk_write_pending++; 232 sk->sk_write_pending++;
230 release_sock(sk); 233 release_sock(sk);
@@ -240,7 +243,7 @@ static int dccp_wait_for_ccid(struct sock *sk, struct sk_buff *skb, int delay)
240 rc = ccid_hc_tx_send_packet(dp->dccps_hc_tx_ccid, sk, skb); 243 rc = ccid_hc_tx_send_packet(dp->dccps_hc_tx_ccid, sk, skb);
241 } while ((delay = rc) > 0); 244 } while ((delay = rc) > 0);
242out: 245out:
243 finish_wait(sk->sk_sleep, &wait); 246 finish_wait(sk_sleep(sk), &wait);
244 return rc; 247 return rc;
245 248
246do_error: 249do_error: