diff options
Diffstat (limited to 'net/unix/af_unix.c')
-rw-r--r-- | net/unix/af_unix.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 95b02a71fd47..e5473c03d667 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -638,8 +638,9 @@ static int unix_stream_connect(struct socket *, struct sockaddr *, | |||
638 | static int unix_socketpair(struct socket *, struct socket *); | 638 | static int unix_socketpair(struct socket *, struct socket *); |
639 | static int unix_accept(struct socket *, struct socket *, int, bool); | 639 | static int unix_accept(struct socket *, struct socket *, int, bool); |
640 | static int unix_getname(struct socket *, struct sockaddr *, int); | 640 | static int unix_getname(struct socket *, struct sockaddr *, int); |
641 | static __poll_t unix_poll_mask(struct socket *, __poll_t); | 641 | static __poll_t unix_poll(struct file *, struct socket *, poll_table *); |
642 | static __poll_t unix_dgram_poll_mask(struct socket *, __poll_t); | 642 | static __poll_t unix_dgram_poll(struct file *, struct socket *, |
643 | poll_table *); | ||
643 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); | 644 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); |
644 | static int unix_shutdown(struct socket *, int); | 645 | static int unix_shutdown(struct socket *, int); |
645 | static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t); | 646 | static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t); |
@@ -680,7 +681,7 @@ static const struct proto_ops unix_stream_ops = { | |||
680 | .socketpair = unix_socketpair, | 681 | .socketpair = unix_socketpair, |
681 | .accept = unix_accept, | 682 | .accept = unix_accept, |
682 | .getname = unix_getname, | 683 | .getname = unix_getname, |
683 | .poll_mask = unix_poll_mask, | 684 | .poll = unix_poll, |
684 | .ioctl = unix_ioctl, | 685 | .ioctl = unix_ioctl, |
685 | .listen = unix_listen, | 686 | .listen = unix_listen, |
686 | .shutdown = unix_shutdown, | 687 | .shutdown = unix_shutdown, |
@@ -703,7 +704,7 @@ static const struct proto_ops unix_dgram_ops = { | |||
703 | .socketpair = unix_socketpair, | 704 | .socketpair = unix_socketpair, |
704 | .accept = sock_no_accept, | 705 | .accept = sock_no_accept, |
705 | .getname = unix_getname, | 706 | .getname = unix_getname, |
706 | .poll_mask = unix_dgram_poll_mask, | 707 | .poll = unix_dgram_poll, |
707 | .ioctl = unix_ioctl, | 708 | .ioctl = unix_ioctl, |
708 | .listen = sock_no_listen, | 709 | .listen = sock_no_listen, |
709 | .shutdown = unix_shutdown, | 710 | .shutdown = unix_shutdown, |
@@ -725,7 +726,7 @@ static const struct proto_ops unix_seqpacket_ops = { | |||
725 | .socketpair = unix_socketpair, | 726 | .socketpair = unix_socketpair, |
726 | .accept = unix_accept, | 727 | .accept = unix_accept, |
727 | .getname = unix_getname, | 728 | .getname = unix_getname, |
728 | .poll_mask = unix_dgram_poll_mask, | 729 | .poll = unix_dgram_poll, |
729 | .ioctl = unix_ioctl, | 730 | .ioctl = unix_ioctl, |
730 | .listen = unix_listen, | 731 | .listen = unix_listen, |
731 | .shutdown = unix_shutdown, | 732 | .shutdown = unix_shutdown, |
@@ -2629,10 +2630,13 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
2629 | return err; | 2630 | return err; |
2630 | } | 2631 | } |
2631 | 2632 | ||
2632 | static __poll_t unix_poll_mask(struct socket *sock, __poll_t events) | 2633 | static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wait) |
2633 | { | 2634 | { |
2634 | struct sock *sk = sock->sk; | 2635 | struct sock *sk = sock->sk; |
2635 | __poll_t mask = 0; | 2636 | __poll_t mask; |
2637 | |||
2638 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
2639 | mask = 0; | ||
2636 | 2640 | ||
2637 | /* exceptional events? */ | 2641 | /* exceptional events? */ |
2638 | if (sk->sk_err) | 2642 | if (sk->sk_err) |
@@ -2661,11 +2665,15 @@ static __poll_t unix_poll_mask(struct socket *sock, __poll_t events) | |||
2661 | return mask; | 2665 | return mask; |
2662 | } | 2666 | } |
2663 | 2667 | ||
2664 | static __poll_t unix_dgram_poll_mask(struct socket *sock, __poll_t events) | 2668 | static __poll_t unix_dgram_poll(struct file *file, struct socket *sock, |
2669 | poll_table *wait) | ||
2665 | { | 2670 | { |
2666 | struct sock *sk = sock->sk, *other; | 2671 | struct sock *sk = sock->sk, *other; |
2667 | int writable; | 2672 | unsigned int writable; |
2668 | __poll_t mask = 0; | 2673 | __poll_t mask; |
2674 | |||
2675 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
2676 | mask = 0; | ||
2669 | 2677 | ||
2670 | /* exceptional events? */ | 2678 | /* exceptional events? */ |
2671 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) | 2679 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) |
@@ -2691,7 +2699,7 @@ static __poll_t unix_dgram_poll_mask(struct socket *sock, __poll_t events) | |||
2691 | } | 2699 | } |
2692 | 2700 | ||
2693 | /* No write status requested, avoid expensive OUT tests. */ | 2701 | /* No write status requested, avoid expensive OUT tests. */ |
2694 | if (!(events & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT))) | 2702 | if (!(poll_requested_events(wait) & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT))) |
2695 | return mask; | 2703 | return mask; |
2696 | 2704 | ||
2697 | writable = unix_writable(sk); | 2705 | writable = unix_writable(sk); |