diff options
Diffstat (limited to 'drivers/net/macvtap.c')
-rw-r--r-- | drivers/net/macvtap.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index d97e1fd234ba..1c4110df343e 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -37,6 +37,7 @@ | |||
37 | struct macvtap_queue { | 37 | struct macvtap_queue { |
38 | struct sock sk; | 38 | struct sock sk; |
39 | struct socket sock; | 39 | struct socket sock; |
40 | struct socket_wq wq; | ||
40 | struct macvlan_dev *vlan; | 41 | struct macvlan_dev *vlan; |
41 | struct file *file; | 42 | struct file *file; |
42 | unsigned int flags; | 43 | unsigned int flags; |
@@ -242,12 +243,15 @@ static struct rtnl_link_ops macvtap_link_ops __read_mostly = { | |||
242 | 243 | ||
243 | static void macvtap_sock_write_space(struct sock *sk) | 244 | static void macvtap_sock_write_space(struct sock *sk) |
244 | { | 245 | { |
246 | wait_queue_head_t *wqueue; | ||
247 | |||
245 | if (!sock_writeable(sk) || | 248 | if (!sock_writeable(sk) || |
246 | !test_and_clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags)) | 249 | !test_and_clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags)) |
247 | return; | 250 | return; |
248 | 251 | ||
249 | if (sk_sleep(sk) && waitqueue_active(sk_sleep(sk))) | 252 | wqueue = sk_sleep(sk); |
250 | wake_up_interruptible_poll(sk_sleep(sk), POLLOUT | POLLWRNORM | POLLWRBAND); | 253 | if (wqueue && waitqueue_active(wqueue)) |
254 | wake_up_interruptible_poll(wqueue, POLLOUT | POLLWRNORM | POLLWRBAND); | ||
251 | } | 255 | } |
252 | 256 | ||
253 | static int macvtap_open(struct inode *inode, struct file *file) | 257 | static int macvtap_open(struct inode *inode, struct file *file) |
@@ -272,7 +276,8 @@ static int macvtap_open(struct inode *inode, struct file *file) | |||
272 | if (!q) | 276 | if (!q) |
273 | goto out; | 277 | goto out; |
274 | 278 | ||
275 | init_waitqueue_head(&q->sock.wait); | 279 | q->sock.wq = &q->wq; |
280 | init_waitqueue_head(&q->wq.wait); | ||
276 | q->sock.type = SOCK_RAW; | 281 | q->sock.type = SOCK_RAW; |
277 | q->sock.state = SS_CONNECTED; | 282 | q->sock.state = SS_CONNECTED; |
278 | q->sock.file = file; | 283 | q->sock.file = file; |
@@ -308,7 +313,7 @@ static unsigned int macvtap_poll(struct file *file, poll_table * wait) | |||
308 | goto out; | 313 | goto out; |
309 | 314 | ||
310 | mask = 0; | 315 | mask = 0; |
311 | poll_wait(file, &q->sock.wait, wait); | 316 | poll_wait(file, &q->wq.wait, wait); |
312 | 317 | ||
313 | if (!skb_queue_empty(&q->sk.sk_receive_queue)) | 318 | if (!skb_queue_empty(&q->sk.sk_receive_queue)) |
314 | mask |= POLLIN | POLLRDNORM; | 319 | mask |= POLLIN | POLLRDNORM; |