diff options
80 files changed, 301 insertions, 450 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 2c391338c675..37bf0a9de75c 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking | |||
@@ -441,8 +441,6 @@ prototypes: | |||
441 | int (*iterate) (struct file *, struct dir_context *); | 441 | int (*iterate) (struct file *, struct dir_context *); |
442 | int (*iterate_shared) (struct file *, struct dir_context *); | 442 | int (*iterate_shared) (struct file *, struct dir_context *); |
443 | __poll_t (*poll) (struct file *, struct poll_table_struct *); | 443 | __poll_t (*poll) (struct file *, struct poll_table_struct *); |
444 | struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t); | ||
445 | __poll_t (*poll_mask) (struct file *, __poll_t); | ||
446 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); | 444 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); |
447 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); | 445 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); |
448 | int (*mmap) (struct file *, struct vm_area_struct *); | 446 | int (*mmap) (struct file *, struct vm_area_struct *); |
@@ -473,7 +471,7 @@ prototypes: | |||
473 | }; | 471 | }; |
474 | 472 | ||
475 | locking rules: | 473 | locking rules: |
476 | All except for ->poll_mask may block. | 474 | All may block. |
477 | 475 | ||
478 | ->llseek() locking has moved from llseek to the individual llseek | 476 | ->llseek() locking has moved from llseek to the individual llseek |
479 | implementations. If your fs is not using generic_file_llseek, you | 477 | implementations. If your fs is not using generic_file_llseek, you |
@@ -505,9 +503,6 @@ in sys_read() and friends. | |||
505 | the lease within the individual filesystem to record the result of the | 503 | the lease within the individual filesystem to record the result of the |
506 | operation | 504 | operation |
507 | 505 | ||
508 | ->poll_mask can be called with or without the waitqueue lock for the waitqueue | ||
509 | returned from ->get_poll_head. | ||
510 | |||
511 | --------------------------- dquot_operations ------------------------------- | 506 | --------------------------- dquot_operations ------------------------------- |
512 | prototypes: | 507 | prototypes: |
513 | int (*write_dquot) (struct dquot *); | 508 | int (*write_dquot) (struct dquot *); |
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 829a7b7857a4..f608180ad59d 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt | |||
@@ -857,8 +857,6 @@ struct file_operations { | |||
857 | ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); | 857 | ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); |
858 | int (*iterate) (struct file *, struct dir_context *); | 858 | int (*iterate) (struct file *, struct dir_context *); |
859 | __poll_t (*poll) (struct file *, struct poll_table_struct *); | 859 | __poll_t (*poll) (struct file *, struct poll_table_struct *); |
860 | struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t); | ||
861 | __poll_t (*poll_mask) (struct file *, __poll_t); | ||
862 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); | 860 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); |
863 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); | 861 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); |
864 | int (*mmap) (struct file *, struct vm_area_struct *); | 862 | int (*mmap) (struct file *, struct vm_area_struct *); |
@@ -903,17 +901,6 @@ otherwise noted. | |||
903 | activity on this file and (optionally) go to sleep until there | 901 | activity on this file and (optionally) go to sleep until there |
904 | is activity. Called by the select(2) and poll(2) system calls | 902 | is activity. Called by the select(2) and poll(2) system calls |
905 | 903 | ||
906 | get_poll_head: Returns the struct wait_queue_head that callers can | ||
907 | wait on. Callers need to check the returned events using ->poll_mask | ||
908 | once woken. Can return NULL to indicate polling is not supported, | ||
909 | or any error code using the ERR_PTR convention to indicate that a | ||
910 | grave error occured and ->poll_mask shall not be called. | ||
911 | |||
912 | poll_mask: return the mask of EPOLL* values describing the file descriptor | ||
913 | state. Called either before going to sleep on the waitqueue returned by | ||
914 | get_poll_head, or after it has been woken. If ->get_poll_head and | ||
915 | ->poll_mask are implemented ->poll does not need to be implement. | ||
916 | |||
917 | unlocked_ioctl: called by the ioctl(2) system call. | 904 | unlocked_ioctl: called by the ioctl(2) system call. |
918 | 905 | ||
919 | compat_ioctl: called by the ioctl(2) system call when 32 bit system calls | 906 | compat_ioctl: called by the ioctl(2) system call when 32 bit system calls |
diff --git a/crypto/af_alg.c b/crypto/af_alg.c index 49fa8582138b..314c52c967e5 100644 --- a/crypto/af_alg.c +++ b/crypto/af_alg.c | |||
@@ -1060,12 +1060,19 @@ void af_alg_async_cb(struct crypto_async_request *_req, int err) | |||
1060 | } | 1060 | } |
1061 | EXPORT_SYMBOL_GPL(af_alg_async_cb); | 1061 | EXPORT_SYMBOL_GPL(af_alg_async_cb); |
1062 | 1062 | ||
1063 | __poll_t af_alg_poll_mask(struct socket *sock, __poll_t events) | 1063 | /** |
1064 | * af_alg_poll - poll system call handler | ||
1065 | */ | ||
1066 | __poll_t af_alg_poll(struct file *file, struct socket *sock, | ||
1067 | poll_table *wait) | ||
1064 | { | 1068 | { |
1065 | struct sock *sk = sock->sk; | 1069 | struct sock *sk = sock->sk; |
1066 | struct alg_sock *ask = alg_sk(sk); | 1070 | struct alg_sock *ask = alg_sk(sk); |
1067 | struct af_alg_ctx *ctx = ask->private; | 1071 | struct af_alg_ctx *ctx = ask->private; |
1068 | __poll_t mask = 0; | 1072 | __poll_t mask; |
1073 | |||
1074 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
1075 | mask = 0; | ||
1069 | 1076 | ||
1070 | if (!ctx->more || ctx->used) | 1077 | if (!ctx->more || ctx->used) |
1071 | mask |= EPOLLIN | EPOLLRDNORM; | 1078 | mask |= EPOLLIN | EPOLLRDNORM; |
@@ -1075,7 +1082,7 @@ __poll_t af_alg_poll_mask(struct socket *sock, __poll_t events) | |||
1075 | 1082 | ||
1076 | return mask; | 1083 | return mask; |
1077 | } | 1084 | } |
1078 | EXPORT_SYMBOL_GPL(af_alg_poll_mask); | 1085 | EXPORT_SYMBOL_GPL(af_alg_poll); |
1079 | 1086 | ||
1080 | /** | 1087 | /** |
1081 | * af_alg_alloc_areq - allocate struct af_alg_async_req | 1088 | * af_alg_alloc_areq - allocate struct af_alg_async_req |
diff --git a/crypto/algif_aead.c b/crypto/algif_aead.c index 825524f27438..c40a8c7ee8ae 100644 --- a/crypto/algif_aead.c +++ b/crypto/algif_aead.c | |||
@@ -375,7 +375,7 @@ static struct proto_ops algif_aead_ops = { | |||
375 | .sendmsg = aead_sendmsg, | 375 | .sendmsg = aead_sendmsg, |
376 | .sendpage = af_alg_sendpage, | 376 | .sendpage = af_alg_sendpage, |
377 | .recvmsg = aead_recvmsg, | 377 | .recvmsg = aead_recvmsg, |
378 | .poll_mask = af_alg_poll_mask, | 378 | .poll = af_alg_poll, |
379 | }; | 379 | }; |
380 | 380 | ||
381 | static int aead_check_key(struct socket *sock) | 381 | static int aead_check_key(struct socket *sock) |
@@ -471,7 +471,7 @@ static struct proto_ops algif_aead_ops_nokey = { | |||
471 | .sendmsg = aead_sendmsg_nokey, | 471 | .sendmsg = aead_sendmsg_nokey, |
472 | .sendpage = aead_sendpage_nokey, | 472 | .sendpage = aead_sendpage_nokey, |
473 | .recvmsg = aead_recvmsg_nokey, | 473 | .recvmsg = aead_recvmsg_nokey, |
474 | .poll_mask = af_alg_poll_mask, | 474 | .poll = af_alg_poll, |
475 | }; | 475 | }; |
476 | 476 | ||
477 | static void *aead_bind(const char *name, u32 type, u32 mask) | 477 | static void *aead_bind(const char *name, u32 type, u32 mask) |
diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c index 4c04eb9888ad..cfdaab2b7d76 100644 --- a/crypto/algif_skcipher.c +++ b/crypto/algif_skcipher.c | |||
@@ -206,7 +206,7 @@ static struct proto_ops algif_skcipher_ops = { | |||
206 | .sendmsg = skcipher_sendmsg, | 206 | .sendmsg = skcipher_sendmsg, |
207 | .sendpage = af_alg_sendpage, | 207 | .sendpage = af_alg_sendpage, |
208 | .recvmsg = skcipher_recvmsg, | 208 | .recvmsg = skcipher_recvmsg, |
209 | .poll_mask = af_alg_poll_mask, | 209 | .poll = af_alg_poll, |
210 | }; | 210 | }; |
211 | 211 | ||
212 | static int skcipher_check_key(struct socket *sock) | 212 | static int skcipher_check_key(struct socket *sock) |
@@ -302,7 +302,7 @@ static struct proto_ops algif_skcipher_ops_nokey = { | |||
302 | .sendmsg = skcipher_sendmsg_nokey, | 302 | .sendmsg = skcipher_sendmsg_nokey, |
303 | .sendpage = skcipher_sendpage_nokey, | 303 | .sendpage = skcipher_sendpage_nokey, |
304 | .recvmsg = skcipher_recvmsg_nokey, | 304 | .recvmsg = skcipher_recvmsg_nokey, |
305 | .poll_mask = af_alg_poll_mask, | 305 | .poll = af_alg_poll, |
306 | }; | 306 | }; |
307 | 307 | ||
308 | static void *skcipher_bind(const char *name, u32 type, u32 mask) | 308 | static void *skcipher_bind(const char *name, u32 type, u32 mask) |
diff --git a/drivers/char/random.c b/drivers/char/random.c index a8fb0020ba5c..cd888d4ee605 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -402,7 +402,8 @@ static struct poolinfo { | |||
402 | /* | 402 | /* |
403 | * Static global variables | 403 | * Static global variables |
404 | */ | 404 | */ |
405 | static DECLARE_WAIT_QUEUE_HEAD(random_wait); | 405 | static DECLARE_WAIT_QUEUE_HEAD(random_read_wait); |
406 | static DECLARE_WAIT_QUEUE_HEAD(random_write_wait); | ||
406 | static struct fasync_struct *fasync; | 407 | static struct fasync_struct *fasync; |
407 | 408 | ||
408 | static DEFINE_SPINLOCK(random_ready_list_lock); | 409 | static DEFINE_SPINLOCK(random_ready_list_lock); |
@@ -721,8 +722,8 @@ retry: | |||
721 | 722 | ||
722 | /* should we wake readers? */ | 723 | /* should we wake readers? */ |
723 | if (entropy_bits >= random_read_wakeup_bits && | 724 | if (entropy_bits >= random_read_wakeup_bits && |
724 | wq_has_sleeper(&random_wait)) { | 725 | wq_has_sleeper(&random_read_wait)) { |
725 | wake_up_interruptible_poll(&random_wait, POLLIN); | 726 | wake_up_interruptible(&random_read_wait); |
726 | kill_fasync(&fasync, SIGIO, POLL_IN); | 727 | kill_fasync(&fasync, SIGIO, POLL_IN); |
727 | } | 728 | } |
728 | /* If the input pool is getting full, send some | 729 | /* If the input pool is getting full, send some |
@@ -1396,7 +1397,7 @@ retry: | |||
1396 | trace_debit_entropy(r->name, 8 * ibytes); | 1397 | trace_debit_entropy(r->name, 8 * ibytes); |
1397 | if (ibytes && | 1398 | if (ibytes && |
1398 | (r->entropy_count >> ENTROPY_SHIFT) < random_write_wakeup_bits) { | 1399 | (r->entropy_count >> ENTROPY_SHIFT) < random_write_wakeup_bits) { |
1399 | wake_up_interruptible_poll(&random_wait, POLLOUT); | 1400 | wake_up_interruptible(&random_write_wait); |
1400 | kill_fasync(&fasync, SIGIO, POLL_OUT); | 1401 | kill_fasync(&fasync, SIGIO, POLL_OUT); |
1401 | } | 1402 | } |
1402 | 1403 | ||
@@ -1838,7 +1839,7 @@ _random_read(int nonblock, char __user *buf, size_t nbytes) | |||
1838 | if (nonblock) | 1839 | if (nonblock) |
1839 | return -EAGAIN; | 1840 | return -EAGAIN; |
1840 | 1841 | ||
1841 | wait_event_interruptible(random_wait, | 1842 | wait_event_interruptible(random_read_wait, |
1842 | ENTROPY_BITS(&input_pool) >= | 1843 | ENTROPY_BITS(&input_pool) >= |
1843 | random_read_wakeup_bits); | 1844 | random_read_wakeup_bits); |
1844 | if (signal_pending(current)) | 1845 | if (signal_pending(current)) |
@@ -1875,17 +1876,14 @@ urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) | |||
1875 | return ret; | 1876 | return ret; |
1876 | } | 1877 | } |
1877 | 1878 | ||
1878 | static struct wait_queue_head * | ||
1879 | random_get_poll_head(struct file *file, __poll_t events) | ||
1880 | { | ||
1881 | return &random_wait; | ||
1882 | } | ||
1883 | |||
1884 | static __poll_t | 1879 | static __poll_t |
1885 | random_poll_mask(struct file *file, __poll_t events) | 1880 | random_poll(struct file *file, poll_table * wait) |
1886 | { | 1881 | { |
1887 | __poll_t mask = 0; | 1882 | __poll_t mask; |
1888 | 1883 | ||
1884 | poll_wait(file, &random_read_wait, wait); | ||
1885 | poll_wait(file, &random_write_wait, wait); | ||
1886 | mask = 0; | ||
1889 | if (ENTROPY_BITS(&input_pool) >= random_read_wakeup_bits) | 1887 | if (ENTROPY_BITS(&input_pool) >= random_read_wakeup_bits) |
1890 | mask |= EPOLLIN | EPOLLRDNORM; | 1888 | mask |= EPOLLIN | EPOLLRDNORM; |
1891 | if (ENTROPY_BITS(&input_pool) < random_write_wakeup_bits) | 1889 | if (ENTROPY_BITS(&input_pool) < random_write_wakeup_bits) |
@@ -1992,8 +1990,7 @@ static int random_fasync(int fd, struct file *filp, int on) | |||
1992 | const struct file_operations random_fops = { | 1990 | const struct file_operations random_fops = { |
1993 | .read = random_read, | 1991 | .read = random_read, |
1994 | .write = random_write, | 1992 | .write = random_write, |
1995 | .get_poll_head = random_get_poll_head, | 1993 | .poll = random_poll, |
1996 | .poll_mask = random_poll_mask, | ||
1997 | .unlocked_ioctl = random_ioctl, | 1994 | .unlocked_ioctl = random_ioctl, |
1998 | .fasync = random_fasync, | 1995 | .fasync = random_fasync, |
1999 | .llseek = noop_llseek, | 1996 | .llseek = noop_llseek, |
@@ -2326,7 +2323,7 @@ void add_hwgenerator_randomness(const char *buffer, size_t count, | |||
2326 | * We'll be woken up again once below random_write_wakeup_thresh, | 2323 | * We'll be woken up again once below random_write_wakeup_thresh, |
2327 | * or when the calling thread is about to terminate. | 2324 | * or when the calling thread is about to terminate. |
2328 | */ | 2325 | */ |
2329 | wait_event_interruptible(random_wait, kthread_should_stop() || | 2326 | wait_event_interruptible(random_write_wait, kthread_should_stop() || |
2330 | ENTROPY_BITS(&input_pool) <= random_write_wakeup_bits); | 2327 | ENTROPY_BITS(&input_pool) <= random_write_wakeup_bits); |
2331 | mix_pool_bytes(poolp, buffer, count); | 2328 | mix_pool_bytes(poolp, buffer, count); |
2332 | credit_entropy_bits(poolp, entropy); | 2329 | credit_entropy_bits(poolp, entropy); |
diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c index 98f90aadd141..18c0a1281914 100644 --- a/drivers/isdn/mISDN/socket.c +++ b/drivers/isdn/mISDN/socket.c | |||
@@ -588,7 +588,7 @@ static const struct proto_ops data_sock_ops = { | |||
588 | .getname = data_sock_getname, | 588 | .getname = data_sock_getname, |
589 | .sendmsg = mISDN_sock_sendmsg, | 589 | .sendmsg = mISDN_sock_sendmsg, |
590 | .recvmsg = mISDN_sock_recvmsg, | 590 | .recvmsg = mISDN_sock_recvmsg, |
591 | .poll_mask = datagram_poll_mask, | 591 | .poll = datagram_poll, |
592 | .listen = sock_no_listen, | 592 | .listen = sock_no_listen, |
593 | .shutdown = sock_no_shutdown, | 593 | .shutdown = sock_no_shutdown, |
594 | .setsockopt = data_sock_setsockopt, | 594 | .setsockopt = data_sock_setsockopt, |
diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c index de51e8f70f44..ce61231e96ea 100644 --- a/drivers/net/ppp/pppoe.c +++ b/drivers/net/ppp/pppoe.c | |||
@@ -1107,7 +1107,7 @@ static const struct proto_ops pppoe_ops = { | |||
1107 | .socketpair = sock_no_socketpair, | 1107 | .socketpair = sock_no_socketpair, |
1108 | .accept = sock_no_accept, | 1108 | .accept = sock_no_accept, |
1109 | .getname = pppoe_getname, | 1109 | .getname = pppoe_getname, |
1110 | .poll_mask = datagram_poll_mask, | 1110 | .poll = datagram_poll, |
1111 | .listen = sock_no_listen, | 1111 | .listen = sock_no_listen, |
1112 | .shutdown = sock_no_shutdown, | 1112 | .shutdown = sock_no_shutdown, |
1113 | .setsockopt = sock_no_setsockopt, | 1113 | .setsockopt = sock_no_setsockopt, |
@@ -5,7 +5,6 @@ | |||
5 | * Implements an efficient asynchronous io interface. | 5 | * Implements an efficient asynchronous io interface. |
6 | * | 6 | * |
7 | * Copyright 2000, 2001, 2002 Red Hat, Inc. All Rights Reserved. | 7 | * Copyright 2000, 2001, 2002 Red Hat, Inc. All Rights Reserved. |
8 | * Copyright 2018 Christoph Hellwig. | ||
9 | * | 8 | * |
10 | * See ../COPYING for licensing terms. | 9 | * See ../COPYING for licensing terms. |
11 | */ | 10 | */ |
@@ -165,22 +164,10 @@ struct fsync_iocb { | |||
165 | bool datasync; | 164 | bool datasync; |
166 | }; | 165 | }; |
167 | 166 | ||
168 | struct poll_iocb { | ||
169 | struct file *file; | ||
170 | __poll_t events; | ||
171 | struct wait_queue_head *head; | ||
172 | |||
173 | union { | ||
174 | struct wait_queue_entry wait; | ||
175 | struct work_struct work; | ||
176 | }; | ||
177 | }; | ||
178 | |||
179 | struct aio_kiocb { | 167 | struct aio_kiocb { |
180 | union { | 168 | union { |
181 | struct kiocb rw; | 169 | struct kiocb rw; |
182 | struct fsync_iocb fsync; | 170 | struct fsync_iocb fsync; |
183 | struct poll_iocb poll; | ||
184 | }; | 171 | }; |
185 | 172 | ||
186 | struct kioctx *ki_ctx; | 173 | struct kioctx *ki_ctx; |
@@ -1590,6 +1577,7 @@ static int aio_fsync(struct fsync_iocb *req, struct iocb *iocb, bool datasync) | |||
1590 | if (unlikely(iocb->aio_buf || iocb->aio_offset || iocb->aio_nbytes || | 1577 | if (unlikely(iocb->aio_buf || iocb->aio_offset || iocb->aio_nbytes || |
1591 | iocb->aio_rw_flags)) | 1578 | iocb->aio_rw_flags)) |
1592 | return -EINVAL; | 1579 | return -EINVAL; |
1580 | |||
1593 | req->file = fget(iocb->aio_fildes); | 1581 | req->file = fget(iocb->aio_fildes); |
1594 | if (unlikely(!req->file)) | 1582 | if (unlikely(!req->file)) |
1595 | return -EBADF; | 1583 | return -EBADF; |
@@ -1604,137 +1592,6 @@ static int aio_fsync(struct fsync_iocb *req, struct iocb *iocb, bool datasync) | |||
1604 | return 0; | 1592 | return 0; |
1605 | } | 1593 | } |
1606 | 1594 | ||
1607 | /* need to use list_del_init so we can check if item was present */ | ||
1608 | static inline bool __aio_poll_remove(struct poll_iocb *req) | ||
1609 | { | ||
1610 | if (list_empty(&req->wait.entry)) | ||
1611 | return false; | ||
1612 | list_del_init(&req->wait.entry); | ||
1613 | return true; | ||
1614 | } | ||
1615 | |||
1616 | static inline void __aio_poll_complete(struct aio_kiocb *iocb, __poll_t mask) | ||
1617 | { | ||
1618 | fput(iocb->poll.file); | ||
1619 | aio_complete(iocb, mangle_poll(mask), 0); | ||
1620 | } | ||
1621 | |||
1622 | static void aio_poll_work(struct work_struct *work) | ||
1623 | { | ||
1624 | struct aio_kiocb *iocb = container_of(work, struct aio_kiocb, poll.work); | ||
1625 | |||
1626 | if (!list_empty_careful(&iocb->ki_list)) | ||
1627 | aio_remove_iocb(iocb); | ||
1628 | __aio_poll_complete(iocb, iocb->poll.events); | ||
1629 | } | ||
1630 | |||
1631 | static int aio_poll_cancel(struct kiocb *iocb) | ||
1632 | { | ||
1633 | struct aio_kiocb *aiocb = container_of(iocb, struct aio_kiocb, rw); | ||
1634 | struct poll_iocb *req = &aiocb->poll; | ||
1635 | struct wait_queue_head *head = req->head; | ||
1636 | bool found = false; | ||
1637 | |||
1638 | spin_lock(&head->lock); | ||
1639 | found = __aio_poll_remove(req); | ||
1640 | spin_unlock(&head->lock); | ||
1641 | |||
1642 | if (found) { | ||
1643 | req->events = 0; | ||
1644 | INIT_WORK(&req->work, aio_poll_work); | ||
1645 | schedule_work(&req->work); | ||
1646 | } | ||
1647 | return 0; | ||
1648 | } | ||
1649 | |||
1650 | static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync, | ||
1651 | void *key) | ||
1652 | { | ||
1653 | struct poll_iocb *req = container_of(wait, struct poll_iocb, wait); | ||
1654 | struct aio_kiocb *iocb = container_of(req, struct aio_kiocb, poll); | ||
1655 | struct file *file = req->file; | ||
1656 | __poll_t mask = key_to_poll(key); | ||
1657 | |||
1658 | assert_spin_locked(&req->head->lock); | ||
1659 | |||
1660 | /* for instances that support it check for an event match first: */ | ||
1661 | if (mask && !(mask & req->events)) | ||
1662 | return 0; | ||
1663 | |||
1664 | mask = file->f_op->poll_mask(file, req->events) & req->events; | ||
1665 | if (!mask) | ||
1666 | return 0; | ||
1667 | |||
1668 | __aio_poll_remove(req); | ||
1669 | |||
1670 | /* | ||
1671 | * Try completing without a context switch if we can acquire ctx_lock | ||
1672 | * without spinning. Otherwise we need to defer to a workqueue to | ||
1673 | * avoid a deadlock due to the lock order. | ||
1674 | */ | ||
1675 | if (spin_trylock(&iocb->ki_ctx->ctx_lock)) { | ||
1676 | list_del_init(&iocb->ki_list); | ||
1677 | spin_unlock(&iocb->ki_ctx->ctx_lock); | ||
1678 | |||
1679 | __aio_poll_complete(iocb, mask); | ||
1680 | } else { | ||
1681 | req->events = mask; | ||
1682 | INIT_WORK(&req->work, aio_poll_work); | ||
1683 | schedule_work(&req->work); | ||
1684 | } | ||
1685 | |||
1686 | return 1; | ||
1687 | } | ||
1688 | |||
1689 | static ssize_t aio_poll(struct aio_kiocb *aiocb, struct iocb *iocb) | ||
1690 | { | ||
1691 | struct kioctx *ctx = aiocb->ki_ctx; | ||
1692 | struct poll_iocb *req = &aiocb->poll; | ||
1693 | __poll_t mask; | ||
1694 | |||
1695 | /* reject any unknown events outside the normal event mask. */ | ||
1696 | if ((u16)iocb->aio_buf != iocb->aio_buf) | ||
1697 | return -EINVAL; | ||
1698 | /* reject fields that are not defined for poll */ | ||
1699 | if (iocb->aio_offset || iocb->aio_nbytes || iocb->aio_rw_flags) | ||
1700 | return -EINVAL; | ||
1701 | |||
1702 | req->events = demangle_poll(iocb->aio_buf) | EPOLLERR | EPOLLHUP; | ||
1703 | req->file = fget(iocb->aio_fildes); | ||
1704 | if (unlikely(!req->file)) | ||
1705 | return -EBADF; | ||
1706 | if (!file_has_poll_mask(req->file)) | ||
1707 | goto out_fail; | ||
1708 | |||
1709 | req->head = req->file->f_op->get_poll_head(req->file, req->events); | ||
1710 | if (!req->head) | ||
1711 | goto out_fail; | ||
1712 | if (IS_ERR(req->head)) { | ||
1713 | mask = EPOLLERR; | ||
1714 | goto done; | ||
1715 | } | ||
1716 | |||
1717 | init_waitqueue_func_entry(&req->wait, aio_poll_wake); | ||
1718 | aiocb->ki_cancel = aio_poll_cancel; | ||
1719 | |||
1720 | spin_lock_irq(&ctx->ctx_lock); | ||
1721 | spin_lock(&req->head->lock); | ||
1722 | mask = req->file->f_op->poll_mask(req->file, req->events) & req->events; | ||
1723 | if (!mask) { | ||
1724 | __add_wait_queue(req->head, &req->wait); | ||
1725 | list_add_tail(&aiocb->ki_list, &ctx->active_reqs); | ||
1726 | } | ||
1727 | spin_unlock(&req->head->lock); | ||
1728 | spin_unlock_irq(&ctx->ctx_lock); | ||
1729 | done: | ||
1730 | if (mask) | ||
1731 | __aio_poll_complete(aiocb, mask); | ||
1732 | return 0; | ||
1733 | out_fail: | ||
1734 | fput(req->file); | ||
1735 | return -EINVAL; /* same as no support for IOCB_CMD_POLL */ | ||
1736 | } | ||
1737 | |||
1738 | static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, | 1595 | static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, |
1739 | bool compat) | 1596 | bool compat) |
1740 | { | 1597 | { |
@@ -1808,9 +1665,6 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, | |||
1808 | case IOCB_CMD_FDSYNC: | 1665 | case IOCB_CMD_FDSYNC: |
1809 | ret = aio_fsync(&req->fsync, &iocb, true); | 1666 | ret = aio_fsync(&req->fsync, &iocb, true); |
1810 | break; | 1667 | break; |
1811 | case IOCB_CMD_POLL: | ||
1812 | ret = aio_poll(req, &iocb); | ||
1813 | break; | ||
1814 | default: | 1668 | default: |
1815 | pr_debug("invalid aio operation %d\n", iocb.aio_lio_opcode); | 1669 | pr_debug("invalid aio operation %d\n", iocb.aio_lio_opcode); |
1816 | ret = -EINVAL; | 1670 | ret = -EINVAL; |
diff --git a/fs/eventfd.c b/fs/eventfd.c index ceb1031f1cac..08d3bd602f73 100644 --- a/fs/eventfd.c +++ b/fs/eventfd.c | |||
@@ -101,20 +101,14 @@ static int eventfd_release(struct inode *inode, struct file *file) | |||
101 | return 0; | 101 | return 0; |
102 | } | 102 | } |
103 | 103 | ||
104 | static struct wait_queue_head * | 104 | static __poll_t eventfd_poll(struct file *file, poll_table *wait) |
105 | eventfd_get_poll_head(struct file *file, __poll_t events) | ||
106 | { | ||
107 | struct eventfd_ctx *ctx = file->private_data; | ||
108 | |||
109 | return &ctx->wqh; | ||
110 | } | ||
111 | |||
112 | static __poll_t eventfd_poll_mask(struct file *file, __poll_t eventmask) | ||
113 | { | 105 | { |
114 | struct eventfd_ctx *ctx = file->private_data; | 106 | struct eventfd_ctx *ctx = file->private_data; |
115 | __poll_t events = 0; | 107 | __poll_t events = 0; |
116 | u64 count; | 108 | u64 count; |
117 | 109 | ||
110 | poll_wait(file, &ctx->wqh, wait); | ||
111 | |||
118 | /* | 112 | /* |
119 | * All writes to ctx->count occur within ctx->wqh.lock. This read | 113 | * All writes to ctx->count occur within ctx->wqh.lock. This read |
120 | * can be done outside ctx->wqh.lock because we know that poll_wait | 114 | * can be done outside ctx->wqh.lock because we know that poll_wait |
@@ -156,11 +150,11 @@ static __poll_t eventfd_poll_mask(struct file *file, __poll_t eventmask) | |||
156 | count = READ_ONCE(ctx->count); | 150 | count = READ_ONCE(ctx->count); |
157 | 151 | ||
158 | if (count > 0) | 152 | if (count > 0) |
159 | events |= (EPOLLIN & eventmask); | 153 | events |= EPOLLIN; |
160 | if (count == ULLONG_MAX) | 154 | if (count == ULLONG_MAX) |
161 | events |= EPOLLERR; | 155 | events |= EPOLLERR; |
162 | if (ULLONG_MAX - 1 > count) | 156 | if (ULLONG_MAX - 1 > count) |
163 | events |= (EPOLLOUT & eventmask); | 157 | events |= EPOLLOUT; |
164 | 158 | ||
165 | return events; | 159 | return events; |
166 | } | 160 | } |
@@ -311,8 +305,7 @@ static const struct file_operations eventfd_fops = { | |||
311 | .show_fdinfo = eventfd_show_fdinfo, | 305 | .show_fdinfo = eventfd_show_fdinfo, |
312 | #endif | 306 | #endif |
313 | .release = eventfd_release, | 307 | .release = eventfd_release, |
314 | .get_poll_head = eventfd_get_poll_head, | 308 | .poll = eventfd_poll, |
315 | .poll_mask = eventfd_poll_mask, | ||
316 | .read = eventfd_read, | 309 | .read = eventfd_read, |
317 | .write = eventfd_write, | 310 | .write = eventfd_write, |
318 | .llseek = noop_llseek, | 311 | .llseek = noop_llseek, |
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index ea4436f409fb..67db22fe99c5 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c | |||
@@ -922,18 +922,14 @@ static __poll_t ep_read_events_proc(struct eventpoll *ep, struct list_head *head | |||
922 | return 0; | 922 | return 0; |
923 | } | 923 | } |
924 | 924 | ||
925 | static struct wait_queue_head *ep_eventpoll_get_poll_head(struct file *file, | 925 | static __poll_t ep_eventpoll_poll(struct file *file, poll_table *wait) |
926 | __poll_t eventmask) | ||
927 | { | ||
928 | struct eventpoll *ep = file->private_data; | ||
929 | return &ep->poll_wait; | ||
930 | } | ||
931 | |||
932 | static __poll_t ep_eventpoll_poll_mask(struct file *file, __poll_t eventmask) | ||
933 | { | 926 | { |
934 | struct eventpoll *ep = file->private_data; | 927 | struct eventpoll *ep = file->private_data; |
935 | int depth = 0; | 928 | int depth = 0; |
936 | 929 | ||
930 | /* Insert inside our poll wait queue */ | ||
931 | poll_wait(file, &ep->poll_wait, wait); | ||
932 | |||
937 | /* | 933 | /* |
938 | * Proceed to find out if wanted events are really available inside | 934 | * Proceed to find out if wanted events are really available inside |
939 | * the ready list. | 935 | * the ready list. |
@@ -972,8 +968,7 @@ static const struct file_operations eventpoll_fops = { | |||
972 | .show_fdinfo = ep_show_fdinfo, | 968 | .show_fdinfo = ep_show_fdinfo, |
973 | #endif | 969 | #endif |
974 | .release = ep_eventpoll_release, | 970 | .release = ep_eventpoll_release, |
975 | .get_poll_head = ep_eventpoll_get_poll_head, | 971 | .poll = ep_eventpoll_poll, |
976 | .poll_mask = ep_eventpoll_poll_mask, | ||
977 | .llseek = noop_llseek, | 972 | .llseek = noop_llseek, |
978 | }; | 973 | }; |
979 | 974 | ||
@@ -509,22 +509,19 @@ static long pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
509 | } | 509 | } |
510 | } | 510 | } |
511 | 511 | ||
512 | static struct wait_queue_head * | ||
513 | pipe_get_poll_head(struct file *filp, __poll_t events) | ||
514 | { | ||
515 | struct pipe_inode_info *pipe = filp->private_data; | ||
516 | |||
517 | return &pipe->wait; | ||
518 | } | ||
519 | |||
520 | /* No kernel lock held - fine */ | 512 | /* No kernel lock held - fine */ |
521 | static __poll_t pipe_poll_mask(struct file *filp, __poll_t events) | 513 | static __poll_t |
514 | pipe_poll(struct file *filp, poll_table *wait) | ||
522 | { | 515 | { |
516 | __poll_t mask; | ||
523 | struct pipe_inode_info *pipe = filp->private_data; | 517 | struct pipe_inode_info *pipe = filp->private_data; |
524 | int nrbufs = pipe->nrbufs; | 518 | int nrbufs; |
525 | __poll_t mask = 0; | 519 | |
520 | poll_wait(filp, &pipe->wait, wait); | ||
526 | 521 | ||
527 | /* Reading only -- no need for acquiring the semaphore. */ | 522 | /* Reading only -- no need for acquiring the semaphore. */ |
523 | nrbufs = pipe->nrbufs; | ||
524 | mask = 0; | ||
528 | if (filp->f_mode & FMODE_READ) { | 525 | if (filp->f_mode & FMODE_READ) { |
529 | mask = (nrbufs > 0) ? EPOLLIN | EPOLLRDNORM : 0; | 526 | mask = (nrbufs > 0) ? EPOLLIN | EPOLLRDNORM : 0; |
530 | if (!pipe->writers && filp->f_version != pipe->w_counter) | 527 | if (!pipe->writers && filp->f_version != pipe->w_counter) |
@@ -1023,8 +1020,7 @@ const struct file_operations pipefifo_fops = { | |||
1023 | .llseek = no_llseek, | 1020 | .llseek = no_llseek, |
1024 | .read_iter = pipe_read, | 1021 | .read_iter = pipe_read, |
1025 | .write_iter = pipe_write, | 1022 | .write_iter = pipe_write, |
1026 | .get_poll_head = pipe_get_poll_head, | 1023 | .poll = pipe_poll, |
1027 | .poll_mask = pipe_poll_mask, | ||
1028 | .unlocked_ioctl = pipe_ioctl, | 1024 | .unlocked_ioctl = pipe_ioctl, |
1029 | .release = pipe_release, | 1025 | .release = pipe_release, |
1030 | .fasync = pipe_fasync, | 1026 | .fasync = pipe_fasync, |
diff --git a/fs/select.c b/fs/select.c index 317891ff8165..4a6b6e4b21cb 100644 --- a/fs/select.c +++ b/fs/select.c | |||
@@ -34,29 +34,6 @@ | |||
34 | 34 | ||
35 | #include <linux/uaccess.h> | 35 | #include <linux/uaccess.h> |
36 | 36 | ||
37 | __poll_t vfs_poll(struct file *file, struct poll_table_struct *pt) | ||
38 | { | ||
39 | if (file->f_op->poll) { | ||
40 | return file->f_op->poll(file, pt); | ||
41 | } else if (file_has_poll_mask(file)) { | ||
42 | unsigned int events = poll_requested_events(pt); | ||
43 | struct wait_queue_head *head; | ||
44 | |||
45 | if (pt && pt->_qproc) { | ||
46 | head = file->f_op->get_poll_head(file, events); | ||
47 | if (!head) | ||
48 | return DEFAULT_POLLMASK; | ||
49 | if (IS_ERR(head)) | ||
50 | return EPOLLERR; | ||
51 | pt->_qproc(file, head, pt); | ||
52 | } | ||
53 | |||
54 | return file->f_op->poll_mask(file, events); | ||
55 | } else { | ||
56 | return DEFAULT_POLLMASK; | ||
57 | } | ||
58 | } | ||
59 | EXPORT_SYMBOL_GPL(vfs_poll); | ||
60 | 37 | ||
61 | /* | 38 | /* |
62 | * Estimate expected accuracy in ns from a timeval. | 39 | * Estimate expected accuracy in ns from a timeval. |
diff --git a/fs/timerfd.c b/fs/timerfd.c index d84a2bee4f82..cdad49da3ff7 100644 --- a/fs/timerfd.c +++ b/fs/timerfd.c | |||
@@ -226,20 +226,21 @@ static int timerfd_release(struct inode *inode, struct file *file) | |||
226 | kfree_rcu(ctx, rcu); | 226 | kfree_rcu(ctx, rcu); |
227 | return 0; | 227 | return 0; |
228 | } | 228 | } |
229 | 229 | ||
230 | static struct wait_queue_head *timerfd_get_poll_head(struct file *file, | 230 | static __poll_t timerfd_poll(struct file *file, poll_table *wait) |
231 | __poll_t eventmask) | ||
232 | { | 231 | { |
233 | struct timerfd_ctx *ctx = file->private_data; | 232 | struct timerfd_ctx *ctx = file->private_data; |
233 | __poll_t events = 0; | ||
234 | unsigned long flags; | ||
234 | 235 | ||
235 | return &ctx->wqh; | 236 | poll_wait(file, &ctx->wqh, wait); |
236 | } | ||
237 | 237 | ||
238 | static __poll_t timerfd_poll_mask(struct file *file, __poll_t eventmask) | 238 | spin_lock_irqsave(&ctx->wqh.lock, flags); |
239 | { | 239 | if (ctx->ticks) |
240 | struct timerfd_ctx *ctx = file->private_data; | 240 | events |= EPOLLIN; |
241 | spin_unlock_irqrestore(&ctx->wqh.lock, flags); | ||
241 | 242 | ||
242 | return ctx->ticks ? EPOLLIN : 0; | 243 | return events; |
243 | } | 244 | } |
244 | 245 | ||
245 | static ssize_t timerfd_read(struct file *file, char __user *buf, size_t count, | 246 | static ssize_t timerfd_read(struct file *file, char __user *buf, size_t count, |
@@ -363,8 +364,7 @@ static long timerfd_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
363 | 364 | ||
364 | static const struct file_operations timerfd_fops = { | 365 | static const struct file_operations timerfd_fops = { |
365 | .release = timerfd_release, | 366 | .release = timerfd_release, |
366 | .get_poll_head = timerfd_get_poll_head, | 367 | .poll = timerfd_poll, |
367 | .poll_mask = timerfd_poll_mask, | ||
368 | .read = timerfd_read, | 368 | .read = timerfd_read, |
369 | .llseek = noop_llseek, | 369 | .llseek = noop_llseek, |
370 | .show_fdinfo = timerfd_show, | 370 | .show_fdinfo = timerfd_show, |
diff --git a/include/crypto/if_alg.h b/include/crypto/if_alg.h index cc414db9da0a..482461d8931d 100644 --- a/include/crypto/if_alg.h +++ b/include/crypto/if_alg.h | |||
@@ -245,7 +245,8 @@ ssize_t af_alg_sendpage(struct socket *sock, struct page *page, | |||
245 | int offset, size_t size, int flags); | 245 | int offset, size_t size, int flags); |
246 | void af_alg_free_resources(struct af_alg_async_req *areq); | 246 | void af_alg_free_resources(struct af_alg_async_req *areq); |
247 | void af_alg_async_cb(struct crypto_async_request *_req, int err); | 247 | void af_alg_async_cb(struct crypto_async_request *_req, int err); |
248 | __poll_t af_alg_poll_mask(struct socket *sock, __poll_t events); | 248 | __poll_t af_alg_poll(struct file *file, struct socket *sock, |
249 | poll_table *wait); | ||
249 | struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk, | 250 | struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk, |
250 | unsigned int areqlen); | 251 | unsigned int areqlen); |
251 | int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags, | 252 | int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags, |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 5c91108846db..d78d146a98da 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -1720,8 +1720,6 @@ struct file_operations { | |||
1720 | int (*iterate) (struct file *, struct dir_context *); | 1720 | int (*iterate) (struct file *, struct dir_context *); |
1721 | int (*iterate_shared) (struct file *, struct dir_context *); | 1721 | int (*iterate_shared) (struct file *, struct dir_context *); |
1722 | __poll_t (*poll) (struct file *, struct poll_table_struct *); | 1722 | __poll_t (*poll) (struct file *, struct poll_table_struct *); |
1723 | struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t); | ||
1724 | __poll_t (*poll_mask) (struct file *, __poll_t); | ||
1725 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); | 1723 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); |
1726 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); | 1724 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); |
1727 | int (*mmap) (struct file *, struct vm_area_struct *); | 1725 | int (*mmap) (struct file *, struct vm_area_struct *); |
diff --git a/include/linux/net.h b/include/linux/net.h index 08b6eb964dd6..6554d3ba4396 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
@@ -147,7 +147,6 @@ struct proto_ops { | |||
147 | int (*getname) (struct socket *sock, | 147 | int (*getname) (struct socket *sock, |
148 | struct sockaddr *addr, | 148 | struct sockaddr *addr, |
149 | int peer); | 149 | int peer); |
150 | __poll_t (*poll_mask) (struct socket *sock, __poll_t events); | ||
151 | __poll_t (*poll) (struct file *file, struct socket *sock, | 150 | __poll_t (*poll) (struct file *file, struct socket *sock, |
152 | struct poll_table_struct *wait); | 151 | struct poll_table_struct *wait); |
153 | int (*ioctl) (struct socket *sock, unsigned int cmd, | 152 | int (*ioctl) (struct socket *sock, unsigned int cmd, |
diff --git a/include/linux/poll.h b/include/linux/poll.h index fdf86b4cbc71..7e0fdcf905d2 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h | |||
@@ -74,18 +74,18 @@ static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc) | |||
74 | pt->_key = ~(__poll_t)0; /* all events enabled */ | 74 | pt->_key = ~(__poll_t)0; /* all events enabled */ |
75 | } | 75 | } |
76 | 76 | ||
77 | static inline bool file_has_poll_mask(struct file *file) | 77 | static inline bool file_can_poll(struct file *file) |
78 | { | 78 | { |
79 | return file->f_op->get_poll_head && file->f_op->poll_mask; | 79 | return file->f_op->poll; |
80 | } | 80 | } |
81 | 81 | ||
82 | static inline bool file_can_poll(struct file *file) | 82 | static inline __poll_t vfs_poll(struct file *file, struct poll_table_struct *pt) |
83 | { | 83 | { |
84 | return file->f_op->poll || file_has_poll_mask(file); | 84 | if (unlikely(!file->f_op->poll)) |
85 | return DEFAULT_POLLMASK; | ||
86 | return file->f_op->poll(file, pt); | ||
85 | } | 87 | } |
86 | 88 | ||
87 | __poll_t vfs_poll(struct file *file, struct poll_table_struct *pt); | ||
88 | |||
89 | struct poll_table_entry { | 89 | struct poll_table_entry { |
90 | struct file *filp; | 90 | struct file *filp; |
91 | __poll_t key; | 91 | __poll_t key; |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index c86885954994..164cdedf6012 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -3252,7 +3252,8 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags, | |||
3252 | int *peeked, int *off, int *err); | 3252 | int *peeked, int *off, int *err); |
3253 | struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, int noblock, | 3253 | struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, int noblock, |
3254 | int *err); | 3254 | int *err); |
3255 | __poll_t datagram_poll_mask(struct socket *sock, __poll_t events); | 3255 | __poll_t datagram_poll(struct file *file, struct socket *sock, |
3256 | struct poll_table_struct *wait); | ||
3256 | int skb_copy_datagram_iter(const struct sk_buff *from, int offset, | 3257 | int skb_copy_datagram_iter(const struct sk_buff *from, int offset, |
3257 | struct iov_iter *to, int size); | 3258 | struct iov_iter *to, int size); |
3258 | static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset, | 3259 | static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset, |
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 53ce8176c313..ec9d6bc65855 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
@@ -271,7 +271,7 @@ int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, | |||
271 | int flags); | 271 | int flags); |
272 | int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg, | 272 | int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg, |
273 | size_t len, int flags); | 273 | size_t len, int flags); |
274 | __poll_t bt_sock_poll_mask(struct socket *sock, __poll_t events); | 274 | __poll_t bt_sock_poll(struct file *file, struct socket *sock, poll_table *wait); |
275 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); | 275 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); |
276 | int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo); | 276 | int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo); |
277 | int bt_sock_wait_ready(struct sock *sk, unsigned long flags); | 277 | int bt_sock_wait_ready(struct sock *sk, unsigned long flags); |
diff --git a/include/net/iucv/af_iucv.h b/include/net/iucv/af_iucv.h index b0eaeb02d46d..f4c21b5a1242 100644 --- a/include/net/iucv/af_iucv.h +++ b/include/net/iucv/af_iucv.h | |||
@@ -153,6 +153,8 @@ struct iucv_sock_list { | |||
153 | atomic_t autobind_name; | 153 | atomic_t autobind_name; |
154 | }; | 154 | }; |
155 | 155 | ||
156 | __poll_t iucv_sock_poll(struct file *file, struct socket *sock, | ||
157 | poll_table *wait); | ||
156 | void iucv_sock_link(struct iucv_sock_list *l, struct sock *s); | 158 | void iucv_sock_link(struct iucv_sock_list *l, struct sock *s); |
157 | void iucv_sock_unlink(struct iucv_sock_list *l, struct sock *s); | 159 | void iucv_sock_unlink(struct iucv_sock_list *l, struct sock *s); |
158 | void iucv_accept_enqueue(struct sock *parent, struct sock *sk); | 160 | void iucv_accept_enqueue(struct sock *parent, struct sock *sk); |
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index 30b3e2fe240a..8c2caa370e0f 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h | |||
@@ -109,7 +109,8 @@ int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb); | |||
109 | int sctp_inet_listen(struct socket *sock, int backlog); | 109 | int sctp_inet_listen(struct socket *sock, int backlog); |
110 | void sctp_write_space(struct sock *sk); | 110 | void sctp_write_space(struct sock *sk); |
111 | void sctp_data_ready(struct sock *sk); | 111 | void sctp_data_ready(struct sock *sk); |
112 | __poll_t sctp_poll_mask(struct socket *sock, __poll_t events); | 112 | __poll_t sctp_poll(struct file *file, struct socket *sock, |
113 | poll_table *wait); | ||
113 | void sctp_sock_rfree(struct sk_buff *skb); | 114 | void sctp_sock_rfree(struct sk_buff *skb); |
114 | void sctp_copy_sock(struct sock *newsk, struct sock *sk, | 115 | void sctp_copy_sock(struct sock *newsk, struct sock *sk, |
115 | struct sctp_association *asoc); | 116 | struct sctp_association *asoc); |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 0448e7c5d2b4..800582b5dd54 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -388,7 +388,8 @@ bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst); | |||
388 | void tcp_close(struct sock *sk, long timeout); | 388 | void tcp_close(struct sock *sk, long timeout); |
389 | void tcp_init_sock(struct sock *sk); | 389 | void tcp_init_sock(struct sock *sk); |
390 | void tcp_init_transfer(struct sock *sk, int bpf_op); | 390 | void tcp_init_transfer(struct sock *sk, int bpf_op); |
391 | __poll_t tcp_poll_mask(struct socket *sock, __poll_t events); | 391 | __poll_t tcp_poll(struct file *file, struct socket *sock, |
392 | struct poll_table_struct *wait); | ||
392 | int tcp_getsockopt(struct sock *sk, int level, int optname, | 393 | int tcp_getsockopt(struct sock *sk, int level, int optname, |
393 | char __user *optval, int __user *optlen); | 394 | char __user *optval, int __user *optlen); |
394 | int tcp_setsockopt(struct sock *sk, int level, int optname, | 395 | int tcp_setsockopt(struct sock *sk, int level, int optname, |
diff --git a/include/net/tls.h b/include/net/tls.h index 7f84ea3e217c..70c273777fe9 100644 --- a/include/net/tls.h +++ b/include/net/tls.h | |||
@@ -109,7 +109,8 @@ struct tls_sw_context_rx { | |||
109 | 109 | ||
110 | struct strparser strp; | 110 | struct strparser strp; |
111 | void (*saved_data_ready)(struct sock *sk); | 111 | void (*saved_data_ready)(struct sock *sk); |
112 | __poll_t (*sk_poll_mask)(struct socket *sock, __poll_t events); | 112 | unsigned int (*sk_poll)(struct file *file, struct socket *sock, |
113 | struct poll_table_struct *wait); | ||
113 | struct sk_buff *recv_pkt; | 114 | struct sk_buff *recv_pkt; |
114 | u8 control; | 115 | u8 control; |
115 | bool decrypted; | 116 | bool decrypted; |
@@ -224,7 +225,8 @@ void tls_sw_free_resources_tx(struct sock *sk); | |||
224 | void tls_sw_free_resources_rx(struct sock *sk); | 225 | void tls_sw_free_resources_rx(struct sock *sk); |
225 | int tls_sw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, | 226 | int tls_sw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, |
226 | int nonblock, int flags, int *addr_len); | 227 | int nonblock, int flags, int *addr_len); |
227 | __poll_t tls_sw_poll_mask(struct socket *sock, __poll_t events); | 228 | unsigned int tls_sw_poll(struct file *file, struct socket *sock, |
229 | struct poll_table_struct *wait); | ||
228 | ssize_t tls_sw_splice_read(struct socket *sock, loff_t *ppos, | 230 | ssize_t tls_sw_splice_read(struct socket *sock, loff_t *ppos, |
229 | struct pipe_inode_info *pipe, | 231 | struct pipe_inode_info *pipe, |
230 | size_t len, unsigned int flags); | 232 | size_t len, unsigned int flags); |
diff --git a/include/net/udp.h b/include/net/udp.h index b1ea8b0f5e6a..81afdacd4fff 100644 --- a/include/net/udp.h +++ b/include/net/udp.h | |||
@@ -285,7 +285,7 @@ int udp_init_sock(struct sock *sk); | |||
285 | int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); | 285 | int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); |
286 | int __udp_disconnect(struct sock *sk, int flags); | 286 | int __udp_disconnect(struct sock *sk, int flags); |
287 | int udp_disconnect(struct sock *sk, int flags); | 287 | int udp_disconnect(struct sock *sk, int flags); |
288 | __poll_t udp_poll_mask(struct socket *sock, __poll_t events); | 288 | __poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait); |
289 | struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb, | 289 | struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb, |
290 | netdev_features_t features, | 290 | netdev_features_t features, |
291 | bool is_ipv6); | 291 | bool is_ipv6); |
diff --git a/include/uapi/linux/aio_abi.h b/include/uapi/linux/aio_abi.h index d00221345c19..d4e768d55d14 100644 --- a/include/uapi/linux/aio_abi.h +++ b/include/uapi/linux/aio_abi.h | |||
@@ -39,8 +39,10 @@ enum { | |||
39 | IOCB_CMD_PWRITE = 1, | 39 | IOCB_CMD_PWRITE = 1, |
40 | IOCB_CMD_FSYNC = 2, | 40 | IOCB_CMD_FSYNC = 2, |
41 | IOCB_CMD_FDSYNC = 3, | 41 | IOCB_CMD_FDSYNC = 3, |
42 | /* 4 was the experimental IOCB_CMD_PREADX */ | 42 | /* These two are experimental. |
43 | IOCB_CMD_POLL = 5, | 43 | * IOCB_CMD_PREADX = 4, |
44 | * IOCB_CMD_POLL = 5, | ||
45 | */ | ||
44 | IOCB_CMD_NOOP = 6, | 46 | IOCB_CMD_NOOP = 6, |
45 | IOCB_CMD_PREADV = 7, | 47 | IOCB_CMD_PREADV = 7, |
46 | IOCB_CMD_PWRITEV = 8, | 48 | IOCB_CMD_PWRITEV = 8, |
@@ -109,7 +111,7 @@ struct iocb { | |||
109 | #undef IFLITTLE | 111 | #undef IFLITTLE |
110 | 112 | ||
111 | struct __aio_sigset { | 113 | struct __aio_sigset { |
112 | const sigset_t __user *sigmask; | 114 | sigset_t __user *sigmask; |
113 | size_t sigsetsize; | 115 | size_t sigsetsize; |
114 | }; | 116 | }; |
115 | 117 | ||
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 55fdba05d7d9..9b6bc5abe946 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c | |||
@@ -1869,7 +1869,7 @@ static const struct proto_ops atalk_dgram_ops = { | |||
1869 | .socketpair = sock_no_socketpair, | 1869 | .socketpair = sock_no_socketpair, |
1870 | .accept = sock_no_accept, | 1870 | .accept = sock_no_accept, |
1871 | .getname = atalk_getname, | 1871 | .getname = atalk_getname, |
1872 | .poll_mask = datagram_poll_mask, | 1872 | .poll = datagram_poll, |
1873 | .ioctl = atalk_ioctl, | 1873 | .ioctl = atalk_ioctl, |
1874 | #ifdef CONFIG_COMPAT | 1874 | #ifdef CONFIG_COMPAT |
1875 | .compat_ioctl = atalk_compat_ioctl, | 1875 | .compat_ioctl = atalk_compat_ioctl, |
diff --git a/net/atm/common.c b/net/atm/common.c index ff5748b2190f..a7a68e509628 100644 --- a/net/atm/common.c +++ b/net/atm/common.c | |||
@@ -647,11 +647,16 @@ out: | |||
647 | return error; | 647 | return error; |
648 | } | 648 | } |
649 | 649 | ||
650 | __poll_t vcc_poll_mask(struct socket *sock, __poll_t events) | 650 | __poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait) |
651 | { | 651 | { |
652 | struct sock *sk = sock->sk; | 652 | struct sock *sk = sock->sk; |
653 | struct atm_vcc *vcc = ATM_SD(sock); | 653 | struct atm_vcc *vcc; |
654 | __poll_t mask = 0; | 654 | __poll_t mask; |
655 | |||
656 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
657 | mask = 0; | ||
658 | |||
659 | vcc = ATM_SD(sock); | ||
655 | 660 | ||
656 | /* exceptional events */ | 661 | /* exceptional events */ |
657 | if (sk->sk_err) | 662 | if (sk->sk_err) |
diff --git a/net/atm/common.h b/net/atm/common.h index 526796ad230f..5850649068bb 100644 --- a/net/atm/common.h +++ b/net/atm/common.h | |||
@@ -17,7 +17,7 @@ int vcc_connect(struct socket *sock, int itf, short vpi, int vci); | |||
17 | int vcc_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, | 17 | int vcc_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, |
18 | int flags); | 18 | int flags); |
19 | int vcc_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len); | 19 | int vcc_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len); |
20 | __poll_t vcc_poll_mask(struct socket *sock, __poll_t events); | 20 | __poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait); |
21 | int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); | 21 | int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); |
22 | int vcc_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); | 22 | int vcc_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); |
23 | int vcc_setsockopt(struct socket *sock, int level, int optname, | 23 | int vcc_setsockopt(struct socket *sock, int level, int optname, |
diff --git a/net/atm/pvc.c b/net/atm/pvc.c index 9f75092fe778..2cb10af16afc 100644 --- a/net/atm/pvc.c +++ b/net/atm/pvc.c | |||
@@ -113,7 +113,7 @@ static const struct proto_ops pvc_proto_ops = { | |||
113 | .socketpair = sock_no_socketpair, | 113 | .socketpair = sock_no_socketpair, |
114 | .accept = sock_no_accept, | 114 | .accept = sock_no_accept, |
115 | .getname = pvc_getname, | 115 | .getname = pvc_getname, |
116 | .poll_mask = vcc_poll_mask, | 116 | .poll = vcc_poll, |
117 | .ioctl = vcc_ioctl, | 117 | .ioctl = vcc_ioctl, |
118 | #ifdef CONFIG_COMPAT | 118 | #ifdef CONFIG_COMPAT |
119 | .compat_ioctl = vcc_compat_ioctl, | 119 | .compat_ioctl = vcc_compat_ioctl, |
diff --git a/net/atm/svc.c b/net/atm/svc.c index 53f4ad7087b1..2f91b766ac42 100644 --- a/net/atm/svc.c +++ b/net/atm/svc.c | |||
@@ -636,7 +636,7 @@ static const struct proto_ops svc_proto_ops = { | |||
636 | .socketpair = sock_no_socketpair, | 636 | .socketpair = sock_no_socketpair, |
637 | .accept = svc_accept, | 637 | .accept = svc_accept, |
638 | .getname = svc_getname, | 638 | .getname = svc_getname, |
639 | .poll_mask = vcc_poll_mask, | 639 | .poll = vcc_poll, |
640 | .ioctl = svc_ioctl, | 640 | .ioctl = svc_ioctl, |
641 | #ifdef CONFIG_COMPAT | 641 | #ifdef CONFIG_COMPAT |
642 | .compat_ioctl = svc_compat_ioctl, | 642 | .compat_ioctl = svc_compat_ioctl, |
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index d1d2442ce573..c603d33d5410 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c | |||
@@ -1941,7 +1941,7 @@ static const struct proto_ops ax25_proto_ops = { | |||
1941 | .socketpair = sock_no_socketpair, | 1941 | .socketpair = sock_no_socketpair, |
1942 | .accept = ax25_accept, | 1942 | .accept = ax25_accept, |
1943 | .getname = ax25_getname, | 1943 | .getname = ax25_getname, |
1944 | .poll_mask = datagram_poll_mask, | 1944 | .poll = datagram_poll, |
1945 | .ioctl = ax25_ioctl, | 1945 | .ioctl = ax25_ioctl, |
1946 | .listen = ax25_listen, | 1946 | .listen = ax25_listen, |
1947 | .shutdown = ax25_shutdown, | 1947 | .shutdown = ax25_shutdown, |
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 510ab4f55df5..3264e1873219 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -437,13 +437,16 @@ static inline __poll_t bt_accept_poll(struct sock *parent) | |||
437 | return 0; | 437 | return 0; |
438 | } | 438 | } |
439 | 439 | ||
440 | __poll_t bt_sock_poll_mask(struct socket *sock, __poll_t events) | 440 | __poll_t bt_sock_poll(struct file *file, struct socket *sock, |
441 | poll_table *wait) | ||
441 | { | 442 | { |
442 | struct sock *sk = sock->sk; | 443 | struct sock *sk = sock->sk; |
443 | __poll_t mask = 0; | 444 | __poll_t mask = 0; |
444 | 445 | ||
445 | BT_DBG("sock %p, sk %p", sock, sk); | 446 | BT_DBG("sock %p, sk %p", sock, sk); |
446 | 447 | ||
448 | poll_wait(file, sk_sleep(sk), wait); | ||
449 | |||
447 | if (sk->sk_state == BT_LISTEN) | 450 | if (sk->sk_state == BT_LISTEN) |
448 | return bt_accept_poll(sk); | 451 | return bt_accept_poll(sk); |
449 | 452 | ||
@@ -475,7 +478,7 @@ __poll_t bt_sock_poll_mask(struct socket *sock, __poll_t events) | |||
475 | 478 | ||
476 | return mask; | 479 | return mask; |
477 | } | 480 | } |
478 | EXPORT_SYMBOL(bt_sock_poll_mask); | 481 | EXPORT_SYMBOL(bt_sock_poll); |
479 | 482 | ||
480 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | 483 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) |
481 | { | 484 | { |
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index d6c099861538..1506e1632394 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -1975,7 +1975,7 @@ static const struct proto_ops hci_sock_ops = { | |||
1975 | .sendmsg = hci_sock_sendmsg, | 1975 | .sendmsg = hci_sock_sendmsg, |
1976 | .recvmsg = hci_sock_recvmsg, | 1976 | .recvmsg = hci_sock_recvmsg, |
1977 | .ioctl = hci_sock_ioctl, | 1977 | .ioctl = hci_sock_ioctl, |
1978 | .poll_mask = datagram_poll_mask, | 1978 | .poll = datagram_poll, |
1979 | .listen = sock_no_listen, | 1979 | .listen = sock_no_listen, |
1980 | .shutdown = sock_no_shutdown, | 1980 | .shutdown = sock_no_shutdown, |
1981 | .setsockopt = hci_sock_setsockopt, | 1981 | .setsockopt = hci_sock_setsockopt, |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 742a190034e6..686bdc6b35b0 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -1653,7 +1653,7 @@ static const struct proto_ops l2cap_sock_ops = { | |||
1653 | .getname = l2cap_sock_getname, | 1653 | .getname = l2cap_sock_getname, |
1654 | .sendmsg = l2cap_sock_sendmsg, | 1654 | .sendmsg = l2cap_sock_sendmsg, |
1655 | .recvmsg = l2cap_sock_recvmsg, | 1655 | .recvmsg = l2cap_sock_recvmsg, |
1656 | .poll_mask = bt_sock_poll_mask, | 1656 | .poll = bt_sock_poll, |
1657 | .ioctl = bt_sock_ioctl, | 1657 | .ioctl = bt_sock_ioctl, |
1658 | .mmap = sock_no_mmap, | 1658 | .mmap = sock_no_mmap, |
1659 | .socketpair = sock_no_socketpair, | 1659 | .socketpair = sock_no_socketpair, |
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 1cf57622473a..d606e9212291 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
@@ -1049,7 +1049,7 @@ static const struct proto_ops rfcomm_sock_ops = { | |||
1049 | .setsockopt = rfcomm_sock_setsockopt, | 1049 | .setsockopt = rfcomm_sock_setsockopt, |
1050 | .getsockopt = rfcomm_sock_getsockopt, | 1050 | .getsockopt = rfcomm_sock_getsockopt, |
1051 | .ioctl = rfcomm_sock_ioctl, | 1051 | .ioctl = rfcomm_sock_ioctl, |
1052 | .poll_mask = bt_sock_poll_mask, | 1052 | .poll = bt_sock_poll, |
1053 | .socketpair = sock_no_socketpair, | 1053 | .socketpair = sock_no_socketpair, |
1054 | .mmap = sock_no_mmap | 1054 | .mmap = sock_no_mmap |
1055 | }; | 1055 | }; |
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index d60dbc61d170..413b8ee49fec 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
@@ -1197,7 +1197,7 @@ static const struct proto_ops sco_sock_ops = { | |||
1197 | .getname = sco_sock_getname, | 1197 | .getname = sco_sock_getname, |
1198 | .sendmsg = sco_sock_sendmsg, | 1198 | .sendmsg = sco_sock_sendmsg, |
1199 | .recvmsg = sco_sock_recvmsg, | 1199 | .recvmsg = sco_sock_recvmsg, |
1200 | .poll_mask = bt_sock_poll_mask, | 1200 | .poll = bt_sock_poll, |
1201 | .ioctl = bt_sock_ioctl, | 1201 | .ioctl = bt_sock_ioctl, |
1202 | .mmap = sock_no_mmap, | 1202 | .mmap = sock_no_mmap, |
1203 | .socketpair = sock_no_socketpair, | 1203 | .socketpair = sock_no_socketpair, |
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c index c7991867d622..a6fb1b3bcad9 100644 --- a/net/caif/caif_socket.c +++ b/net/caif/caif_socket.c | |||
@@ -934,11 +934,15 @@ static int caif_release(struct socket *sock) | |||
934 | } | 934 | } |
935 | 935 | ||
936 | /* Copied from af_unix.c:unix_poll(), added CAIF tx_flow handling */ | 936 | /* Copied from af_unix.c:unix_poll(), added CAIF tx_flow handling */ |
937 | static __poll_t caif_poll_mask(struct socket *sock, __poll_t events) | 937 | static __poll_t caif_poll(struct file *file, |
938 | struct socket *sock, poll_table *wait) | ||
938 | { | 939 | { |
939 | struct sock *sk = sock->sk; | 940 | struct sock *sk = sock->sk; |
941 | __poll_t mask; | ||
940 | struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); | 942 | struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); |
941 | __poll_t mask = 0; | 943 | |
944 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
945 | mask = 0; | ||
942 | 946 | ||
943 | /* exceptional events? */ | 947 | /* exceptional events? */ |
944 | if (sk->sk_err) | 948 | if (sk->sk_err) |
@@ -972,7 +976,7 @@ static const struct proto_ops caif_seqpacket_ops = { | |||
972 | .socketpair = sock_no_socketpair, | 976 | .socketpair = sock_no_socketpair, |
973 | .accept = sock_no_accept, | 977 | .accept = sock_no_accept, |
974 | .getname = sock_no_getname, | 978 | .getname = sock_no_getname, |
975 | .poll_mask = caif_poll_mask, | 979 | .poll = caif_poll, |
976 | .ioctl = sock_no_ioctl, | 980 | .ioctl = sock_no_ioctl, |
977 | .listen = sock_no_listen, | 981 | .listen = sock_no_listen, |
978 | .shutdown = sock_no_shutdown, | 982 | .shutdown = sock_no_shutdown, |
@@ -993,7 +997,7 @@ static const struct proto_ops caif_stream_ops = { | |||
993 | .socketpair = sock_no_socketpair, | 997 | .socketpair = sock_no_socketpair, |
994 | .accept = sock_no_accept, | 998 | .accept = sock_no_accept, |
995 | .getname = sock_no_getname, | 999 | .getname = sock_no_getname, |
996 | .poll_mask = caif_poll_mask, | 1000 | .poll = caif_poll, |
997 | .ioctl = sock_no_ioctl, | 1001 | .ioctl = sock_no_ioctl, |
998 | .listen = sock_no_listen, | 1002 | .listen = sock_no_listen, |
999 | .shutdown = sock_no_shutdown, | 1003 | .shutdown = sock_no_shutdown, |
diff --git a/net/can/bcm.c b/net/can/bcm.c index 9393f25df08d..0af8f0db892a 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
@@ -1660,7 +1660,7 @@ static const struct proto_ops bcm_ops = { | |||
1660 | .socketpair = sock_no_socketpair, | 1660 | .socketpair = sock_no_socketpair, |
1661 | .accept = sock_no_accept, | 1661 | .accept = sock_no_accept, |
1662 | .getname = sock_no_getname, | 1662 | .getname = sock_no_getname, |
1663 | .poll_mask = datagram_poll_mask, | 1663 | .poll = datagram_poll, |
1664 | .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ | 1664 | .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ |
1665 | .listen = sock_no_listen, | 1665 | .listen = sock_no_listen, |
1666 | .shutdown = sock_no_shutdown, | 1666 | .shutdown = sock_no_shutdown, |
diff --git a/net/can/raw.c b/net/can/raw.c index fd7e2f49ea6a..1051eee82581 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
@@ -843,7 +843,7 @@ static const struct proto_ops raw_ops = { | |||
843 | .socketpair = sock_no_socketpair, | 843 | .socketpair = sock_no_socketpair, |
844 | .accept = sock_no_accept, | 844 | .accept = sock_no_accept, |
845 | .getname = raw_getname, | 845 | .getname = raw_getname, |
846 | .poll_mask = datagram_poll_mask, | 846 | .poll = datagram_poll, |
847 | .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ | 847 | .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ |
848 | .listen = sock_no_listen, | 848 | .listen = sock_no_listen, |
849 | .shutdown = sock_no_shutdown, | 849 | .shutdown = sock_no_shutdown, |
diff --git a/net/core/datagram.c b/net/core/datagram.c index f19bf3dc2bd6..9938952c5c78 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
@@ -819,8 +819,9 @@ EXPORT_SYMBOL(skb_copy_and_csum_datagram_msg); | |||
819 | 819 | ||
820 | /** | 820 | /** |
821 | * datagram_poll - generic datagram poll | 821 | * datagram_poll - generic datagram poll |
822 | * @file: file struct | ||
822 | * @sock: socket | 823 | * @sock: socket |
823 | * @events to wait for | 824 | * @wait: poll table |
824 | * | 825 | * |
825 | * Datagram poll: Again totally generic. This also handles | 826 | * Datagram poll: Again totally generic. This also handles |
826 | * sequenced packet sockets providing the socket receive queue | 827 | * sequenced packet sockets providing the socket receive queue |
@@ -830,10 +831,14 @@ EXPORT_SYMBOL(skb_copy_and_csum_datagram_msg); | |||
830 | * and you use a different write policy from sock_writeable() | 831 | * and you use a different write policy from sock_writeable() |
831 | * then please supply your own write_space callback. | 832 | * then please supply your own write_space callback. |
832 | */ | 833 | */ |
833 | __poll_t datagram_poll_mask(struct socket *sock, __poll_t events) | 834 | __poll_t datagram_poll(struct file *file, struct socket *sock, |
835 | poll_table *wait) | ||
834 | { | 836 | { |
835 | struct sock *sk = sock->sk; | 837 | struct sock *sk = sock->sk; |
836 | __poll_t mask = 0; | 838 | __poll_t mask; |
839 | |||
840 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
841 | mask = 0; | ||
837 | 842 | ||
838 | /* exceptional events? */ | 843 | /* exceptional events? */ |
839 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) | 844 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) |
@@ -866,4 +871,4 @@ __poll_t datagram_poll_mask(struct socket *sock, __poll_t events) | |||
866 | 871 | ||
867 | return mask; | 872 | return mask; |
868 | } | 873 | } |
869 | EXPORT_SYMBOL(datagram_poll_mask); | 874 | EXPORT_SYMBOL(datagram_poll); |
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h index 0ea2ee56ac1b..f91e3816806b 100644 --- a/net/dccp/dccp.h +++ b/net/dccp/dccp.h | |||
@@ -316,7 +316,8 @@ int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, | |||
316 | int flags, int *addr_len); | 316 | int flags, int *addr_len); |
317 | void dccp_shutdown(struct sock *sk, int how); | 317 | void dccp_shutdown(struct sock *sk, int how); |
318 | int inet_dccp_listen(struct socket *sock, int backlog); | 318 | int inet_dccp_listen(struct socket *sock, int backlog); |
319 | __poll_t dccp_poll_mask(struct socket *sock, __poll_t events); | 319 | __poll_t dccp_poll(struct file *file, struct socket *sock, |
320 | poll_table *wait); | ||
320 | int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); | 321 | int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); |
321 | void dccp_req_err(struct sock *sk, u64 seq); | 322 | void dccp_req_err(struct sock *sk, u64 seq); |
322 | 323 | ||
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index a9e478cd3787..b08feb219b44 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
@@ -984,7 +984,7 @@ static const struct proto_ops inet_dccp_ops = { | |||
984 | .accept = inet_accept, | 984 | .accept = inet_accept, |
985 | .getname = inet_getname, | 985 | .getname = inet_getname, |
986 | /* FIXME: work on tcp_poll to rename it to inet_csk_poll */ | 986 | /* FIXME: work on tcp_poll to rename it to inet_csk_poll */ |
987 | .poll_mask = dccp_poll_mask, | 987 | .poll = dccp_poll, |
988 | .ioctl = inet_ioctl, | 988 | .ioctl = inet_ioctl, |
989 | /* FIXME: work on inet_listen to rename it to sock_common_listen */ | 989 | /* FIXME: work on inet_listen to rename it to sock_common_listen */ |
990 | .listen = inet_dccp_listen, | 990 | .listen = inet_dccp_listen, |
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index 17fc4e0166ba..6344f1b18a6a 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
@@ -1070,7 +1070,7 @@ static const struct proto_ops inet6_dccp_ops = { | |||
1070 | .socketpair = sock_no_socketpair, | 1070 | .socketpair = sock_no_socketpair, |
1071 | .accept = inet_accept, | 1071 | .accept = inet_accept, |
1072 | .getname = inet6_getname, | 1072 | .getname = inet6_getname, |
1073 | .poll_mask = dccp_poll_mask, | 1073 | .poll = dccp_poll, |
1074 | .ioctl = inet6_ioctl, | 1074 | .ioctl = inet6_ioctl, |
1075 | .listen = inet_dccp_listen, | 1075 | .listen = inet_dccp_listen, |
1076 | .shutdown = inet_shutdown, | 1076 | .shutdown = inet_shutdown, |
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index ca21c1c76da0..0d56e36a6db7 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -312,11 +312,20 @@ int dccp_disconnect(struct sock *sk, int flags) | |||
312 | 312 | ||
313 | EXPORT_SYMBOL_GPL(dccp_disconnect); | 313 | EXPORT_SYMBOL_GPL(dccp_disconnect); |
314 | 314 | ||
315 | __poll_t dccp_poll_mask(struct socket *sock, __poll_t events) | 315 | /* |
316 | * Wait for a DCCP event. | ||
317 | * | ||
318 | * Note that we don't need to lock the socket, as the upper poll layers | ||
319 | * take care of normal races (between the test and the event) and we don't | ||
320 | * go look at any of the socket buffers directly. | ||
321 | */ | ||
322 | __poll_t dccp_poll(struct file *file, struct socket *sock, | ||
323 | poll_table *wait) | ||
316 | { | 324 | { |
317 | __poll_t mask; | 325 | __poll_t mask; |
318 | struct sock *sk = sock->sk; | 326 | struct sock *sk = sock->sk; |
319 | 327 | ||
328 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
320 | if (sk->sk_state == DCCP_LISTEN) | 329 | if (sk->sk_state == DCCP_LISTEN) |
321 | return inet_csk_listen_poll(sk); | 330 | return inet_csk_listen_poll(sk); |
322 | 331 | ||
@@ -358,7 +367,7 @@ __poll_t dccp_poll_mask(struct socket *sock, __poll_t events) | |||
358 | return mask; | 367 | return mask; |
359 | } | 368 | } |
360 | 369 | ||
361 | EXPORT_SYMBOL_GPL(dccp_poll_mask); | 370 | EXPORT_SYMBOL_GPL(dccp_poll); |
362 | 371 | ||
363 | int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg) | 372 | int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg) |
364 | { | 373 | { |
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 9a686d890bfa..7d6ff983ba2c 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
@@ -1207,11 +1207,11 @@ static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int peer) | |||
1207 | } | 1207 | } |
1208 | 1208 | ||
1209 | 1209 | ||
1210 | static __poll_t dn_poll_mask(struct socket *sock, __poll_t events) | 1210 | static __poll_t dn_poll(struct file *file, struct socket *sock, poll_table *wait) |
1211 | { | 1211 | { |
1212 | struct sock *sk = sock->sk; | 1212 | struct sock *sk = sock->sk; |
1213 | struct dn_scp *scp = DN_SK(sk); | 1213 | struct dn_scp *scp = DN_SK(sk); |
1214 | __poll_t mask = datagram_poll_mask(sock, events); | 1214 | __poll_t mask = datagram_poll(file, sock, wait); |
1215 | 1215 | ||
1216 | if (!skb_queue_empty(&scp->other_receive_queue)) | 1216 | if (!skb_queue_empty(&scp->other_receive_queue)) |
1217 | mask |= EPOLLRDBAND; | 1217 | mask |= EPOLLRDBAND; |
@@ -2331,7 +2331,7 @@ static const struct proto_ops dn_proto_ops = { | |||
2331 | .socketpair = sock_no_socketpair, | 2331 | .socketpair = sock_no_socketpair, |
2332 | .accept = dn_accept, | 2332 | .accept = dn_accept, |
2333 | .getname = dn_getname, | 2333 | .getname = dn_getname, |
2334 | .poll_mask = dn_poll_mask, | 2334 | .poll = dn_poll, |
2335 | .ioctl = dn_ioctl, | 2335 | .ioctl = dn_ioctl, |
2336 | .listen = dn_listen, | 2336 | .listen = dn_listen, |
2337 | .shutdown = dn_shutdown, | 2337 | .shutdown = dn_shutdown, |
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c index a0768d2759b8..a60658c85a9a 100644 --- a/net/ieee802154/socket.c +++ b/net/ieee802154/socket.c | |||
@@ -423,7 +423,7 @@ static const struct proto_ops ieee802154_raw_ops = { | |||
423 | .socketpair = sock_no_socketpair, | 423 | .socketpair = sock_no_socketpair, |
424 | .accept = sock_no_accept, | 424 | .accept = sock_no_accept, |
425 | .getname = sock_no_getname, | 425 | .getname = sock_no_getname, |
426 | .poll_mask = datagram_poll_mask, | 426 | .poll = datagram_poll, |
427 | .ioctl = ieee802154_sock_ioctl, | 427 | .ioctl = ieee802154_sock_ioctl, |
428 | .listen = sock_no_listen, | 428 | .listen = sock_no_listen, |
429 | .shutdown = sock_no_shutdown, | 429 | .shutdown = sock_no_shutdown, |
@@ -969,7 +969,7 @@ static const struct proto_ops ieee802154_dgram_ops = { | |||
969 | .socketpair = sock_no_socketpair, | 969 | .socketpair = sock_no_socketpair, |
970 | .accept = sock_no_accept, | 970 | .accept = sock_no_accept, |
971 | .getname = sock_no_getname, | 971 | .getname = sock_no_getname, |
972 | .poll_mask = datagram_poll_mask, | 972 | .poll = datagram_poll, |
973 | .ioctl = ieee802154_sock_ioctl, | 973 | .ioctl = ieee802154_sock_ioctl, |
974 | .listen = sock_no_listen, | 974 | .listen = sock_no_listen, |
975 | .shutdown = sock_no_shutdown, | 975 | .shutdown = sock_no_shutdown, |
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 15e125558c76..b403499fdabe 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -986,7 +986,7 @@ const struct proto_ops inet_stream_ops = { | |||
986 | .socketpair = sock_no_socketpair, | 986 | .socketpair = sock_no_socketpair, |
987 | .accept = inet_accept, | 987 | .accept = inet_accept, |
988 | .getname = inet_getname, | 988 | .getname = inet_getname, |
989 | .poll_mask = tcp_poll_mask, | 989 | .poll = tcp_poll, |
990 | .ioctl = inet_ioctl, | 990 | .ioctl = inet_ioctl, |
991 | .listen = inet_listen, | 991 | .listen = inet_listen, |
992 | .shutdown = inet_shutdown, | 992 | .shutdown = inet_shutdown, |
@@ -1021,7 +1021,7 @@ const struct proto_ops inet_dgram_ops = { | |||
1021 | .socketpair = sock_no_socketpair, | 1021 | .socketpair = sock_no_socketpair, |
1022 | .accept = sock_no_accept, | 1022 | .accept = sock_no_accept, |
1023 | .getname = inet_getname, | 1023 | .getname = inet_getname, |
1024 | .poll_mask = udp_poll_mask, | 1024 | .poll = udp_poll, |
1025 | .ioctl = inet_ioctl, | 1025 | .ioctl = inet_ioctl, |
1026 | .listen = sock_no_listen, | 1026 | .listen = sock_no_listen, |
1027 | .shutdown = inet_shutdown, | 1027 | .shutdown = inet_shutdown, |
@@ -1042,7 +1042,7 @@ EXPORT_SYMBOL(inet_dgram_ops); | |||
1042 | 1042 | ||
1043 | /* | 1043 | /* |
1044 | * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without | 1044 | * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without |
1045 | * udp_poll_mask | 1045 | * udp_poll |
1046 | */ | 1046 | */ |
1047 | static const struct proto_ops inet_sockraw_ops = { | 1047 | static const struct proto_ops inet_sockraw_ops = { |
1048 | .family = PF_INET, | 1048 | .family = PF_INET, |
@@ -1053,7 +1053,7 @@ static const struct proto_ops inet_sockraw_ops = { | |||
1053 | .socketpair = sock_no_socketpair, | 1053 | .socketpair = sock_no_socketpair, |
1054 | .accept = sock_no_accept, | 1054 | .accept = sock_no_accept, |
1055 | .getname = inet_getname, | 1055 | .getname = inet_getname, |
1056 | .poll_mask = datagram_poll_mask, | 1056 | .poll = datagram_poll, |
1057 | .ioctl = inet_ioctl, | 1057 | .ioctl = inet_ioctl, |
1058 | .listen = sock_no_listen, | 1058 | .listen = sock_no_listen, |
1059 | .shutdown = inet_shutdown, | 1059 | .shutdown = inet_shutdown, |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 141acd92e58a..e7b53d2a971f 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -494,21 +494,32 @@ static inline bool tcp_stream_is_readable(const struct tcp_sock *tp, | |||
494 | } | 494 | } |
495 | 495 | ||
496 | /* | 496 | /* |
497 | * Socket is not locked. We are protected from async events by poll logic and | 497 | * Wait for a TCP event. |
498 | * correct handling of state changes made by other threads is impossible in | 498 | * |
499 | * any case. | 499 | * Note that we don't need to lock the socket, as the upper poll layers |
500 | * take care of normal races (between the test and the event) and we don't | ||
501 | * go look at any of the socket buffers directly. | ||
500 | */ | 502 | */ |
501 | __poll_t tcp_poll_mask(struct socket *sock, __poll_t events) | 503 | __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait) |
502 | { | 504 | { |
505 | __poll_t mask; | ||
503 | struct sock *sk = sock->sk; | 506 | struct sock *sk = sock->sk; |
504 | const struct tcp_sock *tp = tcp_sk(sk); | 507 | const struct tcp_sock *tp = tcp_sk(sk); |
505 | __poll_t mask = 0; | ||
506 | int state; | 508 | int state; |
507 | 509 | ||
510 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
511 | |||
508 | state = inet_sk_state_load(sk); | 512 | state = inet_sk_state_load(sk); |
509 | if (state == TCP_LISTEN) | 513 | if (state == TCP_LISTEN) |
510 | return inet_csk_listen_poll(sk); | 514 | return inet_csk_listen_poll(sk); |
511 | 515 | ||
516 | /* Socket is not locked. We are protected from async events | ||
517 | * by poll logic and correct handling of state changes | ||
518 | * made by other threads is impossible in any case. | ||
519 | */ | ||
520 | |||
521 | mask = 0; | ||
522 | |||
512 | /* | 523 | /* |
513 | * EPOLLHUP is certainly not done right. But poll() doesn't | 524 | * EPOLLHUP is certainly not done right. But poll() doesn't |
514 | * have a notion of HUP in just one direction, and for a | 525 | * have a notion of HUP in just one direction, and for a |
@@ -589,7 +600,7 @@ __poll_t tcp_poll_mask(struct socket *sock, __poll_t events) | |||
589 | 600 | ||
590 | return mask; | 601 | return mask; |
591 | } | 602 | } |
592 | EXPORT_SYMBOL(tcp_poll_mask); | 603 | EXPORT_SYMBOL(tcp_poll); |
593 | 604 | ||
594 | int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg) | 605 | int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg) |
595 | { | 606 | { |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 9bb27df4dac5..24e116ddae79 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -2591,7 +2591,7 @@ int compat_udp_getsockopt(struct sock *sk, int level, int optname, | |||
2591 | * udp_poll - wait for a UDP event. | 2591 | * udp_poll - wait for a UDP event. |
2592 | * @file - file struct | 2592 | * @file - file struct |
2593 | * @sock - socket | 2593 | * @sock - socket |
2594 | * @events - events to wait for | 2594 | * @wait - poll table |
2595 | * | 2595 | * |
2596 | * This is same as datagram poll, except for the special case of | 2596 | * This is same as datagram poll, except for the special case of |
2597 | * blocking sockets. If application is using a blocking fd | 2597 | * blocking sockets. If application is using a blocking fd |
@@ -2600,23 +2600,23 @@ int compat_udp_getsockopt(struct sock *sk, int level, int optname, | |||
2600 | * but then block when reading it. Add special case code | 2600 | * but then block when reading it. Add special case code |
2601 | * to work around these arguably broken applications. | 2601 | * to work around these arguably broken applications. |
2602 | */ | 2602 | */ |
2603 | __poll_t udp_poll_mask(struct socket *sock, __poll_t events) | 2603 | __poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait) |
2604 | { | 2604 | { |
2605 | __poll_t mask = datagram_poll_mask(sock, events); | 2605 | __poll_t mask = datagram_poll(file, sock, wait); |
2606 | struct sock *sk = sock->sk; | 2606 | struct sock *sk = sock->sk; |
2607 | 2607 | ||
2608 | if (!skb_queue_empty(&udp_sk(sk)->reader_queue)) | 2608 | if (!skb_queue_empty(&udp_sk(sk)->reader_queue)) |
2609 | mask |= EPOLLIN | EPOLLRDNORM; | 2609 | mask |= EPOLLIN | EPOLLRDNORM; |
2610 | 2610 | ||
2611 | /* Check for false positives due to checksum errors */ | 2611 | /* Check for false positives due to checksum errors */ |
2612 | if ((mask & EPOLLRDNORM) && !(sock->file->f_flags & O_NONBLOCK) && | 2612 | if ((mask & EPOLLRDNORM) && !(file->f_flags & O_NONBLOCK) && |
2613 | !(sk->sk_shutdown & RCV_SHUTDOWN) && first_packet_length(sk) == -1) | 2613 | !(sk->sk_shutdown & RCV_SHUTDOWN) && first_packet_length(sk) == -1) |
2614 | mask &= ~(EPOLLIN | EPOLLRDNORM); | 2614 | mask &= ~(EPOLLIN | EPOLLRDNORM); |
2615 | 2615 | ||
2616 | return mask; | 2616 | return mask; |
2617 | 2617 | ||
2618 | } | 2618 | } |
2619 | EXPORT_SYMBOL(udp_poll_mask); | 2619 | EXPORT_SYMBOL(udp_poll); |
2620 | 2620 | ||
2621 | int udp_abort(struct sock *sk, int err) | 2621 | int udp_abort(struct sock *sk, int err) |
2622 | { | 2622 | { |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 74f2a261e8df..9ed0eae91758 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -570,7 +570,7 @@ const struct proto_ops inet6_stream_ops = { | |||
570 | .socketpair = sock_no_socketpair, /* a do nothing */ | 570 | .socketpair = sock_no_socketpair, /* a do nothing */ |
571 | .accept = inet_accept, /* ok */ | 571 | .accept = inet_accept, /* ok */ |
572 | .getname = inet6_getname, | 572 | .getname = inet6_getname, |
573 | .poll_mask = tcp_poll_mask, /* ok */ | 573 | .poll = tcp_poll, /* ok */ |
574 | .ioctl = inet6_ioctl, /* must change */ | 574 | .ioctl = inet6_ioctl, /* must change */ |
575 | .listen = inet_listen, /* ok */ | 575 | .listen = inet_listen, /* ok */ |
576 | .shutdown = inet_shutdown, /* ok */ | 576 | .shutdown = inet_shutdown, /* ok */ |
@@ -603,7 +603,7 @@ const struct proto_ops inet6_dgram_ops = { | |||
603 | .socketpair = sock_no_socketpair, /* a do nothing */ | 603 | .socketpair = sock_no_socketpair, /* a do nothing */ |
604 | .accept = sock_no_accept, /* a do nothing */ | 604 | .accept = sock_no_accept, /* a do nothing */ |
605 | .getname = inet6_getname, | 605 | .getname = inet6_getname, |
606 | .poll_mask = udp_poll_mask, /* ok */ | 606 | .poll = udp_poll, /* ok */ |
607 | .ioctl = inet6_ioctl, /* must change */ | 607 | .ioctl = inet6_ioctl, /* must change */ |
608 | .listen = sock_no_listen, /* ok */ | 608 | .listen = sock_no_listen, /* ok */ |
609 | .shutdown = inet_shutdown, /* ok */ | 609 | .shutdown = inet_shutdown, /* ok */ |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index ce6f0d15b5dd..afc307c89d1a 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -1334,7 +1334,7 @@ void raw6_proc_exit(void) | |||
1334 | } | 1334 | } |
1335 | #endif /* CONFIG_PROC_FS */ | 1335 | #endif /* CONFIG_PROC_FS */ |
1336 | 1336 | ||
1337 | /* Same as inet6_dgram_ops, sans udp_poll_mask. */ | 1337 | /* Same as inet6_dgram_ops, sans udp_poll. */ |
1338 | const struct proto_ops inet6_sockraw_ops = { | 1338 | const struct proto_ops inet6_sockraw_ops = { |
1339 | .family = PF_INET6, | 1339 | .family = PF_INET6, |
1340 | .owner = THIS_MODULE, | 1340 | .owner = THIS_MODULE, |
@@ -1344,7 +1344,7 @@ const struct proto_ops inet6_sockraw_ops = { | |||
1344 | .socketpair = sock_no_socketpair, /* a do nothing */ | 1344 | .socketpair = sock_no_socketpair, /* a do nothing */ |
1345 | .accept = sock_no_accept, /* a do nothing */ | 1345 | .accept = sock_no_accept, /* a do nothing */ |
1346 | .getname = inet6_getname, | 1346 | .getname = inet6_getname, |
1347 | .poll_mask = datagram_poll_mask, /* ok */ | 1347 | .poll = datagram_poll, /* ok */ |
1348 | .ioctl = inet6_ioctl, /* must change */ | 1348 | .ioctl = inet6_ioctl, /* must change */ |
1349 | .listen = sock_no_listen, /* ok */ | 1349 | .listen = sock_no_listen, /* ok */ |
1350 | .shutdown = inet_shutdown, /* ok */ | 1350 | .shutdown = inet_shutdown, /* ok */ |
diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c index 68e86257a549..893a022f9620 100644 --- a/net/iucv/af_iucv.c +++ b/net/iucv/af_iucv.c | |||
@@ -1488,11 +1488,14 @@ static inline __poll_t iucv_accept_poll(struct sock *parent) | |||
1488 | return 0; | 1488 | return 0; |
1489 | } | 1489 | } |
1490 | 1490 | ||
1491 | static __poll_t iucv_sock_poll_mask(struct socket *sock, __poll_t events) | 1491 | __poll_t iucv_sock_poll(struct file *file, struct socket *sock, |
1492 | poll_table *wait) | ||
1492 | { | 1493 | { |
1493 | struct sock *sk = sock->sk; | 1494 | struct sock *sk = sock->sk; |
1494 | __poll_t mask = 0; | 1495 | __poll_t mask = 0; |
1495 | 1496 | ||
1497 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
1498 | |||
1496 | if (sk->sk_state == IUCV_LISTEN) | 1499 | if (sk->sk_state == IUCV_LISTEN) |
1497 | return iucv_accept_poll(sk); | 1500 | return iucv_accept_poll(sk); |
1498 | 1501 | ||
@@ -2385,7 +2388,7 @@ static const struct proto_ops iucv_sock_ops = { | |||
2385 | .getname = iucv_sock_getname, | 2388 | .getname = iucv_sock_getname, |
2386 | .sendmsg = iucv_sock_sendmsg, | 2389 | .sendmsg = iucv_sock_sendmsg, |
2387 | .recvmsg = iucv_sock_recvmsg, | 2390 | .recvmsg = iucv_sock_recvmsg, |
2388 | .poll_mask = iucv_sock_poll_mask, | 2391 | .poll = iucv_sock_poll, |
2389 | .ioctl = sock_no_ioctl, | 2392 | .ioctl = sock_no_ioctl, |
2390 | .mmap = sock_no_mmap, | 2393 | .mmap = sock_no_mmap, |
2391 | .socketpair = sock_no_socketpair, | 2394 | .socketpair = sock_no_socketpair, |
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c index 84b7d5c6fec8..d3601d421571 100644 --- a/net/kcm/kcmsock.c +++ b/net/kcm/kcmsock.c | |||
@@ -1336,9 +1336,9 @@ static void init_kcm_sock(struct kcm_sock *kcm, struct kcm_mux *mux) | |||
1336 | struct list_head *head; | 1336 | struct list_head *head; |
1337 | int index = 0; | 1337 | int index = 0; |
1338 | 1338 | ||
1339 | /* For SOCK_SEQPACKET sock type, datagram_poll_mask checks the sk_state, | 1339 | /* For SOCK_SEQPACKET sock type, datagram_poll checks the sk_state, so |
1340 | * so we set sk_state, otherwise epoll_wait always returns right away | 1340 | * we set sk_state, otherwise epoll_wait always returns right away with |
1341 | * with EPOLLHUP | 1341 | * EPOLLHUP |
1342 | */ | 1342 | */ |
1343 | kcm->sk.sk_state = TCP_ESTABLISHED; | 1343 | kcm->sk.sk_state = TCP_ESTABLISHED; |
1344 | 1344 | ||
@@ -1903,7 +1903,7 @@ static const struct proto_ops kcm_dgram_ops = { | |||
1903 | .socketpair = sock_no_socketpair, | 1903 | .socketpair = sock_no_socketpair, |
1904 | .accept = sock_no_accept, | 1904 | .accept = sock_no_accept, |
1905 | .getname = sock_no_getname, | 1905 | .getname = sock_no_getname, |
1906 | .poll_mask = datagram_poll_mask, | 1906 | .poll = datagram_poll, |
1907 | .ioctl = kcm_ioctl, | 1907 | .ioctl = kcm_ioctl, |
1908 | .listen = sock_no_listen, | 1908 | .listen = sock_no_listen, |
1909 | .shutdown = sock_no_shutdown, | 1909 | .shutdown = sock_no_shutdown, |
@@ -1924,7 +1924,7 @@ static const struct proto_ops kcm_seqpacket_ops = { | |||
1924 | .socketpair = sock_no_socketpair, | 1924 | .socketpair = sock_no_socketpair, |
1925 | .accept = sock_no_accept, | 1925 | .accept = sock_no_accept, |
1926 | .getname = sock_no_getname, | 1926 | .getname = sock_no_getname, |
1927 | .poll_mask = datagram_poll_mask, | 1927 | .poll = datagram_poll, |
1928 | .ioctl = kcm_ioctl, | 1928 | .ioctl = kcm_ioctl, |
1929 | .listen = sock_no_listen, | 1929 | .listen = sock_no_listen, |
1930 | .shutdown = sock_no_shutdown, | 1930 | .shutdown = sock_no_shutdown, |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 8bdc1cbe490a..5e1d2946ffbf 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -3751,7 +3751,7 @@ static const struct proto_ops pfkey_ops = { | |||
3751 | 3751 | ||
3752 | /* Now the operations that really occur. */ | 3752 | /* Now the operations that really occur. */ |
3753 | .release = pfkey_release, | 3753 | .release = pfkey_release, |
3754 | .poll_mask = datagram_poll_mask, | 3754 | .poll = datagram_poll, |
3755 | .sendmsg = pfkey_sendmsg, | 3755 | .sendmsg = pfkey_sendmsg, |
3756 | .recvmsg = pfkey_recvmsg, | 3756 | .recvmsg = pfkey_recvmsg, |
3757 | }; | 3757 | }; |
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index 181073bf6925..a9c05b2bc1b0 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c | |||
@@ -613,7 +613,7 @@ static const struct proto_ops l2tp_ip_ops = { | |||
613 | .socketpair = sock_no_socketpair, | 613 | .socketpair = sock_no_socketpair, |
614 | .accept = sock_no_accept, | 614 | .accept = sock_no_accept, |
615 | .getname = l2tp_ip_getname, | 615 | .getname = l2tp_ip_getname, |
616 | .poll_mask = datagram_poll_mask, | 616 | .poll = datagram_poll, |
617 | .ioctl = inet_ioctl, | 617 | .ioctl = inet_ioctl, |
618 | .listen = sock_no_listen, | 618 | .listen = sock_no_listen, |
619 | .shutdown = inet_shutdown, | 619 | .shutdown = inet_shutdown, |
diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c index 336e4c00abbc..957369192ca1 100644 --- a/net/l2tp/l2tp_ip6.c +++ b/net/l2tp/l2tp_ip6.c | |||
@@ -754,7 +754,7 @@ static const struct proto_ops l2tp_ip6_ops = { | |||
754 | .socketpair = sock_no_socketpair, | 754 | .socketpair = sock_no_socketpair, |
755 | .accept = sock_no_accept, | 755 | .accept = sock_no_accept, |
756 | .getname = l2tp_ip6_getname, | 756 | .getname = l2tp_ip6_getname, |
757 | .poll_mask = datagram_poll_mask, | 757 | .poll = datagram_poll, |
758 | .ioctl = inet6_ioctl, | 758 | .ioctl = inet6_ioctl, |
759 | .listen = sock_no_listen, | 759 | .listen = sock_no_listen, |
760 | .shutdown = inet_shutdown, | 760 | .shutdown = inet_shutdown, |
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c index 55188382845c..e398797878a9 100644 --- a/net/l2tp/l2tp_ppp.c +++ b/net/l2tp/l2tp_ppp.c | |||
@@ -1818,7 +1818,7 @@ static const struct proto_ops pppol2tp_ops = { | |||
1818 | .socketpair = sock_no_socketpair, | 1818 | .socketpair = sock_no_socketpair, |
1819 | .accept = sock_no_accept, | 1819 | .accept = sock_no_accept, |
1820 | .getname = pppol2tp_getname, | 1820 | .getname = pppol2tp_getname, |
1821 | .poll_mask = datagram_poll_mask, | 1821 | .poll = datagram_poll, |
1822 | .listen = sock_no_listen, | 1822 | .listen = sock_no_listen, |
1823 | .shutdown = sock_no_shutdown, | 1823 | .shutdown = sock_no_shutdown, |
1824 | .setsockopt = pppol2tp_setsockopt, | 1824 | .setsockopt = pppol2tp_setsockopt, |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 804de8490186..1beeea9549fa 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
@@ -1192,7 +1192,7 @@ static const struct proto_ops llc_ui_ops = { | |||
1192 | .socketpair = sock_no_socketpair, | 1192 | .socketpair = sock_no_socketpair, |
1193 | .accept = llc_ui_accept, | 1193 | .accept = llc_ui_accept, |
1194 | .getname = llc_ui_getname, | 1194 | .getname = llc_ui_getname, |
1195 | .poll_mask = datagram_poll_mask, | 1195 | .poll = datagram_poll, |
1196 | .ioctl = llc_ui_ioctl, | 1196 | .ioctl = llc_ui_ioctl, |
1197 | .listen = llc_ui_listen, | 1197 | .listen = llc_ui_listen, |
1198 | .shutdown = llc_ui_shutdown, | 1198 | .shutdown = llc_ui_shutdown, |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 1189b84413d5..393573a99a5a 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -2658,7 +2658,7 @@ static const struct proto_ops netlink_ops = { | |||
2658 | .socketpair = sock_no_socketpair, | 2658 | .socketpair = sock_no_socketpair, |
2659 | .accept = sock_no_accept, | 2659 | .accept = sock_no_accept, |
2660 | .getname = netlink_getname, | 2660 | .getname = netlink_getname, |
2661 | .poll_mask = datagram_poll_mask, | 2661 | .poll = datagram_poll, |
2662 | .ioctl = netlink_ioctl, | 2662 | .ioctl = netlink_ioctl, |
2663 | .listen = sock_no_listen, | 2663 | .listen = sock_no_listen, |
2664 | .shutdown = sock_no_shutdown, | 2664 | .shutdown = sock_no_shutdown, |
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 93fbcafbf388..03f37c4e64fe 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c | |||
@@ -1355,7 +1355,7 @@ static const struct proto_ops nr_proto_ops = { | |||
1355 | .socketpair = sock_no_socketpair, | 1355 | .socketpair = sock_no_socketpair, |
1356 | .accept = nr_accept, | 1356 | .accept = nr_accept, |
1357 | .getname = nr_getname, | 1357 | .getname = nr_getname, |
1358 | .poll_mask = datagram_poll_mask, | 1358 | .poll = datagram_poll, |
1359 | .ioctl = nr_ioctl, | 1359 | .ioctl = nr_ioctl, |
1360 | .listen = nr_listen, | 1360 | .listen = nr_listen, |
1361 | .shutdown = sock_no_shutdown, | 1361 | .shutdown = sock_no_shutdown, |
diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index ab5bb14b49af..ea0c0c6f1874 100644 --- a/net/nfc/llcp_sock.c +++ b/net/nfc/llcp_sock.c | |||
@@ -548,13 +548,16 @@ static inline __poll_t llcp_accept_poll(struct sock *parent) | |||
548 | return 0; | 548 | return 0; |
549 | } | 549 | } |
550 | 550 | ||
551 | static __poll_t llcp_sock_poll_mask(struct socket *sock, __poll_t events) | 551 | static __poll_t llcp_sock_poll(struct file *file, struct socket *sock, |
552 | poll_table *wait) | ||
552 | { | 553 | { |
553 | struct sock *sk = sock->sk; | 554 | struct sock *sk = sock->sk; |
554 | __poll_t mask = 0; | 555 | __poll_t mask = 0; |
555 | 556 | ||
556 | pr_debug("%p\n", sk); | 557 | pr_debug("%p\n", sk); |
557 | 558 | ||
559 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
560 | |||
558 | if (sk->sk_state == LLCP_LISTEN) | 561 | if (sk->sk_state == LLCP_LISTEN) |
559 | return llcp_accept_poll(sk); | 562 | return llcp_accept_poll(sk); |
560 | 563 | ||
@@ -896,7 +899,7 @@ static const struct proto_ops llcp_sock_ops = { | |||
896 | .socketpair = sock_no_socketpair, | 899 | .socketpair = sock_no_socketpair, |
897 | .accept = llcp_sock_accept, | 900 | .accept = llcp_sock_accept, |
898 | .getname = llcp_sock_getname, | 901 | .getname = llcp_sock_getname, |
899 | .poll_mask = llcp_sock_poll_mask, | 902 | .poll = llcp_sock_poll, |
900 | .ioctl = sock_no_ioctl, | 903 | .ioctl = sock_no_ioctl, |
901 | .listen = llcp_sock_listen, | 904 | .listen = llcp_sock_listen, |
902 | .shutdown = sock_no_shutdown, | 905 | .shutdown = sock_no_shutdown, |
@@ -916,7 +919,7 @@ static const struct proto_ops llcp_rawsock_ops = { | |||
916 | .socketpair = sock_no_socketpair, | 919 | .socketpair = sock_no_socketpair, |
917 | .accept = sock_no_accept, | 920 | .accept = sock_no_accept, |
918 | .getname = llcp_sock_getname, | 921 | .getname = llcp_sock_getname, |
919 | .poll_mask = llcp_sock_poll_mask, | 922 | .poll = llcp_sock_poll, |
920 | .ioctl = sock_no_ioctl, | 923 | .ioctl = sock_no_ioctl, |
921 | .listen = sock_no_listen, | 924 | .listen = sock_no_listen, |
922 | .shutdown = sock_no_shutdown, | 925 | .shutdown = sock_no_shutdown, |
diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c index 60c322531c49..e2188deb08dc 100644 --- a/net/nfc/rawsock.c +++ b/net/nfc/rawsock.c | |||
@@ -284,7 +284,7 @@ static const struct proto_ops rawsock_ops = { | |||
284 | .socketpair = sock_no_socketpair, | 284 | .socketpair = sock_no_socketpair, |
285 | .accept = sock_no_accept, | 285 | .accept = sock_no_accept, |
286 | .getname = sock_no_getname, | 286 | .getname = sock_no_getname, |
287 | .poll_mask = datagram_poll_mask, | 287 | .poll = datagram_poll, |
288 | .ioctl = sock_no_ioctl, | 288 | .ioctl = sock_no_ioctl, |
289 | .listen = sock_no_listen, | 289 | .listen = sock_no_listen, |
290 | .shutdown = sock_no_shutdown, | 290 | .shutdown = sock_no_shutdown, |
@@ -304,7 +304,7 @@ static const struct proto_ops rawsock_raw_ops = { | |||
304 | .socketpair = sock_no_socketpair, | 304 | .socketpair = sock_no_socketpair, |
305 | .accept = sock_no_accept, | 305 | .accept = sock_no_accept, |
306 | .getname = sock_no_getname, | 306 | .getname = sock_no_getname, |
307 | .poll_mask = datagram_poll_mask, | 307 | .poll = datagram_poll, |
308 | .ioctl = sock_no_ioctl, | 308 | .ioctl = sock_no_ioctl, |
309 | .listen = sock_no_listen, | 309 | .listen = sock_no_listen, |
310 | .shutdown = sock_no_shutdown, | 310 | .shutdown = sock_no_shutdown, |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index ff8e7e245c37..57634bc3da74 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -4076,11 +4076,12 @@ static int packet_ioctl(struct socket *sock, unsigned int cmd, | |||
4076 | return 0; | 4076 | return 0; |
4077 | } | 4077 | } |
4078 | 4078 | ||
4079 | static __poll_t packet_poll_mask(struct socket *sock, __poll_t events) | 4079 | static __poll_t packet_poll(struct file *file, struct socket *sock, |
4080 | poll_table *wait) | ||
4080 | { | 4081 | { |
4081 | struct sock *sk = sock->sk; | 4082 | struct sock *sk = sock->sk; |
4082 | struct packet_sock *po = pkt_sk(sk); | 4083 | struct packet_sock *po = pkt_sk(sk); |
4083 | __poll_t mask = datagram_poll_mask(sock, events); | 4084 | __poll_t mask = datagram_poll(file, sock, wait); |
4084 | 4085 | ||
4085 | spin_lock_bh(&sk->sk_receive_queue.lock); | 4086 | spin_lock_bh(&sk->sk_receive_queue.lock); |
4086 | if (po->rx_ring.pg_vec) { | 4087 | if (po->rx_ring.pg_vec) { |
@@ -4422,7 +4423,7 @@ static const struct proto_ops packet_ops_spkt = { | |||
4422 | .socketpair = sock_no_socketpair, | 4423 | .socketpair = sock_no_socketpair, |
4423 | .accept = sock_no_accept, | 4424 | .accept = sock_no_accept, |
4424 | .getname = packet_getname_spkt, | 4425 | .getname = packet_getname_spkt, |
4425 | .poll_mask = datagram_poll_mask, | 4426 | .poll = datagram_poll, |
4426 | .ioctl = packet_ioctl, | 4427 | .ioctl = packet_ioctl, |
4427 | .listen = sock_no_listen, | 4428 | .listen = sock_no_listen, |
4428 | .shutdown = sock_no_shutdown, | 4429 | .shutdown = sock_no_shutdown, |
@@ -4443,7 +4444,7 @@ static const struct proto_ops packet_ops = { | |||
4443 | .socketpair = sock_no_socketpair, | 4444 | .socketpair = sock_no_socketpair, |
4444 | .accept = sock_no_accept, | 4445 | .accept = sock_no_accept, |
4445 | .getname = packet_getname, | 4446 | .getname = packet_getname, |
4446 | .poll_mask = packet_poll_mask, | 4447 | .poll = packet_poll, |
4447 | .ioctl = packet_ioctl, | 4448 | .ioctl = packet_ioctl, |
4448 | .listen = sock_no_listen, | 4449 | .listen = sock_no_listen, |
4449 | .shutdown = sock_no_shutdown, | 4450 | .shutdown = sock_no_shutdown, |
diff --git a/net/phonet/socket.c b/net/phonet/socket.c index c295c4e20f01..30187990257f 100644 --- a/net/phonet/socket.c +++ b/net/phonet/socket.c | |||
@@ -340,12 +340,15 @@ static int pn_socket_getname(struct socket *sock, struct sockaddr *addr, | |||
340 | return sizeof(struct sockaddr_pn); | 340 | return sizeof(struct sockaddr_pn); |
341 | } | 341 | } |
342 | 342 | ||
343 | static __poll_t pn_socket_poll_mask(struct socket *sock, __poll_t events) | 343 | static __poll_t pn_socket_poll(struct file *file, struct socket *sock, |
344 | poll_table *wait) | ||
344 | { | 345 | { |
345 | struct sock *sk = sock->sk; | 346 | struct sock *sk = sock->sk; |
346 | struct pep_sock *pn = pep_sk(sk); | 347 | struct pep_sock *pn = pep_sk(sk); |
347 | __poll_t mask = 0; | 348 | __poll_t mask = 0; |
348 | 349 | ||
350 | poll_wait(file, sk_sleep(sk), wait); | ||
351 | |||
349 | if (sk->sk_state == TCP_CLOSE) | 352 | if (sk->sk_state == TCP_CLOSE) |
350 | return EPOLLERR; | 353 | return EPOLLERR; |
351 | if (!skb_queue_empty(&sk->sk_receive_queue)) | 354 | if (!skb_queue_empty(&sk->sk_receive_queue)) |
@@ -445,7 +448,7 @@ const struct proto_ops phonet_dgram_ops = { | |||
445 | .socketpair = sock_no_socketpair, | 448 | .socketpair = sock_no_socketpair, |
446 | .accept = sock_no_accept, | 449 | .accept = sock_no_accept, |
447 | .getname = pn_socket_getname, | 450 | .getname = pn_socket_getname, |
448 | .poll_mask = datagram_poll_mask, | 451 | .poll = datagram_poll, |
449 | .ioctl = pn_socket_ioctl, | 452 | .ioctl = pn_socket_ioctl, |
450 | .listen = sock_no_listen, | 453 | .listen = sock_no_listen, |
451 | .shutdown = sock_no_shutdown, | 454 | .shutdown = sock_no_shutdown, |
@@ -470,7 +473,7 @@ const struct proto_ops phonet_stream_ops = { | |||
470 | .socketpair = sock_no_socketpair, | 473 | .socketpair = sock_no_socketpair, |
471 | .accept = pn_socket_accept, | 474 | .accept = pn_socket_accept, |
472 | .getname = pn_socket_getname, | 475 | .getname = pn_socket_getname, |
473 | .poll_mask = pn_socket_poll_mask, | 476 | .poll = pn_socket_poll, |
474 | .ioctl = pn_socket_ioctl, | 477 | .ioctl = pn_socket_ioctl, |
475 | .listen = pn_socket_listen, | 478 | .listen = pn_socket_listen, |
476 | .shutdown = sock_no_shutdown, | 479 | .shutdown = sock_no_shutdown, |
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index 1b5025ea5b04..2aa07b547b16 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c | |||
@@ -1023,7 +1023,7 @@ static const struct proto_ops qrtr_proto_ops = { | |||
1023 | .recvmsg = qrtr_recvmsg, | 1023 | .recvmsg = qrtr_recvmsg, |
1024 | .getname = qrtr_getname, | 1024 | .getname = qrtr_getname, |
1025 | .ioctl = qrtr_ioctl, | 1025 | .ioctl = qrtr_ioctl, |
1026 | .poll_mask = datagram_poll_mask, | 1026 | .poll = datagram_poll, |
1027 | .shutdown = sock_no_shutdown, | 1027 | .shutdown = sock_no_shutdown, |
1028 | .setsockopt = sock_no_setsockopt, | 1028 | .setsockopt = sock_no_setsockopt, |
1029 | .getsockopt = sock_no_getsockopt, | 1029 | .getsockopt = sock_no_getsockopt, |
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index ebe42e7eb456..d00a0ef39a56 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c | |||
@@ -1470,7 +1470,7 @@ static const struct proto_ops rose_proto_ops = { | |||
1470 | .socketpair = sock_no_socketpair, | 1470 | .socketpair = sock_no_socketpair, |
1471 | .accept = rose_accept, | 1471 | .accept = rose_accept, |
1472 | .getname = rose_getname, | 1472 | .getname = rose_getname, |
1473 | .poll_mask = datagram_poll_mask, | 1473 | .poll = datagram_poll, |
1474 | .ioctl = rose_ioctl, | 1474 | .ioctl = rose_ioctl, |
1475 | .listen = rose_listen, | 1475 | .listen = rose_listen, |
1476 | .shutdown = sock_no_shutdown, | 1476 | .shutdown = sock_no_shutdown, |
diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c index 3b1ac93efee2..2b463047dd7b 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c | |||
@@ -734,11 +734,15 @@ static int rxrpc_getsockopt(struct socket *sock, int level, int optname, | |||
734 | /* | 734 | /* |
735 | * permit an RxRPC socket to be polled | 735 | * permit an RxRPC socket to be polled |
736 | */ | 736 | */ |
737 | static __poll_t rxrpc_poll_mask(struct socket *sock, __poll_t events) | 737 | static __poll_t rxrpc_poll(struct file *file, struct socket *sock, |
738 | poll_table *wait) | ||
738 | { | 739 | { |
739 | struct sock *sk = sock->sk; | 740 | struct sock *sk = sock->sk; |
740 | struct rxrpc_sock *rx = rxrpc_sk(sk); | 741 | struct rxrpc_sock *rx = rxrpc_sk(sk); |
741 | __poll_t mask = 0; | 742 | __poll_t mask; |
743 | |||
744 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
745 | mask = 0; | ||
742 | 746 | ||
743 | /* the socket is readable if there are any messages waiting on the Rx | 747 | /* the socket is readable if there are any messages waiting on the Rx |
744 | * queue */ | 748 | * queue */ |
@@ -945,7 +949,7 @@ static const struct proto_ops rxrpc_rpc_ops = { | |||
945 | .socketpair = sock_no_socketpair, | 949 | .socketpair = sock_no_socketpair, |
946 | .accept = sock_no_accept, | 950 | .accept = sock_no_accept, |
947 | .getname = sock_no_getname, | 951 | .getname = sock_no_getname, |
948 | .poll_mask = rxrpc_poll_mask, | 952 | .poll = rxrpc_poll, |
949 | .ioctl = sock_no_ioctl, | 953 | .ioctl = sock_no_ioctl, |
950 | .listen = rxrpc_listen, | 954 | .listen = rxrpc_listen, |
951 | .shutdown = rxrpc_shutdown, | 955 | .shutdown = rxrpc_shutdown, |
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index 7339918a805d..0cd2e764f47f 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c | |||
@@ -1010,7 +1010,7 @@ static const struct proto_ops inet6_seqpacket_ops = { | |||
1010 | .socketpair = sock_no_socketpair, | 1010 | .socketpair = sock_no_socketpair, |
1011 | .accept = inet_accept, | 1011 | .accept = inet_accept, |
1012 | .getname = sctp_getname, | 1012 | .getname = sctp_getname, |
1013 | .poll_mask = sctp_poll_mask, | 1013 | .poll = sctp_poll, |
1014 | .ioctl = inet6_ioctl, | 1014 | .ioctl = inet6_ioctl, |
1015 | .listen = sctp_inet_listen, | 1015 | .listen = sctp_inet_listen, |
1016 | .shutdown = inet_shutdown, | 1016 | .shutdown = inet_shutdown, |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 5dffbc493008..67f73d3a1356 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -1016,7 +1016,7 @@ static const struct proto_ops inet_seqpacket_ops = { | |||
1016 | .socketpair = sock_no_socketpair, | 1016 | .socketpair = sock_no_socketpair, |
1017 | .accept = inet_accept, | 1017 | .accept = inet_accept, |
1018 | .getname = inet_getname, /* Semantics are different. */ | 1018 | .getname = inet_getname, /* Semantics are different. */ |
1019 | .poll_mask = sctp_poll_mask, | 1019 | .poll = sctp_poll, |
1020 | .ioctl = inet_ioctl, | 1020 | .ioctl = inet_ioctl, |
1021 | .listen = sctp_inet_listen, | 1021 | .listen = sctp_inet_listen, |
1022 | .shutdown = inet_shutdown, /* Looks harmless. */ | 1022 | .shutdown = inet_shutdown, /* Looks harmless. */ |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index d20f7addee19..ce620e878538 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -7717,12 +7717,14 @@ out: | |||
7717 | * here, again, by modeling the current TCP/UDP code. We don't have | 7717 | * here, again, by modeling the current TCP/UDP code. We don't have |
7718 | * a good way to test with it yet. | 7718 | * a good way to test with it yet. |
7719 | */ | 7719 | */ |
7720 | __poll_t sctp_poll_mask(struct socket *sock, __poll_t events) | 7720 | __poll_t sctp_poll(struct file *file, struct socket *sock, poll_table *wait) |
7721 | { | 7721 | { |
7722 | struct sock *sk = sock->sk; | 7722 | struct sock *sk = sock->sk; |
7723 | struct sctp_sock *sp = sctp_sk(sk); | 7723 | struct sctp_sock *sp = sctp_sk(sk); |
7724 | __poll_t mask; | 7724 | __poll_t mask; |
7725 | 7725 | ||
7726 | poll_wait(file, sk_sleep(sk), wait); | ||
7727 | |||
7726 | sock_rps_record_flow(sk); | 7728 | sock_rps_record_flow(sk); |
7727 | 7729 | ||
7728 | /* A TCP-style listening socket becomes readable when the accept queue | 7730 | /* A TCP-style listening socket becomes readable when the accept queue |
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index da7f02edcd37..973b4471b532 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c | |||
@@ -1273,7 +1273,8 @@ static __poll_t smc_accept_poll(struct sock *parent) | |||
1273 | return mask; | 1273 | return mask; |
1274 | } | 1274 | } |
1275 | 1275 | ||
1276 | static __poll_t smc_poll_mask(struct socket *sock, __poll_t events) | 1276 | static __poll_t smc_poll(struct file *file, struct socket *sock, |
1277 | poll_table *wait) | ||
1277 | { | 1278 | { |
1278 | struct sock *sk = sock->sk; | 1279 | struct sock *sk = sock->sk; |
1279 | __poll_t mask = 0; | 1280 | __poll_t mask = 0; |
@@ -1289,7 +1290,7 @@ static __poll_t smc_poll_mask(struct socket *sock, __poll_t events) | |||
1289 | if ((sk->sk_state == SMC_INIT) || smc->use_fallback) { | 1290 | if ((sk->sk_state == SMC_INIT) || smc->use_fallback) { |
1290 | /* delegate to CLC child sock */ | 1291 | /* delegate to CLC child sock */ |
1291 | release_sock(sk); | 1292 | release_sock(sk); |
1292 | mask = smc->clcsock->ops->poll_mask(smc->clcsock, events); | 1293 | mask = smc->clcsock->ops->poll(file, smc->clcsock, wait); |
1293 | lock_sock(sk); | 1294 | lock_sock(sk); |
1294 | sk->sk_err = smc->clcsock->sk->sk_err; | 1295 | sk->sk_err = smc->clcsock->sk->sk_err; |
1295 | if (sk->sk_err) { | 1296 | if (sk->sk_err) { |
@@ -1307,6 +1308,11 @@ static __poll_t smc_poll_mask(struct socket *sock, __poll_t events) | |||
1307 | } | 1308 | } |
1308 | } | 1309 | } |
1309 | } else { | 1310 | } else { |
1311 | if (sk->sk_state != SMC_CLOSED) { | ||
1312 | release_sock(sk); | ||
1313 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
1314 | lock_sock(sk); | ||
1315 | } | ||
1310 | if (sk->sk_err) | 1316 | if (sk->sk_err) |
1311 | mask |= EPOLLERR; | 1317 | mask |= EPOLLERR; |
1312 | if ((sk->sk_shutdown == SHUTDOWN_MASK) || | 1318 | if ((sk->sk_shutdown == SHUTDOWN_MASK) || |
@@ -1619,7 +1625,7 @@ static const struct proto_ops smc_sock_ops = { | |||
1619 | .socketpair = sock_no_socketpair, | 1625 | .socketpair = sock_no_socketpair, |
1620 | .accept = smc_accept, | 1626 | .accept = smc_accept, |
1621 | .getname = smc_getname, | 1627 | .getname = smc_getname, |
1622 | .poll_mask = smc_poll_mask, | 1628 | .poll = smc_poll, |
1623 | .ioctl = smc_ioctl, | 1629 | .ioctl = smc_ioctl, |
1624 | .listen = smc_listen, | 1630 | .listen = smc_listen, |
1625 | .shutdown = smc_shutdown, | 1631 | .shutdown = smc_shutdown, |
diff --git a/net/socket.c b/net/socket.c index 8a109012608a..a564c6ed19d5 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -117,10 +117,8 @@ static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from); | |||
117 | static int sock_mmap(struct file *file, struct vm_area_struct *vma); | 117 | static int sock_mmap(struct file *file, struct vm_area_struct *vma); |
118 | 118 | ||
119 | static int sock_close(struct inode *inode, struct file *file); | 119 | static int sock_close(struct inode *inode, struct file *file); |
120 | static struct wait_queue_head *sock_get_poll_head(struct file *file, | 120 | static __poll_t sock_poll(struct file *file, |
121 | __poll_t events); | 121 | struct poll_table_struct *wait); |
122 | static __poll_t sock_poll_mask(struct file *file, __poll_t); | ||
123 | static __poll_t sock_poll(struct file *file, struct poll_table_struct *wait); | ||
124 | static long sock_ioctl(struct file *file, unsigned int cmd, unsigned long arg); | 122 | static long sock_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
125 | #ifdef CONFIG_COMPAT | 123 | #ifdef CONFIG_COMPAT |
126 | static long compat_sock_ioctl(struct file *file, | 124 | static long compat_sock_ioctl(struct file *file, |
@@ -143,8 +141,6 @@ static const struct file_operations socket_file_ops = { | |||
143 | .llseek = no_llseek, | 141 | .llseek = no_llseek, |
144 | .read_iter = sock_read_iter, | 142 | .read_iter = sock_read_iter, |
145 | .write_iter = sock_write_iter, | 143 | .write_iter = sock_write_iter, |
146 | .get_poll_head = sock_get_poll_head, | ||
147 | .poll_mask = sock_poll_mask, | ||
148 | .poll = sock_poll, | 144 | .poll = sock_poll, |
149 | .unlocked_ioctl = sock_ioctl, | 145 | .unlocked_ioctl = sock_ioctl, |
150 | #ifdef CONFIG_COMPAT | 146 | #ifdef CONFIG_COMPAT |
@@ -1130,48 +1126,14 @@ out_release: | |||
1130 | } | 1126 | } |
1131 | EXPORT_SYMBOL(sock_create_lite); | 1127 | EXPORT_SYMBOL(sock_create_lite); |
1132 | 1128 | ||
1133 | static struct wait_queue_head *sock_get_poll_head(struct file *file, | ||
1134 | __poll_t events) | ||
1135 | { | ||
1136 | struct socket *sock = file->private_data; | ||
1137 | |||
1138 | if (!sock->ops->poll_mask) | ||
1139 | return NULL; | ||
1140 | sock_poll_busy_loop(sock, events); | ||
1141 | return sk_sleep(sock->sk); | ||
1142 | } | ||
1143 | |||
1144 | static __poll_t sock_poll_mask(struct file *file, __poll_t events) | ||
1145 | { | ||
1146 | struct socket *sock = file->private_data; | ||
1147 | |||
1148 | /* | ||
1149 | * We need to be sure we are in sync with the socket flags modification. | ||
1150 | * | ||
1151 | * This memory barrier is paired in the wq_has_sleeper. | ||
1152 | */ | ||
1153 | smp_mb(); | ||
1154 | |||
1155 | /* this socket can poll_ll so tell the system call */ | ||
1156 | return sock->ops->poll_mask(sock, events) | | ||
1157 | (sk_can_busy_loop(sock->sk) ? POLL_BUSY_LOOP : 0); | ||
1158 | } | ||
1159 | |||
1160 | /* No kernel lock held - perfect */ | 1129 | /* No kernel lock held - perfect */ |
1161 | static __poll_t sock_poll(struct file *file, poll_table *wait) | 1130 | static __poll_t sock_poll(struct file *file, poll_table *wait) |
1162 | { | 1131 | { |
1163 | struct socket *sock = file->private_data; | 1132 | struct socket *sock = file->private_data; |
1164 | __poll_t events = poll_requested_events(wait), mask = 0; | 1133 | __poll_t events = poll_requested_events(wait); |
1165 | |||
1166 | if (sock->ops->poll) { | ||
1167 | sock_poll_busy_loop(sock, events); | ||
1168 | mask = sock->ops->poll(file, sock, wait); | ||
1169 | } else if (sock->ops->poll_mask) { | ||
1170 | sock_poll_wait(file, sock_get_poll_head(file, events), wait); | ||
1171 | mask = sock->ops->poll_mask(sock, events); | ||
1172 | } | ||
1173 | 1134 | ||
1174 | return mask | sock_poll_busy_flag(sock); | 1135 | sock_poll_busy_loop(sock, events); |
1136 | return sock->ops->poll(file, sock, wait) | sock_poll_busy_flag(sock); | ||
1175 | } | 1137 | } |
1176 | 1138 | ||
1177 | static int sock_mmap(struct file *file, struct vm_area_struct *vma) | 1139 | static int sock_mmap(struct file *file, struct vm_area_struct *vma) |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 14a5d055717d..930852c54d7a 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -692,9 +692,10 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr, | |||
692 | } | 692 | } |
693 | 693 | ||
694 | /** | 694 | /** |
695 | * tipc_poll - read pollmask | 695 | * tipc_poll - read and possibly block on pollmask |
696 | * @file: file structure associated with the socket | 696 | * @file: file structure associated with the socket |
697 | * @sock: socket for which to calculate the poll bits | 697 | * @sock: socket for which to calculate the poll bits |
698 | * @wait: ??? | ||
698 | * | 699 | * |
699 | * Returns pollmask value | 700 | * Returns pollmask value |
700 | * | 701 | * |
@@ -708,12 +709,15 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr, | |||
708 | * imply that the operation will succeed, merely that it should be performed | 709 | * imply that the operation will succeed, merely that it should be performed |
709 | * and will not block. | 710 | * and will not block. |
710 | */ | 711 | */ |
711 | static __poll_t tipc_poll_mask(struct socket *sock, __poll_t events) | 712 | static __poll_t tipc_poll(struct file *file, struct socket *sock, |
713 | poll_table *wait) | ||
712 | { | 714 | { |
713 | struct sock *sk = sock->sk; | 715 | struct sock *sk = sock->sk; |
714 | struct tipc_sock *tsk = tipc_sk(sk); | 716 | struct tipc_sock *tsk = tipc_sk(sk); |
715 | __poll_t revents = 0; | 717 | __poll_t revents = 0; |
716 | 718 | ||
719 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
720 | |||
717 | if (sk->sk_shutdown & RCV_SHUTDOWN) | 721 | if (sk->sk_shutdown & RCV_SHUTDOWN) |
718 | revents |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM; | 722 | revents |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM; |
719 | if (sk->sk_shutdown == SHUTDOWN_MASK) | 723 | if (sk->sk_shutdown == SHUTDOWN_MASK) |
@@ -3033,7 +3037,7 @@ static const struct proto_ops msg_ops = { | |||
3033 | .socketpair = tipc_socketpair, | 3037 | .socketpair = tipc_socketpair, |
3034 | .accept = sock_no_accept, | 3038 | .accept = sock_no_accept, |
3035 | .getname = tipc_getname, | 3039 | .getname = tipc_getname, |
3036 | .poll_mask = tipc_poll_mask, | 3040 | .poll = tipc_poll, |
3037 | .ioctl = tipc_ioctl, | 3041 | .ioctl = tipc_ioctl, |
3038 | .listen = sock_no_listen, | 3042 | .listen = sock_no_listen, |
3039 | .shutdown = tipc_shutdown, | 3043 | .shutdown = tipc_shutdown, |
@@ -3054,7 +3058,7 @@ static const struct proto_ops packet_ops = { | |||
3054 | .socketpair = tipc_socketpair, | 3058 | .socketpair = tipc_socketpair, |
3055 | .accept = tipc_accept, | 3059 | .accept = tipc_accept, |
3056 | .getname = tipc_getname, | 3060 | .getname = tipc_getname, |
3057 | .poll_mask = tipc_poll_mask, | 3061 | .poll = tipc_poll, |
3058 | .ioctl = tipc_ioctl, | 3062 | .ioctl = tipc_ioctl, |
3059 | .listen = tipc_listen, | 3063 | .listen = tipc_listen, |
3060 | .shutdown = tipc_shutdown, | 3064 | .shutdown = tipc_shutdown, |
@@ -3075,7 +3079,7 @@ static const struct proto_ops stream_ops = { | |||
3075 | .socketpair = tipc_socketpair, | 3079 | .socketpair = tipc_socketpair, |
3076 | .accept = tipc_accept, | 3080 | .accept = tipc_accept, |
3077 | .getname = tipc_getname, | 3081 | .getname = tipc_getname, |
3078 | .poll_mask = tipc_poll_mask, | 3082 | .poll = tipc_poll, |
3079 | .ioctl = tipc_ioctl, | 3083 | .ioctl = tipc_ioctl, |
3080 | .listen = tipc_listen, | 3084 | .listen = tipc_listen, |
3081 | .shutdown = tipc_shutdown, | 3085 | .shutdown = tipc_shutdown, |
diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c index a127d61e8af9..301f22430469 100644 --- a/net/tls/tls_main.c +++ b/net/tls/tls_main.c | |||
@@ -712,7 +712,7 @@ static int __init tls_register(void) | |||
712 | build_protos(tls_prots[TLSV4], &tcp_prot); | 712 | build_protos(tls_prots[TLSV4], &tcp_prot); |
713 | 713 | ||
714 | tls_sw_proto_ops = inet_stream_ops; | 714 | tls_sw_proto_ops = inet_stream_ops; |
715 | tls_sw_proto_ops.poll_mask = tls_sw_poll_mask; | 715 | tls_sw_proto_ops.poll = tls_sw_poll; |
716 | tls_sw_proto_ops.splice_read = tls_sw_splice_read; | 716 | tls_sw_proto_ops.splice_read = tls_sw_splice_read; |
717 | 717 | ||
718 | #ifdef CONFIG_TLS_DEVICE | 718 | #ifdef CONFIG_TLS_DEVICE |
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index f127fac88acf..d2380548f8f6 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c | |||
@@ -919,22 +919,23 @@ splice_read_end: | |||
919 | return copied ? : err; | 919 | return copied ? : err; |
920 | } | 920 | } |
921 | 921 | ||
922 | __poll_t tls_sw_poll_mask(struct socket *sock, __poll_t events) | 922 | unsigned int tls_sw_poll(struct file *file, struct socket *sock, |
923 | struct poll_table_struct *wait) | ||
923 | { | 924 | { |
925 | unsigned int ret; | ||
924 | struct sock *sk = sock->sk; | 926 | struct sock *sk = sock->sk; |
925 | struct tls_context *tls_ctx = tls_get_ctx(sk); | 927 | struct tls_context *tls_ctx = tls_get_ctx(sk); |
926 | struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx); | 928 | struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx); |
927 | __poll_t mask; | ||
928 | 929 | ||
929 | /* Grab EPOLLOUT and EPOLLHUP from the underlying socket */ | 930 | /* Grab POLLOUT and POLLHUP from the underlying socket */ |
930 | mask = ctx->sk_poll_mask(sock, events); | 931 | ret = ctx->sk_poll(file, sock, wait); |
931 | 932 | ||
932 | /* Clear EPOLLIN bits, and set based on recv_pkt */ | 933 | /* Clear POLLIN bits, and set based on recv_pkt */ |
933 | mask &= ~(EPOLLIN | EPOLLRDNORM); | 934 | ret &= ~(POLLIN | POLLRDNORM); |
934 | if (ctx->recv_pkt) | 935 | if (ctx->recv_pkt) |
935 | mask |= EPOLLIN | EPOLLRDNORM; | 936 | ret |= POLLIN | POLLRDNORM; |
936 | 937 | ||
937 | return mask; | 938 | return ret; |
938 | } | 939 | } |
939 | 940 | ||
940 | static int tls_read_size(struct strparser *strp, struct sk_buff *skb) | 941 | static int tls_read_size(struct strparser *strp, struct sk_buff *skb) |
@@ -1191,7 +1192,7 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx) | |||
1191 | sk->sk_data_ready = tls_data_ready; | 1192 | sk->sk_data_ready = tls_data_ready; |
1192 | write_unlock_bh(&sk->sk_callback_lock); | 1193 | write_unlock_bh(&sk->sk_callback_lock); |
1193 | 1194 | ||
1194 | sw_ctx_rx->sk_poll_mask = sk->sk_socket->ops->poll_mask; | 1195 | sw_ctx_rx->sk_poll = sk->sk_socket->ops->poll; |
1195 | 1196 | ||
1196 | strp_check_rcv(&sw_ctx_rx->strp); | 1197 | strp_check_rcv(&sw_ctx_rx->strp); |
1197 | } | 1198 | } |
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); |
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index bb5d5fa68c35..c1076c19b858 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c | |||
@@ -850,11 +850,18 @@ static int vsock_shutdown(struct socket *sock, int mode) | |||
850 | return err; | 850 | return err; |
851 | } | 851 | } |
852 | 852 | ||
853 | static __poll_t vsock_poll_mask(struct socket *sock, __poll_t events) | 853 | static __poll_t vsock_poll(struct file *file, struct socket *sock, |
854 | poll_table *wait) | ||
854 | { | 855 | { |
855 | struct sock *sk = sock->sk; | 856 | struct sock *sk; |
856 | struct vsock_sock *vsk = vsock_sk(sk); | 857 | __poll_t mask; |
857 | __poll_t mask = 0; | 858 | struct vsock_sock *vsk; |
859 | |||
860 | sk = sock->sk; | ||
861 | vsk = vsock_sk(sk); | ||
862 | |||
863 | poll_wait(file, sk_sleep(sk), wait); | ||
864 | mask = 0; | ||
858 | 865 | ||
859 | if (sk->sk_err) | 866 | if (sk->sk_err) |
860 | /* Signify that there has been an error on this socket. */ | 867 | /* Signify that there has been an error on this socket. */ |
@@ -1084,7 +1091,7 @@ static const struct proto_ops vsock_dgram_ops = { | |||
1084 | .socketpair = sock_no_socketpair, | 1091 | .socketpair = sock_no_socketpair, |
1085 | .accept = sock_no_accept, | 1092 | .accept = sock_no_accept, |
1086 | .getname = vsock_getname, | 1093 | .getname = vsock_getname, |
1087 | .poll_mask = vsock_poll_mask, | 1094 | .poll = vsock_poll, |
1088 | .ioctl = sock_no_ioctl, | 1095 | .ioctl = sock_no_ioctl, |
1089 | .listen = sock_no_listen, | 1096 | .listen = sock_no_listen, |
1090 | .shutdown = vsock_shutdown, | 1097 | .shutdown = vsock_shutdown, |
@@ -1842,7 +1849,7 @@ static const struct proto_ops vsock_stream_ops = { | |||
1842 | .socketpair = sock_no_socketpair, | 1849 | .socketpair = sock_no_socketpair, |
1843 | .accept = vsock_accept, | 1850 | .accept = vsock_accept, |
1844 | .getname = vsock_getname, | 1851 | .getname = vsock_getname, |
1845 | .poll_mask = vsock_poll_mask, | 1852 | .poll = vsock_poll, |
1846 | .ioctl = sock_no_ioctl, | 1853 | .ioctl = sock_no_ioctl, |
1847 | .listen = vsock_listen, | 1854 | .listen = vsock_listen, |
1848 | .shutdown = vsock_shutdown, | 1855 | .shutdown = vsock_shutdown, |
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c index f93365ae0fdd..d49aa79b7997 100644 --- a/net/x25/af_x25.c +++ b/net/x25/af_x25.c | |||
@@ -1750,7 +1750,7 @@ static const struct proto_ops x25_proto_ops = { | |||
1750 | .socketpair = sock_no_socketpair, | 1750 | .socketpair = sock_no_socketpair, |
1751 | .accept = x25_accept, | 1751 | .accept = x25_accept, |
1752 | .getname = x25_getname, | 1752 | .getname = x25_getname, |
1753 | .poll_mask = datagram_poll_mask, | 1753 | .poll = datagram_poll, |
1754 | .ioctl = x25_ioctl, | 1754 | .ioctl = x25_ioctl, |
1755 | #ifdef CONFIG_COMPAT | 1755 | #ifdef CONFIG_COMPAT |
1756 | .compat_ioctl = compat_x25_ioctl, | 1756 | .compat_ioctl = compat_x25_ioctl, |
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 3b3410ada097..59fb7d3c36a3 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c | |||
@@ -303,9 +303,10 @@ static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len) | |||
303 | return (xs->zc) ? xsk_zc_xmit(sk) : xsk_generic_xmit(sk, m, total_len); | 303 | return (xs->zc) ? xsk_zc_xmit(sk) : xsk_generic_xmit(sk, m, total_len); |
304 | } | 304 | } |
305 | 305 | ||
306 | static __poll_t xsk_poll_mask(struct socket *sock, __poll_t events) | 306 | static unsigned int xsk_poll(struct file *file, struct socket *sock, |
307 | struct poll_table_struct *wait) | ||
307 | { | 308 | { |
308 | __poll_t mask = datagram_poll_mask(sock, events); | 309 | unsigned int mask = datagram_poll(file, sock, wait); |
309 | struct sock *sk = sock->sk; | 310 | struct sock *sk = sock->sk; |
310 | struct xdp_sock *xs = xdp_sk(sk); | 311 | struct xdp_sock *xs = xdp_sk(sk); |
311 | 312 | ||
@@ -696,7 +697,7 @@ static const struct proto_ops xsk_proto_ops = { | |||
696 | .socketpair = sock_no_socketpair, | 697 | .socketpair = sock_no_socketpair, |
697 | .accept = sock_no_accept, | 698 | .accept = sock_no_accept, |
698 | .getname = sock_no_getname, | 699 | .getname = sock_no_getname, |
699 | .poll_mask = xsk_poll_mask, | 700 | .poll = xsk_poll, |
700 | .ioctl = sock_no_ioctl, | 701 | .ioctl = sock_no_ioctl, |
701 | .listen = sock_no_listen, | 702 | .listen = sock_no_listen, |
702 | .shutdown = sock_no_shutdown, | 703 | .shutdown = sock_no_shutdown, |