diff options
99 files changed, 849 insertions, 595 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 15853d522941..2c391338c675 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking | |||
@@ -440,7 +440,9 @@ prototypes: | |||
440 | ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); | 440 | ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); |
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 | unsigned int (*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); | ||
444 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); | 446 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); |
445 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); | 447 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); |
446 | int (*mmap) (struct file *, struct vm_area_struct *); | 448 | int (*mmap) (struct file *, struct vm_area_struct *); |
@@ -471,7 +473,7 @@ prototypes: | |||
471 | }; | 473 | }; |
472 | 474 | ||
473 | locking rules: | 475 | locking rules: |
474 | All may block. | 476 | All except for ->poll_mask may block. |
475 | 477 | ||
476 | ->llseek() locking has moved from llseek to the individual llseek | 478 | ->llseek() locking has moved from llseek to the individual llseek |
477 | implementations. If your fs is not using generic_file_llseek, you | 479 | implementations. If your fs is not using generic_file_llseek, you |
@@ -503,6 +505,9 @@ in sys_read() and friends. | |||
503 | the lease within the individual filesystem to record the result of the | 505 | the lease within the individual filesystem to record the result of the |
504 | operation | 506 | operation |
505 | 507 | ||
508 | ->poll_mask can be called with or without the waitqueue lock for the waitqueue | ||
509 | returned from ->get_poll_head. | ||
510 | |||
506 | --------------------------- dquot_operations ------------------------------- | 511 | --------------------------- dquot_operations ------------------------------- |
507 | prototypes: | 512 | prototypes: |
508 | int (*write_dquot) (struct dquot *); | 513 | int (*write_dquot) (struct dquot *); |
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 5fd325df59e2..829a7b7857a4 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt | |||
@@ -856,7 +856,9 @@ struct file_operations { | |||
856 | ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); | 856 | ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); |
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 | unsigned int (*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); | ||
860 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); | 862 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); |
861 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); | 863 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); |
862 | int (*mmap) (struct file *, struct vm_area_struct *); | 864 | int (*mmap) (struct file *, struct vm_area_struct *); |
@@ -901,6 +903,17 @@ otherwise noted. | |||
901 | activity on this file and (optionally) go to sleep until there | 903 | activity on this file and (optionally) go to sleep until there |
902 | is activity. Called by the select(2) and poll(2) system calls | 904 | is activity. Called by the select(2) and poll(2) system calls |
903 | 905 | ||
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 | |||
904 | unlocked_ioctl: called by the ioctl(2) system call. | 917 | unlocked_ioctl: called by the ioctl(2) system call. |
905 | 918 | ||
906 | compat_ioctl: called by the ioctl(2) system call when 32 bit system calls | 919 | compat_ioctl: called by the ioctl(2) system call when 32 bit system calls |
diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl index d6b27dab1b30..14a2f996e543 100644 --- a/arch/x86/entry/syscalls/syscall_32.tbl +++ b/arch/x86/entry/syscalls/syscall_32.tbl | |||
@@ -396,3 +396,4 @@ | |||
396 | 382 i386 pkey_free sys_pkey_free __ia32_sys_pkey_free | 396 | 382 i386 pkey_free sys_pkey_free __ia32_sys_pkey_free |
397 | 383 i386 statx sys_statx __ia32_sys_statx | 397 | 383 i386 statx sys_statx __ia32_sys_statx |
398 | 384 i386 arch_prctl sys_arch_prctl __ia32_compat_sys_arch_prctl | 398 | 384 i386 arch_prctl sys_arch_prctl __ia32_compat_sys_arch_prctl |
399 | 385 i386 io_pgetevents sys_io_pgetevents __ia32_compat_sys_io_pgetevents | ||
diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl index 4dfe42666d0c..cd36232ab62f 100644 --- a/arch/x86/entry/syscalls/syscall_64.tbl +++ b/arch/x86/entry/syscalls/syscall_64.tbl | |||
@@ -341,6 +341,7 @@ | |||
341 | 330 common pkey_alloc __x64_sys_pkey_alloc | 341 | 330 common pkey_alloc __x64_sys_pkey_alloc |
342 | 331 common pkey_free __x64_sys_pkey_free | 342 | 331 common pkey_free __x64_sys_pkey_free |
343 | 332 common statx __x64_sys_statx | 343 | 332 common statx __x64_sys_statx |
344 | 333 common io_pgetevents __x64_sys_io_pgetevents | ||
344 | 345 | ||
345 | # | 346 | # |
346 | # x32-specific system call numbers start at 512 to avoid cache impact | 347 | # x32-specific system call numbers start at 512 to avoid cache impact |
diff --git a/crypto/af_alg.c b/crypto/af_alg.c index 7846c0c20cfe..89ed613c017e 100644 --- a/crypto/af_alg.c +++ b/crypto/af_alg.c | |||
@@ -347,7 +347,6 @@ static const struct proto_ops alg_proto_ops = { | |||
347 | .sendpage = sock_no_sendpage, | 347 | .sendpage = sock_no_sendpage, |
348 | .sendmsg = sock_no_sendmsg, | 348 | .sendmsg = sock_no_sendmsg, |
349 | .recvmsg = sock_no_recvmsg, | 349 | .recvmsg = sock_no_recvmsg, |
350 | .poll = sock_no_poll, | ||
351 | 350 | ||
352 | .bind = alg_bind, | 351 | .bind = alg_bind, |
353 | .release = af_alg_release, | 352 | .release = af_alg_release, |
@@ -1061,19 +1060,12 @@ void af_alg_async_cb(struct crypto_async_request *_req, int err) | |||
1061 | } | 1060 | } |
1062 | EXPORT_SYMBOL_GPL(af_alg_async_cb); | 1061 | EXPORT_SYMBOL_GPL(af_alg_async_cb); |
1063 | 1062 | ||
1064 | /** | 1063 | __poll_t af_alg_poll_mask(struct socket *sock, __poll_t events) |
1065 | * af_alg_poll - poll system call handler | ||
1066 | */ | ||
1067 | __poll_t af_alg_poll(struct file *file, struct socket *sock, | ||
1068 | poll_table *wait) | ||
1069 | { | 1064 | { |
1070 | struct sock *sk = sock->sk; | 1065 | struct sock *sk = sock->sk; |
1071 | struct alg_sock *ask = alg_sk(sk); | 1066 | struct alg_sock *ask = alg_sk(sk); |
1072 | struct af_alg_ctx *ctx = ask->private; | 1067 | struct af_alg_ctx *ctx = ask->private; |
1073 | __poll_t mask; | 1068 | __poll_t mask = 0; |
1074 | |||
1075 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
1076 | mask = 0; | ||
1077 | 1069 | ||
1078 | if (!ctx->more || ctx->used) | 1070 | if (!ctx->more || ctx->used) |
1079 | mask |= EPOLLIN | EPOLLRDNORM; | 1071 | mask |= EPOLLIN | EPOLLRDNORM; |
@@ -1083,7 +1075,7 @@ __poll_t af_alg_poll(struct file *file, struct socket *sock, | |||
1083 | 1075 | ||
1084 | return mask; | 1076 | return mask; |
1085 | } | 1077 | } |
1086 | EXPORT_SYMBOL_GPL(af_alg_poll); | 1078 | EXPORT_SYMBOL_GPL(af_alg_poll_mask); |
1087 | 1079 | ||
1088 | /** | 1080 | /** |
1089 | * af_alg_alloc_areq - allocate struct af_alg_async_req | 1081 | * af_alg_alloc_areq - allocate struct af_alg_async_req |
diff --git a/crypto/algif_aead.c b/crypto/algif_aead.c index 4b07edd5a9ff..330cf9f2b767 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 = af_alg_poll, | 378 | .poll_mask = af_alg_poll_mask, |
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 = af_alg_poll, | 474 | .poll_mask = af_alg_poll_mask, |
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_hash.c b/crypto/algif_hash.c index 6c9b1927a520..bfcf595fd8f9 100644 --- a/crypto/algif_hash.c +++ b/crypto/algif_hash.c | |||
@@ -288,7 +288,6 @@ static struct proto_ops algif_hash_ops = { | |||
288 | .mmap = sock_no_mmap, | 288 | .mmap = sock_no_mmap, |
289 | .bind = sock_no_bind, | 289 | .bind = sock_no_bind, |
290 | .setsockopt = sock_no_setsockopt, | 290 | .setsockopt = sock_no_setsockopt, |
291 | .poll = sock_no_poll, | ||
292 | 291 | ||
293 | .release = af_alg_release, | 292 | .release = af_alg_release, |
294 | .sendmsg = hash_sendmsg, | 293 | .sendmsg = hash_sendmsg, |
@@ -396,7 +395,6 @@ static struct proto_ops algif_hash_ops_nokey = { | |||
396 | .mmap = sock_no_mmap, | 395 | .mmap = sock_no_mmap, |
397 | .bind = sock_no_bind, | 396 | .bind = sock_no_bind, |
398 | .setsockopt = sock_no_setsockopt, | 397 | .setsockopt = sock_no_setsockopt, |
399 | .poll = sock_no_poll, | ||
400 | 398 | ||
401 | .release = af_alg_release, | 399 | .release = af_alg_release, |
402 | .sendmsg = hash_sendmsg_nokey, | 400 | .sendmsg = hash_sendmsg_nokey, |
diff --git a/crypto/algif_rng.c b/crypto/algif_rng.c index 150c2b6480ed..22df3799a17b 100644 --- a/crypto/algif_rng.c +++ b/crypto/algif_rng.c | |||
@@ -106,7 +106,6 @@ static struct proto_ops algif_rng_ops = { | |||
106 | .bind = sock_no_bind, | 106 | .bind = sock_no_bind, |
107 | .accept = sock_no_accept, | 107 | .accept = sock_no_accept, |
108 | .setsockopt = sock_no_setsockopt, | 108 | .setsockopt = sock_no_setsockopt, |
109 | .poll = sock_no_poll, | ||
110 | .sendmsg = sock_no_sendmsg, | 109 | .sendmsg = sock_no_sendmsg, |
111 | .sendpage = sock_no_sendpage, | 110 | .sendpage = sock_no_sendpage, |
112 | 111 | ||
diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c index c4e885df4564..15cf3c5222e0 100644 --- a/crypto/algif_skcipher.c +++ b/crypto/algif_skcipher.c | |||
@@ -205,7 +205,7 @@ static struct proto_ops algif_skcipher_ops = { | |||
205 | .sendmsg = skcipher_sendmsg, | 205 | .sendmsg = skcipher_sendmsg, |
206 | .sendpage = af_alg_sendpage, | 206 | .sendpage = af_alg_sendpage, |
207 | .recvmsg = skcipher_recvmsg, | 207 | .recvmsg = skcipher_recvmsg, |
208 | .poll = af_alg_poll, | 208 | .poll_mask = af_alg_poll_mask, |
209 | }; | 209 | }; |
210 | 210 | ||
211 | static int skcipher_check_key(struct socket *sock) | 211 | static int skcipher_check_key(struct socket *sock) |
@@ -301,7 +301,7 @@ static struct proto_ops algif_skcipher_ops_nokey = { | |||
301 | .sendmsg = skcipher_sendmsg_nokey, | 301 | .sendmsg = skcipher_sendmsg_nokey, |
302 | .sendpage = skcipher_sendpage_nokey, | 302 | .sendpage = skcipher_sendpage_nokey, |
303 | .recvmsg = skcipher_recvmsg_nokey, | 303 | .recvmsg = skcipher_recvmsg_nokey, |
304 | .poll = af_alg_poll, | 304 | .poll_mask = af_alg_poll_mask, |
305 | }; | 305 | }; |
306 | 306 | ||
307 | static void *skcipher_bind(const char *name, u32 type, u32 mask) | 307 | static void *skcipher_bind(const char *name, u32 type, u32 mask) |
diff --git a/drivers/char/random.c b/drivers/char/random.c index cd888d4ee605..a8fb0020ba5c 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -402,8 +402,7 @@ static struct poolinfo { | |||
402 | /* | 402 | /* |
403 | * Static global variables | 403 | * Static global variables |
404 | */ | 404 | */ |
405 | static DECLARE_WAIT_QUEUE_HEAD(random_read_wait); | 405 | static DECLARE_WAIT_QUEUE_HEAD(random_wait); |
406 | static DECLARE_WAIT_QUEUE_HEAD(random_write_wait); | ||
407 | static struct fasync_struct *fasync; | 406 | static struct fasync_struct *fasync; |
408 | 407 | ||
409 | static DEFINE_SPINLOCK(random_ready_list_lock); | 408 | static DEFINE_SPINLOCK(random_ready_list_lock); |
@@ -722,8 +721,8 @@ retry: | |||
722 | 721 | ||
723 | /* should we wake readers? */ | 722 | /* should we wake readers? */ |
724 | if (entropy_bits >= random_read_wakeup_bits && | 723 | if (entropy_bits >= random_read_wakeup_bits && |
725 | wq_has_sleeper(&random_read_wait)) { | 724 | wq_has_sleeper(&random_wait)) { |
726 | wake_up_interruptible(&random_read_wait); | 725 | wake_up_interruptible_poll(&random_wait, POLLIN); |
727 | kill_fasync(&fasync, SIGIO, POLL_IN); | 726 | kill_fasync(&fasync, SIGIO, POLL_IN); |
728 | } | 727 | } |
729 | /* If the input pool is getting full, send some | 728 | /* If the input pool is getting full, send some |
@@ -1397,7 +1396,7 @@ retry: | |||
1397 | trace_debit_entropy(r->name, 8 * ibytes); | 1396 | trace_debit_entropy(r->name, 8 * ibytes); |
1398 | if (ibytes && | 1397 | if (ibytes && |
1399 | (r->entropy_count >> ENTROPY_SHIFT) < random_write_wakeup_bits) { | 1398 | (r->entropy_count >> ENTROPY_SHIFT) < random_write_wakeup_bits) { |
1400 | wake_up_interruptible(&random_write_wait); | 1399 | wake_up_interruptible_poll(&random_wait, POLLOUT); |
1401 | kill_fasync(&fasync, SIGIO, POLL_OUT); | 1400 | kill_fasync(&fasync, SIGIO, POLL_OUT); |
1402 | } | 1401 | } |
1403 | 1402 | ||
@@ -1839,7 +1838,7 @@ _random_read(int nonblock, char __user *buf, size_t nbytes) | |||
1839 | if (nonblock) | 1838 | if (nonblock) |
1840 | return -EAGAIN; | 1839 | return -EAGAIN; |
1841 | 1840 | ||
1842 | wait_event_interruptible(random_read_wait, | 1841 | wait_event_interruptible(random_wait, |
1843 | ENTROPY_BITS(&input_pool) >= | 1842 | ENTROPY_BITS(&input_pool) >= |
1844 | random_read_wakeup_bits); | 1843 | random_read_wakeup_bits); |
1845 | if (signal_pending(current)) | 1844 | if (signal_pending(current)) |
@@ -1876,14 +1875,17 @@ urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) | |||
1876 | return ret; | 1875 | return ret; |
1877 | } | 1876 | } |
1878 | 1877 | ||
1878 | static struct wait_queue_head * | ||
1879 | random_get_poll_head(struct file *file, __poll_t events) | ||
1880 | { | ||
1881 | return &random_wait; | ||
1882 | } | ||
1883 | |||
1879 | static __poll_t | 1884 | static __poll_t |
1880 | random_poll(struct file *file, poll_table * wait) | 1885 | random_poll_mask(struct file *file, __poll_t events) |
1881 | { | 1886 | { |
1882 | __poll_t mask; | 1887 | __poll_t mask = 0; |
1883 | 1888 | ||
1884 | poll_wait(file, &random_read_wait, wait); | ||
1885 | poll_wait(file, &random_write_wait, wait); | ||
1886 | mask = 0; | ||
1887 | if (ENTROPY_BITS(&input_pool) >= random_read_wakeup_bits) | 1889 | if (ENTROPY_BITS(&input_pool) >= random_read_wakeup_bits) |
1888 | mask |= EPOLLIN | EPOLLRDNORM; | 1890 | mask |= EPOLLIN | EPOLLRDNORM; |
1889 | if (ENTROPY_BITS(&input_pool) < random_write_wakeup_bits) | 1891 | if (ENTROPY_BITS(&input_pool) < random_write_wakeup_bits) |
@@ -1990,7 +1992,8 @@ static int random_fasync(int fd, struct file *filp, int on) | |||
1990 | const struct file_operations random_fops = { | 1992 | const struct file_operations random_fops = { |
1991 | .read = random_read, | 1993 | .read = random_read, |
1992 | .write = random_write, | 1994 | .write = random_write, |
1993 | .poll = random_poll, | 1995 | .get_poll_head = random_get_poll_head, |
1996 | .poll_mask = random_poll_mask, | ||
1994 | .unlocked_ioctl = random_ioctl, | 1997 | .unlocked_ioctl = random_ioctl, |
1995 | .fasync = random_fasync, | 1998 | .fasync = random_fasync, |
1996 | .llseek = noop_llseek, | 1999 | .llseek = noop_llseek, |
@@ -2323,7 +2326,7 @@ void add_hwgenerator_randomness(const char *buffer, size_t count, | |||
2323 | * We'll be woken up again once below random_write_wakeup_thresh, | 2326 | * We'll be woken up again once below random_write_wakeup_thresh, |
2324 | * or when the calling thread is about to terminate. | 2327 | * or when the calling thread is about to terminate. |
2325 | */ | 2328 | */ |
2326 | wait_event_interruptible(random_write_wait, kthread_should_stop() || | 2329 | wait_event_interruptible(random_wait, kthread_should_stop() || |
2327 | ENTROPY_BITS(&input_pool) <= random_write_wakeup_bits); | 2330 | ENTROPY_BITS(&input_pool) <= random_write_wakeup_bits); |
2328 | mix_pool_bytes(poolp, buffer, count); | 2331 | mix_pool_bytes(poolp, buffer, count); |
2329 | credit_entropy_bits(poolp, entropy); | 2332 | credit_entropy_bits(poolp, entropy); |
diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c index 1f8f489b4167..98f90aadd141 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 = datagram_poll, | 591 | .poll_mask = datagram_poll_mask, |
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, |
@@ -745,7 +745,6 @@ static const struct proto_ops base_sock_ops = { | |||
745 | .getname = sock_no_getname, | 745 | .getname = sock_no_getname, |
746 | .sendmsg = sock_no_sendmsg, | 746 | .sendmsg = sock_no_sendmsg, |
747 | .recvmsg = sock_no_recvmsg, | 747 | .recvmsg = sock_no_recvmsg, |
748 | .poll = sock_no_poll, | ||
749 | .listen = sock_no_listen, | 748 | .listen = sock_no_listen, |
750 | .shutdown = sock_no_shutdown, | 749 | .shutdown = sock_no_shutdown, |
751 | .setsockopt = sock_no_setsockopt, | 750 | .setsockopt = sock_no_setsockopt, |
diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c index ce61231e96ea..de51e8f70f44 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 = datagram_poll, | 1110 | .poll_mask = datagram_poll_mask, |
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, |
diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c index c4267ecefd85..157b67c1bf8e 100644 --- a/drivers/net/ppp/pptp.c +++ b/drivers/net/ppp/pptp.c | |||
@@ -624,7 +624,6 @@ static const struct proto_ops pptp_ops = { | |||
624 | .socketpair = sock_no_socketpair, | 624 | .socketpair = sock_no_socketpair, |
625 | .accept = sock_no_accept, | 625 | .accept = sock_no_accept, |
626 | .getname = pptp_getname, | 626 | .getname = pptp_getname, |
627 | .poll = sock_no_poll, | ||
628 | .listen = sock_no_listen, | 627 | .listen = sock_no_listen, |
629 | .shutdown = sock_no_shutdown, | 628 | .shutdown = sock_no_shutdown, |
630 | .setsockopt = sock_no_setsockopt, | 629 | .setsockopt = sock_no_setsockopt, |
diff --git a/drivers/staging/comedi/drivers/serial2002.c b/drivers/staging/comedi/drivers/serial2002.c index b3f3b4a201af..5471b2212a62 100644 --- a/drivers/staging/comedi/drivers/serial2002.c +++ b/drivers/staging/comedi/drivers/serial2002.c | |||
@@ -113,7 +113,7 @@ static void serial2002_tty_read_poll_wait(struct file *f, int timeout) | |||
113 | long elapsed; | 113 | long elapsed; |
114 | __poll_t mask; | 114 | __poll_t mask; |
115 | 115 | ||
116 | mask = f->f_op->poll(f, &table.pt); | 116 | mask = vfs_poll(f, &table.pt); |
117 | if (mask & (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN | | 117 | if (mask & (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN | |
118 | EPOLLHUP | EPOLLERR)) { | 118 | EPOLLHUP | EPOLLERR)) { |
119 | break; | 119 | break; |
@@ -136,7 +136,7 @@ static int serial2002_tty_read(struct file *f, int timeout) | |||
136 | 136 | ||
137 | result = -1; | 137 | result = -1; |
138 | if (!IS_ERR(f)) { | 138 | if (!IS_ERR(f)) { |
139 | if (f->f_op->poll) { | 139 | if (file_can_poll(f)) { |
140 | serial2002_tty_read_poll_wait(f, timeout); | 140 | serial2002_tty_read_poll_wait(f, timeout); |
141 | 141 | ||
142 | if (kernel_read(f, &ch, 1, &pos) == 1) | 142 | if (kernel_read(f, &ch, 1, &pos) == 1) |
diff --git a/drivers/staging/ipx/af_ipx.c b/drivers/staging/ipx/af_ipx.c index 5703dd176787..208b5c161631 100644 --- a/drivers/staging/ipx/af_ipx.c +++ b/drivers/staging/ipx/af_ipx.c | |||
@@ -1965,7 +1965,7 @@ static const struct proto_ops ipx_dgram_ops = { | |||
1965 | .socketpair = sock_no_socketpair, | 1965 | .socketpair = sock_no_socketpair, |
1966 | .accept = sock_no_accept, | 1966 | .accept = sock_no_accept, |
1967 | .getname = ipx_getname, | 1967 | .getname = ipx_getname, |
1968 | .poll = datagram_poll, | 1968 | .poll_mask = datagram_poll_mask, |
1969 | .ioctl = ipx_ioctl, | 1969 | .ioctl = ipx_ioctl, |
1970 | #ifdef CONFIG_COMPAT | 1970 | #ifdef CONFIG_COMPAT |
1971 | .compat_ioctl = ipx_compat_ioctl, | 1971 | .compat_ioctl = ipx_compat_ioctl, |
diff --git a/drivers/vfio/virqfd.c b/drivers/vfio/virqfd.c index 085700f1be10..2a1be859ee71 100644 --- a/drivers/vfio/virqfd.c +++ b/drivers/vfio/virqfd.c | |||
@@ -166,7 +166,7 @@ int vfio_virqfd_enable(void *opaque, | |||
166 | init_waitqueue_func_entry(&virqfd->wait, virqfd_wakeup); | 166 | init_waitqueue_func_entry(&virqfd->wait, virqfd_wakeup); |
167 | init_poll_funcptr(&virqfd->pt, virqfd_ptable_queue_proc); | 167 | init_poll_funcptr(&virqfd->pt, virqfd_ptable_queue_proc); |
168 | 168 | ||
169 | events = irqfd.file->f_op->poll(irqfd.file, &virqfd->pt); | 169 | events = vfs_poll(irqfd.file, &virqfd->pt); |
170 | 170 | ||
171 | /* | 171 | /* |
172 | * Check if there was an event already pending on the eventfd | 172 | * Check if there was an event already pending on the eventfd |
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index f0be5f35ab28..895eaa25807c 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c | |||
@@ -208,7 +208,7 @@ int vhost_poll_start(struct vhost_poll *poll, struct file *file) | |||
208 | if (poll->wqh) | 208 | if (poll->wqh) |
209 | return 0; | 209 | return 0; |
210 | 210 | ||
211 | mask = file->f_op->poll(file, &poll->table); | 211 | mask = vfs_poll(file, &poll->table); |
212 | if (mask) | 212 | if (mask) |
213 | vhost_poll_wakeup(&poll->wait, 0, 0, poll_to_key(mask)); | 213 | vhost_poll_wakeup(&poll->wait, 0, 0, poll_to_key(mask)); |
214 | if (mask & EPOLLERR) { | 214 | if (mask & EPOLLERR) { |
@@ -5,6 +5,7 @@ | |||
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. | ||
8 | * | 9 | * |
9 | * See ../COPYING for licensing terms. | 10 | * See ../COPYING for licensing terms. |
10 | */ | 11 | */ |
@@ -46,6 +47,8 @@ | |||
46 | 47 | ||
47 | #include "internal.h" | 48 | #include "internal.h" |
48 | 49 | ||
50 | #define KIOCB_KEY 0 | ||
51 | |||
49 | #define AIO_RING_MAGIC 0xa10a10a1 | 52 | #define AIO_RING_MAGIC 0xa10a10a1 |
50 | #define AIO_RING_COMPAT_FEATURES 1 | 53 | #define AIO_RING_COMPAT_FEATURES 1 |
51 | #define AIO_RING_INCOMPAT_FEATURES 0 | 54 | #define AIO_RING_INCOMPAT_FEATURES 0 |
@@ -156,21 +159,29 @@ struct kioctx { | |||
156 | unsigned id; | 159 | unsigned id; |
157 | }; | 160 | }; |
158 | 161 | ||
159 | /* | 162 | struct fsync_iocb { |
160 | * We use ki_cancel == KIOCB_CANCELLED to indicate that a kiocb has been either | 163 | struct work_struct work; |
161 | * cancelled or completed (this makes a certain amount of sense because | 164 | struct file *file; |
162 | * successful cancellation - io_cancel() - does deliver the completion to | 165 | bool datasync; |
163 | * userspace). | 166 | }; |
164 | * | 167 | |
165 | * And since most things don't implement kiocb cancellation and we'd really like | 168 | struct poll_iocb { |
166 | * kiocb completion to be lockless when possible, we use ki_cancel to | 169 | struct file *file; |
167 | * synchronize cancellation and completion - we only set it to KIOCB_CANCELLED | 170 | __poll_t events; |
168 | * with xchg() or cmpxchg(), see batch_complete_aio() and kiocb_cancel(). | 171 | struct wait_queue_head *head; |
169 | */ | 172 | |
170 | #define KIOCB_CANCELLED ((void *) (~0ULL)) | 173 | union { |
174 | struct wait_queue_entry wait; | ||
175 | struct work_struct work; | ||
176 | }; | ||
177 | }; | ||
171 | 178 | ||
172 | struct aio_kiocb { | 179 | struct aio_kiocb { |
173 | struct kiocb common; | 180 | union { |
181 | struct kiocb rw; | ||
182 | struct fsync_iocb fsync; | ||
183 | struct poll_iocb poll; | ||
184 | }; | ||
174 | 185 | ||
175 | struct kioctx *ki_ctx; | 186 | struct kioctx *ki_ctx; |
176 | kiocb_cancel_fn *ki_cancel; | 187 | kiocb_cancel_fn *ki_cancel; |
@@ -264,9 +275,6 @@ static int __init aio_setup(void) | |||
264 | 275 | ||
265 | kiocb_cachep = KMEM_CACHE(aio_kiocb, SLAB_HWCACHE_ALIGN|SLAB_PANIC); | 276 | kiocb_cachep = KMEM_CACHE(aio_kiocb, SLAB_HWCACHE_ALIGN|SLAB_PANIC); |
266 | kioctx_cachep = KMEM_CACHE(kioctx,SLAB_HWCACHE_ALIGN|SLAB_PANIC); | 277 | kioctx_cachep = KMEM_CACHE(kioctx,SLAB_HWCACHE_ALIGN|SLAB_PANIC); |
267 | |||
268 | pr_debug("sizeof(struct page) = %zu\n", sizeof(struct page)); | ||
269 | |||
270 | return 0; | 278 | return 0; |
271 | } | 279 | } |
272 | __initcall(aio_setup); | 280 | __initcall(aio_setup); |
@@ -552,42 +560,20 @@ static int aio_setup_ring(struct kioctx *ctx, unsigned int nr_events) | |||
552 | 560 | ||
553 | void kiocb_set_cancel_fn(struct kiocb *iocb, kiocb_cancel_fn *cancel) | 561 | void kiocb_set_cancel_fn(struct kiocb *iocb, kiocb_cancel_fn *cancel) |
554 | { | 562 | { |
555 | struct aio_kiocb *req = container_of(iocb, struct aio_kiocb, common); | 563 | struct aio_kiocb *req = container_of(iocb, struct aio_kiocb, rw); |
556 | struct kioctx *ctx = req->ki_ctx; | 564 | struct kioctx *ctx = req->ki_ctx; |
557 | unsigned long flags; | 565 | unsigned long flags; |
558 | 566 | ||
559 | spin_lock_irqsave(&ctx->ctx_lock, flags); | 567 | if (WARN_ON_ONCE(!list_empty(&req->ki_list))) |
560 | 568 | return; | |
561 | if (!req->ki_list.next) | ||
562 | list_add(&req->ki_list, &ctx->active_reqs); | ||
563 | 569 | ||
570 | spin_lock_irqsave(&ctx->ctx_lock, flags); | ||
571 | list_add_tail(&req->ki_list, &ctx->active_reqs); | ||
564 | req->ki_cancel = cancel; | 572 | req->ki_cancel = cancel; |
565 | |||
566 | spin_unlock_irqrestore(&ctx->ctx_lock, flags); | 573 | spin_unlock_irqrestore(&ctx->ctx_lock, flags); |
567 | } | 574 | } |
568 | EXPORT_SYMBOL(kiocb_set_cancel_fn); | 575 | EXPORT_SYMBOL(kiocb_set_cancel_fn); |
569 | 576 | ||
570 | static int kiocb_cancel(struct aio_kiocb *kiocb) | ||
571 | { | ||
572 | kiocb_cancel_fn *old, *cancel; | ||
573 | |||
574 | /* | ||
575 | * Don't want to set kiocb->ki_cancel = KIOCB_CANCELLED unless it | ||
576 | * actually has a cancel function, hence the cmpxchg() | ||
577 | */ | ||
578 | |||
579 | cancel = READ_ONCE(kiocb->ki_cancel); | ||
580 | do { | ||
581 | if (!cancel || cancel == KIOCB_CANCELLED) | ||
582 | return -EINVAL; | ||
583 | |||
584 | old = cancel; | ||
585 | cancel = cmpxchg(&kiocb->ki_cancel, old, KIOCB_CANCELLED); | ||
586 | } while (cancel != old); | ||
587 | |||
588 | return cancel(&kiocb->common); | ||
589 | } | ||
590 | |||
591 | /* | 577 | /* |
592 | * free_ioctx() should be RCU delayed to synchronize against the RCU | 578 | * free_ioctx() should be RCU delayed to synchronize against the RCU |
593 | * protected lookup_ioctx() and also needs process context to call | 579 | * protected lookup_ioctx() and also needs process context to call |
@@ -634,7 +620,7 @@ static void free_ioctx_users(struct percpu_ref *ref) | |||
634 | while (!list_empty(&ctx->active_reqs)) { | 620 | while (!list_empty(&ctx->active_reqs)) { |
635 | req = list_first_entry(&ctx->active_reqs, | 621 | req = list_first_entry(&ctx->active_reqs, |
636 | struct aio_kiocb, ki_list); | 622 | struct aio_kiocb, ki_list); |
637 | kiocb_cancel(req); | 623 | req->ki_cancel(&req->rw); |
638 | list_del_init(&req->ki_list); | 624 | list_del_init(&req->ki_list); |
639 | } | 625 | } |
640 | 626 | ||
@@ -1041,7 +1027,7 @@ static inline struct aio_kiocb *aio_get_req(struct kioctx *ctx) | |||
1041 | goto out_put; | 1027 | goto out_put; |
1042 | 1028 | ||
1043 | percpu_ref_get(&ctx->reqs); | 1029 | percpu_ref_get(&ctx->reqs); |
1044 | 1030 | INIT_LIST_HEAD(&req->ki_list); | |
1045 | req->ki_ctx = ctx; | 1031 | req->ki_ctx = ctx; |
1046 | return req; | 1032 | return req; |
1047 | out_put: | 1033 | out_put: |
@@ -1049,15 +1035,6 @@ out_put: | |||
1049 | return NULL; | 1035 | return NULL; |
1050 | } | 1036 | } |
1051 | 1037 | ||
1052 | static void kiocb_free(struct aio_kiocb *req) | ||
1053 | { | ||
1054 | if (req->common.ki_filp) | ||
1055 | fput(req->common.ki_filp); | ||
1056 | if (req->ki_eventfd != NULL) | ||
1057 | eventfd_ctx_put(req->ki_eventfd); | ||
1058 | kmem_cache_free(kiocb_cachep, req); | ||
1059 | } | ||
1060 | |||
1061 | static struct kioctx *lookup_ioctx(unsigned long ctx_id) | 1038 | static struct kioctx *lookup_ioctx(unsigned long ctx_id) |
1062 | { | 1039 | { |
1063 | struct aio_ring __user *ring = (void __user *)ctx_id; | 1040 | struct aio_ring __user *ring = (void __user *)ctx_id; |
@@ -1088,44 +1065,14 @@ out: | |||
1088 | /* aio_complete | 1065 | /* aio_complete |
1089 | * Called when the io request on the given iocb is complete. | 1066 | * Called when the io request on the given iocb is complete. |
1090 | */ | 1067 | */ |
1091 | static void aio_complete(struct kiocb *kiocb, long res, long res2) | 1068 | static void aio_complete(struct aio_kiocb *iocb, long res, long res2) |
1092 | { | 1069 | { |
1093 | struct aio_kiocb *iocb = container_of(kiocb, struct aio_kiocb, common); | ||
1094 | struct kioctx *ctx = iocb->ki_ctx; | 1070 | struct kioctx *ctx = iocb->ki_ctx; |
1095 | struct aio_ring *ring; | 1071 | struct aio_ring *ring; |
1096 | struct io_event *ev_page, *event; | 1072 | struct io_event *ev_page, *event; |
1097 | unsigned tail, pos, head; | 1073 | unsigned tail, pos, head; |
1098 | unsigned long flags; | 1074 | unsigned long flags; |
1099 | 1075 | ||
1100 | if (kiocb->ki_flags & IOCB_WRITE) { | ||
1101 | struct file *file = kiocb->ki_filp; | ||
1102 | |||
1103 | /* | ||
1104 | * Tell lockdep we inherited freeze protection from submission | ||
1105 | * thread. | ||
1106 | */ | ||
1107 | if (S_ISREG(file_inode(file)->i_mode)) | ||
1108 | __sb_writers_acquired(file_inode(file)->i_sb, SB_FREEZE_WRITE); | ||
1109 | file_end_write(file); | ||
1110 | } | ||
1111 | |||
1112 | /* | ||
1113 | * Special case handling for sync iocbs: | ||
1114 | * - events go directly into the iocb for fast handling | ||
1115 | * - the sync task with the iocb in its stack holds the single iocb | ||
1116 | * ref, no other paths have a way to get another ref | ||
1117 | * - the sync task helpfully left a reference to itself in the iocb | ||
1118 | */ | ||
1119 | BUG_ON(is_sync_kiocb(kiocb)); | ||
1120 | |||
1121 | if (iocb->ki_list.next) { | ||
1122 | unsigned long flags; | ||
1123 | |||
1124 | spin_lock_irqsave(&ctx->ctx_lock, flags); | ||
1125 | list_del(&iocb->ki_list); | ||
1126 | spin_unlock_irqrestore(&ctx->ctx_lock, flags); | ||
1127 | } | ||
1128 | |||
1129 | /* | 1076 | /* |
1130 | * Add a completion event to the ring buffer. Must be done holding | 1077 | * Add a completion event to the ring buffer. Must be done holding |
1131 | * ctx->completion_lock to prevent other code from messing with the tail | 1078 | * ctx->completion_lock to prevent other code from messing with the tail |
@@ -1179,11 +1126,12 @@ static void aio_complete(struct kiocb *kiocb, long res, long res2) | |||
1179 | * eventfd. The eventfd_signal() function is safe to be called | 1126 | * eventfd. The eventfd_signal() function is safe to be called |
1180 | * from IRQ context. | 1127 | * from IRQ context. |
1181 | */ | 1128 | */ |
1182 | if (iocb->ki_eventfd != NULL) | 1129 | if (iocb->ki_eventfd) { |
1183 | eventfd_signal(iocb->ki_eventfd, 1); | 1130 | eventfd_signal(iocb->ki_eventfd, 1); |
1131 | eventfd_ctx_put(iocb->ki_eventfd); | ||
1132 | } | ||
1184 | 1133 | ||
1185 | /* everything turned out well, dispose of the aiocb. */ | 1134 | kmem_cache_free(kiocb_cachep, iocb); |
1186 | kiocb_free(iocb); | ||
1187 | 1135 | ||
1188 | /* | 1136 | /* |
1189 | * We have to order our ring_info tail store above and test | 1137 | * We have to order our ring_info tail store above and test |
@@ -1249,14 +1197,13 @@ static long aio_read_events_ring(struct kioctx *ctx, | |||
1249 | if (head == tail) | 1197 | if (head == tail) |
1250 | break; | 1198 | break; |
1251 | 1199 | ||
1252 | avail = min(avail, nr - ret); | ||
1253 | avail = min_t(long, avail, AIO_EVENTS_PER_PAGE - | ||
1254 | ((head + AIO_EVENTS_OFFSET) % AIO_EVENTS_PER_PAGE)); | ||
1255 | |||
1256 | pos = head + AIO_EVENTS_OFFSET; | 1200 | pos = head + AIO_EVENTS_OFFSET; |
1257 | page = ctx->ring_pages[pos / AIO_EVENTS_PER_PAGE]; | 1201 | page = ctx->ring_pages[pos / AIO_EVENTS_PER_PAGE]; |
1258 | pos %= AIO_EVENTS_PER_PAGE; | 1202 | pos %= AIO_EVENTS_PER_PAGE; |
1259 | 1203 | ||
1204 | avail = min(avail, nr - ret); | ||
1205 | avail = min_t(long, avail, AIO_EVENTS_PER_PAGE - pos); | ||
1206 | |||
1260 | ev = kmap(page); | 1207 | ev = kmap(page); |
1261 | copy_ret = copy_to_user(event + ret, ev + pos, | 1208 | copy_ret = copy_to_user(event + ret, ev + pos, |
1262 | sizeof(*ev) * avail); | 1209 | sizeof(*ev) * avail); |
@@ -1327,10 +1274,6 @@ static long read_events(struct kioctx *ctx, long min_nr, long nr, | |||
1327 | wait_event_interruptible_hrtimeout(ctx->wait, | 1274 | wait_event_interruptible_hrtimeout(ctx->wait, |
1328 | aio_read_events(ctx, min_nr, nr, event, &ret), | 1275 | aio_read_events(ctx, min_nr, nr, event, &ret), |
1329 | until); | 1276 | until); |
1330 | |||
1331 | if (!ret && signal_pending(current)) | ||
1332 | ret = -EINTR; | ||
1333 | |||
1334 | return ret; | 1277 | return ret; |
1335 | } | 1278 | } |
1336 | 1279 | ||
@@ -1446,6 +1389,58 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx) | |||
1446 | return -EINVAL; | 1389 | return -EINVAL; |
1447 | } | 1390 | } |
1448 | 1391 | ||
1392 | static void aio_remove_iocb(struct aio_kiocb *iocb) | ||
1393 | { | ||
1394 | struct kioctx *ctx = iocb->ki_ctx; | ||
1395 | unsigned long flags; | ||
1396 | |||
1397 | spin_lock_irqsave(&ctx->ctx_lock, flags); | ||
1398 | list_del(&iocb->ki_list); | ||
1399 | spin_unlock_irqrestore(&ctx->ctx_lock, flags); | ||
1400 | } | ||
1401 | |||
1402 | static void aio_complete_rw(struct kiocb *kiocb, long res, long res2) | ||
1403 | { | ||
1404 | struct aio_kiocb *iocb = container_of(kiocb, struct aio_kiocb, rw); | ||
1405 | |||
1406 | if (!list_empty_careful(&iocb->ki_list)) | ||
1407 | aio_remove_iocb(iocb); | ||
1408 | |||
1409 | if (kiocb->ki_flags & IOCB_WRITE) { | ||
1410 | struct inode *inode = file_inode(kiocb->ki_filp); | ||
1411 | |||
1412 | /* | ||
1413 | * Tell lockdep we inherited freeze protection from submission | ||
1414 | * thread. | ||
1415 | */ | ||
1416 | if (S_ISREG(inode->i_mode)) | ||
1417 | __sb_writers_acquired(inode->i_sb, SB_FREEZE_WRITE); | ||
1418 | file_end_write(kiocb->ki_filp); | ||
1419 | } | ||
1420 | |||
1421 | fput(kiocb->ki_filp); | ||
1422 | aio_complete(iocb, res, res2); | ||
1423 | } | ||
1424 | |||
1425 | static int aio_prep_rw(struct kiocb *req, struct iocb *iocb) | ||
1426 | { | ||
1427 | int ret; | ||
1428 | |||
1429 | req->ki_filp = fget(iocb->aio_fildes); | ||
1430 | if (unlikely(!req->ki_filp)) | ||
1431 | return -EBADF; | ||
1432 | req->ki_complete = aio_complete_rw; | ||
1433 | req->ki_pos = iocb->aio_offset; | ||
1434 | req->ki_flags = iocb_flags(req->ki_filp); | ||
1435 | if (iocb->aio_flags & IOCB_FLAG_RESFD) | ||
1436 | req->ki_flags |= IOCB_EVENTFD; | ||
1437 | req->ki_hint = file_write_hint(req->ki_filp); | ||
1438 | ret = kiocb_set_rw_flags(req, iocb->aio_rw_flags); | ||
1439 | if (unlikely(ret)) | ||
1440 | fput(req->ki_filp); | ||
1441 | return ret; | ||
1442 | } | ||
1443 | |||
1449 | static int aio_setup_rw(int rw, struct iocb *iocb, struct iovec **iovec, | 1444 | static int aio_setup_rw(int rw, struct iocb *iocb, struct iovec **iovec, |
1450 | bool vectored, bool compat, struct iov_iter *iter) | 1445 | bool vectored, bool compat, struct iov_iter *iter) |
1451 | { | 1446 | { |
@@ -1465,11 +1460,11 @@ static int aio_setup_rw(int rw, struct iocb *iocb, struct iovec **iovec, | |||
1465 | return import_iovec(rw, buf, len, UIO_FASTIOV, iovec, iter); | 1460 | return import_iovec(rw, buf, len, UIO_FASTIOV, iovec, iter); |
1466 | } | 1461 | } |
1467 | 1462 | ||
1468 | static inline ssize_t aio_ret(struct kiocb *req, ssize_t ret) | 1463 | static inline void aio_rw_done(struct kiocb *req, ssize_t ret) |
1469 | { | 1464 | { |
1470 | switch (ret) { | 1465 | switch (ret) { |
1471 | case -EIOCBQUEUED: | 1466 | case -EIOCBQUEUED: |
1472 | return ret; | 1467 | break; |
1473 | case -ERESTARTSYS: | 1468 | case -ERESTARTSYS: |
1474 | case -ERESTARTNOINTR: | 1469 | case -ERESTARTNOINTR: |
1475 | case -ERESTARTNOHAND: | 1470 | case -ERESTARTNOHAND: |
@@ -1481,85 +1476,270 @@ static inline ssize_t aio_ret(struct kiocb *req, ssize_t ret) | |||
1481 | ret = -EINTR; | 1476 | ret = -EINTR; |
1482 | /*FALLTHRU*/ | 1477 | /*FALLTHRU*/ |
1483 | default: | 1478 | default: |
1484 | aio_complete(req, ret, 0); | 1479 | aio_complete_rw(req, ret, 0); |
1485 | return 0; | ||
1486 | } | 1480 | } |
1487 | } | 1481 | } |
1488 | 1482 | ||
1489 | static ssize_t aio_read(struct kiocb *req, struct iocb *iocb, bool vectored, | 1483 | static ssize_t aio_read(struct kiocb *req, struct iocb *iocb, bool vectored, |
1490 | bool compat) | 1484 | bool compat) |
1491 | { | 1485 | { |
1492 | struct file *file = req->ki_filp; | ||
1493 | struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs; | 1486 | struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs; |
1494 | struct iov_iter iter; | 1487 | struct iov_iter iter; |
1488 | struct file *file; | ||
1495 | ssize_t ret; | 1489 | ssize_t ret; |
1496 | 1490 | ||
1491 | ret = aio_prep_rw(req, iocb); | ||
1492 | if (ret) | ||
1493 | return ret; | ||
1494 | file = req->ki_filp; | ||
1495 | |||
1496 | ret = -EBADF; | ||
1497 | if (unlikely(!(file->f_mode & FMODE_READ))) | 1497 | if (unlikely(!(file->f_mode & FMODE_READ))) |
1498 | return -EBADF; | 1498 | goto out_fput; |
1499 | ret = -EINVAL; | ||
1499 | if (unlikely(!file->f_op->read_iter)) | 1500 | if (unlikely(!file->f_op->read_iter)) |
1500 | return -EINVAL; | 1501 | goto out_fput; |
1501 | 1502 | ||
1502 | ret = aio_setup_rw(READ, iocb, &iovec, vectored, compat, &iter); | 1503 | ret = aio_setup_rw(READ, iocb, &iovec, vectored, compat, &iter); |
1503 | if (ret) | 1504 | if (ret) |
1504 | return ret; | 1505 | goto out_fput; |
1505 | ret = rw_verify_area(READ, file, &req->ki_pos, iov_iter_count(&iter)); | 1506 | ret = rw_verify_area(READ, file, &req->ki_pos, iov_iter_count(&iter)); |
1506 | if (!ret) | 1507 | if (!ret) |
1507 | ret = aio_ret(req, call_read_iter(file, req, &iter)); | 1508 | aio_rw_done(req, call_read_iter(file, req, &iter)); |
1508 | kfree(iovec); | 1509 | kfree(iovec); |
1510 | out_fput: | ||
1511 | if (unlikely(ret)) | ||
1512 | fput(file); | ||
1509 | return ret; | 1513 | return ret; |
1510 | } | 1514 | } |
1511 | 1515 | ||
1512 | static ssize_t aio_write(struct kiocb *req, struct iocb *iocb, bool vectored, | 1516 | static ssize_t aio_write(struct kiocb *req, struct iocb *iocb, bool vectored, |
1513 | bool compat) | 1517 | bool compat) |
1514 | { | 1518 | { |
1515 | struct file *file = req->ki_filp; | ||
1516 | struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs; | 1519 | struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs; |
1517 | struct iov_iter iter; | 1520 | struct iov_iter iter; |
1521 | struct file *file; | ||
1518 | ssize_t ret; | 1522 | ssize_t ret; |
1519 | 1523 | ||
1524 | ret = aio_prep_rw(req, iocb); | ||
1525 | if (ret) | ||
1526 | return ret; | ||
1527 | file = req->ki_filp; | ||
1528 | |||
1529 | ret = -EBADF; | ||
1520 | if (unlikely(!(file->f_mode & FMODE_WRITE))) | 1530 | if (unlikely(!(file->f_mode & FMODE_WRITE))) |
1521 | return -EBADF; | 1531 | goto out_fput; |
1532 | ret = -EINVAL; | ||
1522 | if (unlikely(!file->f_op->write_iter)) | 1533 | if (unlikely(!file->f_op->write_iter)) |
1523 | return -EINVAL; | 1534 | goto out_fput; |
1524 | 1535 | ||
1525 | ret = aio_setup_rw(WRITE, iocb, &iovec, vectored, compat, &iter); | 1536 | ret = aio_setup_rw(WRITE, iocb, &iovec, vectored, compat, &iter); |
1526 | if (ret) | 1537 | if (ret) |
1527 | return ret; | 1538 | goto out_fput; |
1528 | ret = rw_verify_area(WRITE, file, &req->ki_pos, iov_iter_count(&iter)); | 1539 | ret = rw_verify_area(WRITE, file, &req->ki_pos, iov_iter_count(&iter)); |
1529 | if (!ret) { | 1540 | if (!ret) { |
1530 | req->ki_flags |= IOCB_WRITE; | ||
1531 | file_start_write(file); | ||
1532 | ret = aio_ret(req, call_write_iter(file, req, &iter)); | ||
1533 | /* | 1541 | /* |
1534 | * We release freeze protection in aio_complete(). Fool lockdep | 1542 | * Open-code file_start_write here to grab freeze protection, |
1535 | * by telling it the lock got released so that it doesn't | 1543 | * which will be released by another thread in |
1536 | * complain about held lock when we return to userspace. | 1544 | * aio_complete_rw(). Fool lockdep by telling it the lock got |
1545 | * released so that it doesn't complain about the held lock when | ||
1546 | * we return to userspace. | ||
1537 | */ | 1547 | */ |
1538 | if (S_ISREG(file_inode(file)->i_mode)) | 1548 | if (S_ISREG(file_inode(file)->i_mode)) { |
1549 | __sb_start_write(file_inode(file)->i_sb, SB_FREEZE_WRITE, true); | ||
1539 | __sb_writers_release(file_inode(file)->i_sb, SB_FREEZE_WRITE); | 1550 | __sb_writers_release(file_inode(file)->i_sb, SB_FREEZE_WRITE); |
1551 | } | ||
1552 | req->ki_flags |= IOCB_WRITE; | ||
1553 | aio_rw_done(req, call_write_iter(file, req, &iter)); | ||
1540 | } | 1554 | } |
1541 | kfree(iovec); | 1555 | kfree(iovec); |
1556 | out_fput: | ||
1557 | if (unlikely(ret)) | ||
1558 | fput(file); | ||
1542 | return ret; | 1559 | return ret; |
1543 | } | 1560 | } |
1544 | 1561 | ||
1562 | static void aio_fsync_work(struct work_struct *work) | ||
1563 | { | ||
1564 | struct fsync_iocb *req = container_of(work, struct fsync_iocb, work); | ||
1565 | int ret; | ||
1566 | |||
1567 | ret = vfs_fsync(req->file, req->datasync); | ||
1568 | fput(req->file); | ||
1569 | aio_complete(container_of(req, struct aio_kiocb, fsync), ret, 0); | ||
1570 | } | ||
1571 | |||
1572 | static int aio_fsync(struct fsync_iocb *req, struct iocb *iocb, bool datasync) | ||
1573 | { | ||
1574 | if (unlikely(iocb->aio_buf || iocb->aio_offset || iocb->aio_nbytes || | ||
1575 | iocb->aio_rw_flags)) | ||
1576 | return -EINVAL; | ||
1577 | req->file = fget(iocb->aio_fildes); | ||
1578 | if (unlikely(!req->file)) | ||
1579 | return -EBADF; | ||
1580 | if (unlikely(!req->file->f_op->fsync)) { | ||
1581 | fput(req->file); | ||
1582 | return -EINVAL; | ||
1583 | } | ||
1584 | |||
1585 | req->datasync = datasync; | ||
1586 | INIT_WORK(&req->work, aio_fsync_work); | ||
1587 | schedule_work(&req->work); | ||
1588 | return 0; | ||
1589 | } | ||
1590 | |||
1591 | /* need to use list_del_init so we can check if item was present */ | ||
1592 | static inline bool __aio_poll_remove(struct poll_iocb *req) | ||
1593 | { | ||
1594 | if (list_empty(&req->wait.entry)) | ||
1595 | return false; | ||
1596 | list_del_init(&req->wait.entry); | ||
1597 | return true; | ||
1598 | } | ||
1599 | |||
1600 | static inline void __aio_poll_complete(struct aio_kiocb *iocb, __poll_t mask) | ||
1601 | { | ||
1602 | fput(iocb->poll.file); | ||
1603 | aio_complete(iocb, mangle_poll(mask), 0); | ||
1604 | } | ||
1605 | |||
1606 | static void aio_poll_work(struct work_struct *work) | ||
1607 | { | ||
1608 | struct aio_kiocb *iocb = container_of(work, struct aio_kiocb, poll.work); | ||
1609 | |||
1610 | if (!list_empty_careful(&iocb->ki_list)) | ||
1611 | aio_remove_iocb(iocb); | ||
1612 | __aio_poll_complete(iocb, iocb->poll.events); | ||
1613 | } | ||
1614 | |||
1615 | static int aio_poll_cancel(struct kiocb *iocb) | ||
1616 | { | ||
1617 | struct aio_kiocb *aiocb = container_of(iocb, struct aio_kiocb, rw); | ||
1618 | struct poll_iocb *req = &aiocb->poll; | ||
1619 | struct wait_queue_head *head = req->head; | ||
1620 | bool found = false; | ||
1621 | |||
1622 | spin_lock(&head->lock); | ||
1623 | found = __aio_poll_remove(req); | ||
1624 | spin_unlock(&head->lock); | ||
1625 | |||
1626 | if (found) { | ||
1627 | req->events = 0; | ||
1628 | INIT_WORK(&req->work, aio_poll_work); | ||
1629 | schedule_work(&req->work); | ||
1630 | } | ||
1631 | return 0; | ||
1632 | } | ||
1633 | |||
1634 | static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync, | ||
1635 | void *key) | ||
1636 | { | ||
1637 | struct poll_iocb *req = container_of(wait, struct poll_iocb, wait); | ||
1638 | struct aio_kiocb *iocb = container_of(req, struct aio_kiocb, poll); | ||
1639 | struct file *file = req->file; | ||
1640 | __poll_t mask = key_to_poll(key); | ||
1641 | |||
1642 | assert_spin_locked(&req->head->lock); | ||
1643 | |||
1644 | /* for instances that support it check for an event match first: */ | ||
1645 | if (mask && !(mask & req->events)) | ||
1646 | return 0; | ||
1647 | |||
1648 | mask = file->f_op->poll_mask(file, req->events); | ||
1649 | if (!mask) | ||
1650 | return 0; | ||
1651 | |||
1652 | __aio_poll_remove(req); | ||
1653 | |||
1654 | /* | ||
1655 | * Try completing without a context switch if we can acquire ctx_lock | ||
1656 | * without spinning. Otherwise we need to defer to a workqueue to | ||
1657 | * avoid a deadlock due to the lock order. | ||
1658 | */ | ||
1659 | if (spin_trylock(&iocb->ki_ctx->ctx_lock)) { | ||
1660 | list_del_init(&iocb->ki_list); | ||
1661 | spin_unlock(&iocb->ki_ctx->ctx_lock); | ||
1662 | |||
1663 | __aio_poll_complete(iocb, mask); | ||
1664 | } else { | ||
1665 | req->events = mask; | ||
1666 | INIT_WORK(&req->work, aio_poll_work); | ||
1667 | schedule_work(&req->work); | ||
1668 | } | ||
1669 | |||
1670 | return 1; | ||
1671 | } | ||
1672 | |||
1673 | static ssize_t aio_poll(struct aio_kiocb *aiocb, struct iocb *iocb) | ||
1674 | { | ||
1675 | struct kioctx *ctx = aiocb->ki_ctx; | ||
1676 | struct poll_iocb *req = &aiocb->poll; | ||
1677 | __poll_t mask; | ||
1678 | |||
1679 | /* reject any unknown events outside the normal event mask. */ | ||
1680 | if ((u16)iocb->aio_buf != iocb->aio_buf) | ||
1681 | return -EINVAL; | ||
1682 | /* reject fields that are not defined for poll */ | ||
1683 | if (iocb->aio_offset || iocb->aio_nbytes || iocb->aio_rw_flags) | ||
1684 | return -EINVAL; | ||
1685 | |||
1686 | req->events = demangle_poll(iocb->aio_buf) | EPOLLERR | EPOLLHUP; | ||
1687 | req->file = fget(iocb->aio_fildes); | ||
1688 | if (unlikely(!req->file)) | ||
1689 | return -EBADF; | ||
1690 | if (!file_has_poll_mask(req->file)) | ||
1691 | goto out_fail; | ||
1692 | |||
1693 | req->head = req->file->f_op->get_poll_head(req->file, req->events); | ||
1694 | if (!req->head) | ||
1695 | goto out_fail; | ||
1696 | if (IS_ERR(req->head)) { | ||
1697 | mask = EPOLLERR; | ||
1698 | goto done; | ||
1699 | } | ||
1700 | |||
1701 | init_waitqueue_func_entry(&req->wait, aio_poll_wake); | ||
1702 | aiocb->ki_cancel = aio_poll_cancel; | ||
1703 | |||
1704 | spin_lock_irq(&ctx->ctx_lock); | ||
1705 | spin_lock(&req->head->lock); | ||
1706 | mask = req->file->f_op->poll_mask(req->file, req->events); | ||
1707 | if (!mask) { | ||
1708 | __add_wait_queue(req->head, &req->wait); | ||
1709 | list_add_tail(&aiocb->ki_list, &ctx->active_reqs); | ||
1710 | } | ||
1711 | spin_unlock(&req->head->lock); | ||
1712 | spin_unlock_irq(&ctx->ctx_lock); | ||
1713 | done: | ||
1714 | if (mask) | ||
1715 | __aio_poll_complete(aiocb, mask); | ||
1716 | return 0; | ||
1717 | out_fail: | ||
1718 | fput(req->file); | ||
1719 | return -EINVAL; /* same as no support for IOCB_CMD_POLL */ | ||
1720 | } | ||
1721 | |||
1545 | static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, | 1722 | static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, |
1546 | struct iocb *iocb, bool compat) | 1723 | bool compat) |
1547 | { | 1724 | { |
1548 | struct aio_kiocb *req; | 1725 | struct aio_kiocb *req; |
1549 | struct file *file; | 1726 | struct iocb iocb; |
1550 | ssize_t ret; | 1727 | ssize_t ret; |
1551 | 1728 | ||
1729 | if (unlikely(copy_from_user(&iocb, user_iocb, sizeof(iocb)))) | ||
1730 | return -EFAULT; | ||
1731 | |||
1552 | /* enforce forwards compatibility on users */ | 1732 | /* enforce forwards compatibility on users */ |
1553 | if (unlikely(iocb->aio_reserved2)) { | 1733 | if (unlikely(iocb.aio_reserved2)) { |
1554 | pr_debug("EINVAL: reserve field set\n"); | 1734 | pr_debug("EINVAL: reserve field set\n"); |
1555 | return -EINVAL; | 1735 | return -EINVAL; |
1556 | } | 1736 | } |
1557 | 1737 | ||
1558 | /* prevent overflows */ | 1738 | /* prevent overflows */ |
1559 | if (unlikely( | 1739 | if (unlikely( |
1560 | (iocb->aio_buf != (unsigned long)iocb->aio_buf) || | 1740 | (iocb.aio_buf != (unsigned long)iocb.aio_buf) || |
1561 | (iocb->aio_nbytes != (size_t)iocb->aio_nbytes) || | 1741 | (iocb.aio_nbytes != (size_t)iocb.aio_nbytes) || |
1562 | ((ssize_t)iocb->aio_nbytes < 0) | 1742 | ((ssize_t)iocb.aio_nbytes < 0) |
1563 | )) { | 1743 | )) { |
1564 | pr_debug("EINVAL: overflow check\n"); | 1744 | pr_debug("EINVAL: overflow check\n"); |
1565 | return -EINVAL; | 1745 | return -EINVAL; |
@@ -1569,37 +1749,19 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, | |||
1569 | if (unlikely(!req)) | 1749 | if (unlikely(!req)) |
1570 | return -EAGAIN; | 1750 | return -EAGAIN; |
1571 | 1751 | ||
1572 | req->common.ki_filp = file = fget(iocb->aio_fildes); | 1752 | if (iocb.aio_flags & IOCB_FLAG_RESFD) { |
1573 | if (unlikely(!req->common.ki_filp)) { | ||
1574 | ret = -EBADF; | ||
1575 | goto out_put_req; | ||
1576 | } | ||
1577 | req->common.ki_pos = iocb->aio_offset; | ||
1578 | req->common.ki_complete = aio_complete; | ||
1579 | req->common.ki_flags = iocb_flags(req->common.ki_filp); | ||
1580 | req->common.ki_hint = file_write_hint(file); | ||
1581 | |||
1582 | if (iocb->aio_flags & IOCB_FLAG_RESFD) { | ||
1583 | /* | 1753 | /* |
1584 | * If the IOCB_FLAG_RESFD flag of aio_flags is set, get an | 1754 | * If the IOCB_FLAG_RESFD flag of aio_flags is set, get an |
1585 | * instance of the file* now. The file descriptor must be | 1755 | * instance of the file* now. The file descriptor must be |
1586 | * an eventfd() fd, and will be signaled for each completed | 1756 | * an eventfd() fd, and will be signaled for each completed |
1587 | * event using the eventfd_signal() function. | 1757 | * event using the eventfd_signal() function. |
1588 | */ | 1758 | */ |
1589 | req->ki_eventfd = eventfd_ctx_fdget((int) iocb->aio_resfd); | 1759 | req->ki_eventfd = eventfd_ctx_fdget((int) iocb.aio_resfd); |
1590 | if (IS_ERR(req->ki_eventfd)) { | 1760 | if (IS_ERR(req->ki_eventfd)) { |
1591 | ret = PTR_ERR(req->ki_eventfd); | 1761 | ret = PTR_ERR(req->ki_eventfd); |
1592 | req->ki_eventfd = NULL; | 1762 | req->ki_eventfd = NULL; |
1593 | goto out_put_req; | 1763 | goto out_put_req; |
1594 | } | 1764 | } |
1595 | |||
1596 | req->common.ki_flags |= IOCB_EVENTFD; | ||
1597 | } | ||
1598 | |||
1599 | ret = kiocb_set_rw_flags(&req->common, iocb->aio_rw_flags); | ||
1600 | if (unlikely(ret)) { | ||
1601 | pr_debug("EINVAL: aio_rw_flags\n"); | ||
1602 | goto out_put_req; | ||
1603 | } | 1765 | } |
1604 | 1766 | ||
1605 | ret = put_user(KIOCB_KEY, &user_iocb->aio_key); | 1767 | ret = put_user(KIOCB_KEY, &user_iocb->aio_key); |
@@ -1609,41 +1771,67 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, | |||
1609 | } | 1771 | } |
1610 | 1772 | ||
1611 | req->ki_user_iocb = user_iocb; | 1773 | req->ki_user_iocb = user_iocb; |
1612 | req->ki_user_data = iocb->aio_data; | 1774 | req->ki_user_data = iocb.aio_data; |
1613 | 1775 | ||
1614 | get_file(file); | 1776 | switch (iocb.aio_lio_opcode) { |
1615 | switch (iocb->aio_lio_opcode) { | ||
1616 | case IOCB_CMD_PREAD: | 1777 | case IOCB_CMD_PREAD: |
1617 | ret = aio_read(&req->common, iocb, false, compat); | 1778 | ret = aio_read(&req->rw, &iocb, false, compat); |
1618 | break; | 1779 | break; |
1619 | case IOCB_CMD_PWRITE: | 1780 | case IOCB_CMD_PWRITE: |
1620 | ret = aio_write(&req->common, iocb, false, compat); | 1781 | ret = aio_write(&req->rw, &iocb, false, compat); |
1621 | break; | 1782 | break; |
1622 | case IOCB_CMD_PREADV: | 1783 | case IOCB_CMD_PREADV: |
1623 | ret = aio_read(&req->common, iocb, true, compat); | 1784 | ret = aio_read(&req->rw, &iocb, true, compat); |
1624 | break; | 1785 | break; |
1625 | case IOCB_CMD_PWRITEV: | 1786 | case IOCB_CMD_PWRITEV: |
1626 | ret = aio_write(&req->common, iocb, true, compat); | 1787 | ret = aio_write(&req->rw, &iocb, true, compat); |
1788 | break; | ||
1789 | case IOCB_CMD_FSYNC: | ||
1790 | ret = aio_fsync(&req->fsync, &iocb, false); | ||
1791 | break; | ||
1792 | case IOCB_CMD_FDSYNC: | ||
1793 | ret = aio_fsync(&req->fsync, &iocb, true); | ||
1794 | break; | ||
1795 | case IOCB_CMD_POLL: | ||
1796 | ret = aio_poll(req, &iocb); | ||
1627 | break; | 1797 | break; |
1628 | default: | 1798 | default: |
1629 | pr_debug("invalid aio operation %d\n", iocb->aio_lio_opcode); | 1799 | pr_debug("invalid aio operation %d\n", iocb.aio_lio_opcode); |
1630 | ret = -EINVAL; | 1800 | ret = -EINVAL; |
1631 | break; | 1801 | break; |
1632 | } | 1802 | } |
1633 | fput(file); | ||
1634 | 1803 | ||
1635 | if (ret && ret != -EIOCBQUEUED) | 1804 | /* |
1805 | * If ret is 0, we'd either done aio_complete() ourselves or have | ||
1806 | * arranged for that to be done asynchronously. Anything non-zero | ||
1807 | * means that we need to destroy req ourselves. | ||
1808 | */ | ||
1809 | if (ret) | ||
1636 | goto out_put_req; | 1810 | goto out_put_req; |
1637 | return 0; | 1811 | return 0; |
1638 | out_put_req: | 1812 | out_put_req: |
1639 | put_reqs_available(ctx, 1); | 1813 | put_reqs_available(ctx, 1); |
1640 | percpu_ref_put(&ctx->reqs); | 1814 | percpu_ref_put(&ctx->reqs); |
1641 | kiocb_free(req); | 1815 | if (req->ki_eventfd) |
1816 | eventfd_ctx_put(req->ki_eventfd); | ||
1817 | kmem_cache_free(kiocb_cachep, req); | ||
1642 | return ret; | 1818 | return ret; |
1643 | } | 1819 | } |
1644 | 1820 | ||
1645 | static long do_io_submit(aio_context_t ctx_id, long nr, | 1821 | /* sys_io_submit: |
1646 | struct iocb __user *__user *iocbpp, bool compat) | 1822 | * Queue the nr iocbs pointed to by iocbpp for processing. Returns |
1823 | * the number of iocbs queued. May return -EINVAL if the aio_context | ||
1824 | * specified by ctx_id is invalid, if nr is < 0, if the iocb at | ||
1825 | * *iocbpp[0] is not properly initialized, if the operation specified | ||
1826 | * is invalid for the file descriptor in the iocb. May fail with | ||
1827 | * -EFAULT if any of the data structures point to invalid data. May | ||
1828 | * fail with -EBADF if the file descriptor specified in the first | ||
1829 | * iocb is invalid. May fail with -EAGAIN if insufficient resources | ||
1830 | * are available to queue any iocbs. Will return 0 if nr is 0. Will | ||
1831 | * fail with -ENOSYS if not implemented. | ||
1832 | */ | ||
1833 | SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr, | ||
1834 | struct iocb __user * __user *, iocbpp) | ||
1647 | { | 1835 | { |
1648 | struct kioctx *ctx; | 1836 | struct kioctx *ctx; |
1649 | long ret = 0; | 1837 | long ret = 0; |
@@ -1653,39 +1841,25 @@ static long do_io_submit(aio_context_t ctx_id, long nr, | |||
1653 | if (unlikely(nr < 0)) | 1841 | if (unlikely(nr < 0)) |
1654 | return -EINVAL; | 1842 | return -EINVAL; |
1655 | 1843 | ||
1656 | if (unlikely(nr > LONG_MAX/sizeof(*iocbpp))) | ||
1657 | nr = LONG_MAX/sizeof(*iocbpp); | ||
1658 | |||
1659 | if (unlikely(!access_ok(VERIFY_READ, iocbpp, (nr*sizeof(*iocbpp))))) | ||
1660 | return -EFAULT; | ||
1661 | |||
1662 | ctx = lookup_ioctx(ctx_id); | 1844 | ctx = lookup_ioctx(ctx_id); |
1663 | if (unlikely(!ctx)) { | 1845 | if (unlikely(!ctx)) { |
1664 | pr_debug("EINVAL: invalid context id\n"); | 1846 | pr_debug("EINVAL: invalid context id\n"); |
1665 | return -EINVAL; | 1847 | return -EINVAL; |
1666 | } | 1848 | } |
1667 | 1849 | ||
1668 | blk_start_plug(&plug); | 1850 | if (nr > ctx->nr_events) |
1851 | nr = ctx->nr_events; | ||
1669 | 1852 | ||
1670 | /* | 1853 | blk_start_plug(&plug); |
1671 | * AKPM: should this return a partial result if some of the IOs were | 1854 | for (i = 0; i < nr; i++) { |
1672 | * successfully submitted? | ||
1673 | */ | ||
1674 | for (i=0; i<nr; i++) { | ||
1675 | struct iocb __user *user_iocb; | 1855 | struct iocb __user *user_iocb; |
1676 | struct iocb tmp; | ||
1677 | 1856 | ||
1678 | if (unlikely(__get_user(user_iocb, iocbpp + i))) { | 1857 | if (unlikely(get_user(user_iocb, iocbpp + i))) { |
1679 | ret = -EFAULT; | 1858 | ret = -EFAULT; |
1680 | break; | 1859 | break; |
1681 | } | 1860 | } |
1682 | 1861 | ||
1683 | if (unlikely(copy_from_user(&tmp, user_iocb, sizeof(tmp)))) { | 1862 | ret = io_submit_one(ctx, user_iocb, false); |
1684 | ret = -EFAULT; | ||
1685 | break; | ||
1686 | } | ||
1687 | |||
1688 | ret = io_submit_one(ctx, user_iocb, &tmp, compat); | ||
1689 | if (ret) | 1863 | if (ret) |
1690 | break; | 1864 | break; |
1691 | } | 1865 | } |
@@ -1695,59 +1869,44 @@ static long do_io_submit(aio_context_t ctx_id, long nr, | |||
1695 | return i ? i : ret; | 1869 | return i ? i : ret; |
1696 | } | 1870 | } |
1697 | 1871 | ||
1698 | /* sys_io_submit: | ||
1699 | * Queue the nr iocbs pointed to by iocbpp for processing. Returns | ||
1700 | * the number of iocbs queued. May return -EINVAL if the aio_context | ||
1701 | * specified by ctx_id is invalid, if nr is < 0, if the iocb at | ||
1702 | * *iocbpp[0] is not properly initialized, if the operation specified | ||
1703 | * is invalid for the file descriptor in the iocb. May fail with | ||
1704 | * -EFAULT if any of the data structures point to invalid data. May | ||
1705 | * fail with -EBADF if the file descriptor specified in the first | ||
1706 | * iocb is invalid. May fail with -EAGAIN if insufficient resources | ||
1707 | * are available to queue any iocbs. Will return 0 if nr is 0. Will | ||
1708 | * fail with -ENOSYS if not implemented. | ||
1709 | */ | ||
1710 | SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr, | ||
1711 | struct iocb __user * __user *, iocbpp) | ||
1712 | { | ||
1713 | return do_io_submit(ctx_id, nr, iocbpp, 0); | ||
1714 | } | ||
1715 | |||
1716 | #ifdef CONFIG_COMPAT | 1872 | #ifdef CONFIG_COMPAT |
1717 | static inline long | 1873 | COMPAT_SYSCALL_DEFINE3(io_submit, compat_aio_context_t, ctx_id, |
1718 | copy_iocb(long nr, u32 __user *ptr32, struct iocb __user * __user *ptr64) | 1874 | int, nr, compat_uptr_t __user *, iocbpp) |
1719 | { | 1875 | { |
1720 | compat_uptr_t uptr; | 1876 | struct kioctx *ctx; |
1721 | int i; | 1877 | long ret = 0; |
1878 | int i = 0; | ||
1879 | struct blk_plug plug; | ||
1722 | 1880 | ||
1723 | for (i = 0; i < nr; ++i) { | 1881 | if (unlikely(nr < 0)) |
1724 | if (get_user(uptr, ptr32 + i)) | 1882 | return -EINVAL; |
1725 | return -EFAULT; | 1883 | |
1726 | if (put_user(compat_ptr(uptr), ptr64 + i)) | 1884 | ctx = lookup_ioctx(ctx_id); |
1727 | return -EFAULT; | 1885 | if (unlikely(!ctx)) { |
1886 | pr_debug("EINVAL: invalid context id\n"); | ||
1887 | return -EINVAL; | ||
1728 | } | 1888 | } |
1729 | return 0; | ||
1730 | } | ||
1731 | 1889 | ||
1732 | #define MAX_AIO_SUBMITS (PAGE_SIZE/sizeof(struct iocb *)) | 1890 | if (nr > ctx->nr_events) |
1891 | nr = ctx->nr_events; | ||
1733 | 1892 | ||
1734 | COMPAT_SYSCALL_DEFINE3(io_submit, compat_aio_context_t, ctx_id, | 1893 | blk_start_plug(&plug); |
1735 | int, nr, u32 __user *, iocb) | 1894 | for (i = 0; i < nr; i++) { |
1736 | { | 1895 | compat_uptr_t user_iocb; |
1737 | struct iocb __user * __user *iocb64; | ||
1738 | long ret; | ||
1739 | 1896 | ||
1740 | if (unlikely(nr < 0)) | 1897 | if (unlikely(get_user(user_iocb, iocbpp + i))) { |
1741 | return -EINVAL; | 1898 | ret = -EFAULT; |
1899 | break; | ||
1900 | } | ||
1742 | 1901 | ||
1743 | if (nr > MAX_AIO_SUBMITS) | 1902 | ret = io_submit_one(ctx, compat_ptr(user_iocb), true); |
1744 | nr = MAX_AIO_SUBMITS; | 1903 | if (ret) |
1904 | break; | ||
1905 | } | ||
1906 | blk_finish_plug(&plug); | ||
1745 | 1907 | ||
1746 | iocb64 = compat_alloc_user_space(nr * sizeof(*iocb64)); | 1908 | percpu_ref_put(&ctx->users); |
1747 | ret = copy_iocb(nr, iocb, iocb64); | 1909 | return i ? i : ret; |
1748 | if (!ret) | ||
1749 | ret = do_io_submit(ctx_id, nr, iocb64, 1); | ||
1750 | return ret; | ||
1751 | } | 1910 | } |
1752 | #endif | 1911 | #endif |
1753 | 1912 | ||
@@ -1755,15 +1914,12 @@ COMPAT_SYSCALL_DEFINE3(io_submit, compat_aio_context_t, ctx_id, | |||
1755 | * Finds a given iocb for cancellation. | 1914 | * Finds a given iocb for cancellation. |
1756 | */ | 1915 | */ |
1757 | static struct aio_kiocb * | 1916 | static struct aio_kiocb * |
1758 | lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb, u32 key) | 1917 | lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb) |
1759 | { | 1918 | { |
1760 | struct aio_kiocb *kiocb; | 1919 | struct aio_kiocb *kiocb; |
1761 | 1920 | ||
1762 | assert_spin_locked(&ctx->ctx_lock); | 1921 | assert_spin_locked(&ctx->ctx_lock); |
1763 | 1922 | ||
1764 | if (key != KIOCB_KEY) | ||
1765 | return NULL; | ||
1766 | |||
1767 | /* TODO: use a hash or array, this sucks. */ | 1923 | /* TODO: use a hash or array, this sucks. */ |
1768 | list_for_each_entry(kiocb, &ctx->active_reqs, ki_list) { | 1924 | list_for_each_entry(kiocb, &ctx->active_reqs, ki_list) { |
1769 | if (kiocb->ki_user_iocb == iocb) | 1925 | if (kiocb->ki_user_iocb == iocb) |
@@ -1787,25 +1943,24 @@ SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, | |||
1787 | { | 1943 | { |
1788 | struct kioctx *ctx; | 1944 | struct kioctx *ctx; |
1789 | struct aio_kiocb *kiocb; | 1945 | struct aio_kiocb *kiocb; |
1946 | int ret = -EINVAL; | ||
1790 | u32 key; | 1947 | u32 key; |
1791 | int ret; | ||
1792 | 1948 | ||
1793 | ret = get_user(key, &iocb->aio_key); | 1949 | if (unlikely(get_user(key, &iocb->aio_key))) |
1794 | if (unlikely(ret)) | ||
1795 | return -EFAULT; | 1950 | return -EFAULT; |
1951 | if (unlikely(key != KIOCB_KEY)) | ||
1952 | return -EINVAL; | ||
1796 | 1953 | ||
1797 | ctx = lookup_ioctx(ctx_id); | 1954 | ctx = lookup_ioctx(ctx_id); |
1798 | if (unlikely(!ctx)) | 1955 | if (unlikely(!ctx)) |
1799 | return -EINVAL; | 1956 | return -EINVAL; |
1800 | 1957 | ||
1801 | spin_lock_irq(&ctx->ctx_lock); | 1958 | spin_lock_irq(&ctx->ctx_lock); |
1802 | 1959 | kiocb = lookup_kiocb(ctx, iocb); | |
1803 | kiocb = lookup_kiocb(ctx, iocb, key); | 1960 | if (kiocb) { |
1804 | if (kiocb) | 1961 | ret = kiocb->ki_cancel(&kiocb->rw); |
1805 | ret = kiocb_cancel(kiocb); | 1962 | list_del_init(&kiocb->ki_list); |
1806 | else | 1963 | } |
1807 | ret = -EINVAL; | ||
1808 | |||
1809 | spin_unlock_irq(&ctx->ctx_lock); | 1964 | spin_unlock_irq(&ctx->ctx_lock); |
1810 | 1965 | ||
1811 | if (!ret) { | 1966 | if (!ret) { |
@@ -1860,13 +2015,60 @@ SYSCALL_DEFINE5(io_getevents, aio_context_t, ctx_id, | |||
1860 | struct timespec __user *, timeout) | 2015 | struct timespec __user *, timeout) |
1861 | { | 2016 | { |
1862 | struct timespec64 ts; | 2017 | struct timespec64 ts; |
2018 | int ret; | ||
2019 | |||
2020 | if (timeout && unlikely(get_timespec64(&ts, timeout))) | ||
2021 | return -EFAULT; | ||
2022 | |||
2023 | ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &ts : NULL); | ||
2024 | if (!ret && signal_pending(current)) | ||
2025 | ret = -EINTR; | ||
2026 | return ret; | ||
2027 | } | ||
2028 | |||
2029 | SYSCALL_DEFINE6(io_pgetevents, | ||
2030 | aio_context_t, ctx_id, | ||
2031 | long, min_nr, | ||
2032 | long, nr, | ||
2033 | struct io_event __user *, events, | ||
2034 | struct timespec __user *, timeout, | ||
2035 | const struct __aio_sigset __user *, usig) | ||
2036 | { | ||
2037 | struct __aio_sigset ksig = { NULL, }; | ||
2038 | sigset_t ksigmask, sigsaved; | ||
2039 | struct timespec64 ts; | ||
2040 | int ret; | ||
2041 | |||
2042 | if (timeout && unlikely(get_timespec64(&ts, timeout))) | ||
2043 | return -EFAULT; | ||
2044 | |||
2045 | if (usig && copy_from_user(&ksig, usig, sizeof(ksig))) | ||
2046 | return -EFAULT; | ||
1863 | 2047 | ||
1864 | if (timeout) { | 2048 | if (ksig.sigmask) { |
1865 | if (unlikely(get_timespec64(&ts, timeout))) | 2049 | if (ksig.sigsetsize != sizeof(sigset_t)) |
2050 | return -EINVAL; | ||
2051 | if (copy_from_user(&ksigmask, ksig.sigmask, sizeof(ksigmask))) | ||
1866 | return -EFAULT; | 2052 | return -EFAULT; |
2053 | sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP)); | ||
2054 | sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); | ||
2055 | } | ||
2056 | |||
2057 | ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &ts : NULL); | ||
2058 | if (signal_pending(current)) { | ||
2059 | if (ksig.sigmask) { | ||
2060 | current->saved_sigmask = sigsaved; | ||
2061 | set_restore_sigmask(); | ||
2062 | } | ||
2063 | |||
2064 | if (!ret) | ||
2065 | ret = -ERESTARTNOHAND; | ||
2066 | } else { | ||
2067 | if (ksig.sigmask) | ||
2068 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | ||
1867 | } | 2069 | } |
1868 | 2070 | ||
1869 | return do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &ts : NULL); | 2071 | return ret; |
1870 | } | 2072 | } |
1871 | 2073 | ||
1872 | #ifdef CONFIG_COMPAT | 2074 | #ifdef CONFIG_COMPAT |
@@ -1877,13 +2079,64 @@ COMPAT_SYSCALL_DEFINE5(io_getevents, compat_aio_context_t, ctx_id, | |||
1877 | struct compat_timespec __user *, timeout) | 2079 | struct compat_timespec __user *, timeout) |
1878 | { | 2080 | { |
1879 | struct timespec64 t; | 2081 | struct timespec64 t; |
2082 | int ret; | ||
2083 | |||
2084 | if (timeout && compat_get_timespec64(&t, timeout)) | ||
2085 | return -EFAULT; | ||
2086 | |||
2087 | ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL); | ||
2088 | if (!ret && signal_pending(current)) | ||
2089 | ret = -EINTR; | ||
2090 | return ret; | ||
2091 | } | ||
2092 | |||
2093 | |||
2094 | struct __compat_aio_sigset { | ||
2095 | compat_sigset_t __user *sigmask; | ||
2096 | compat_size_t sigsetsize; | ||
2097 | }; | ||
2098 | |||
2099 | COMPAT_SYSCALL_DEFINE6(io_pgetevents, | ||
2100 | compat_aio_context_t, ctx_id, | ||
2101 | compat_long_t, min_nr, | ||
2102 | compat_long_t, nr, | ||
2103 | struct io_event __user *, events, | ||
2104 | struct compat_timespec __user *, timeout, | ||
2105 | const struct __compat_aio_sigset __user *, usig) | ||
2106 | { | ||
2107 | struct __compat_aio_sigset ksig = { NULL, }; | ||
2108 | sigset_t ksigmask, sigsaved; | ||
2109 | struct timespec64 t; | ||
2110 | int ret; | ||
2111 | |||
2112 | if (timeout && compat_get_timespec64(&t, timeout)) | ||
2113 | return -EFAULT; | ||
2114 | |||
2115 | if (usig && copy_from_user(&ksig, usig, sizeof(ksig))) | ||
2116 | return -EFAULT; | ||
1880 | 2117 | ||
1881 | if (timeout) { | 2118 | if (ksig.sigmask) { |
1882 | if (compat_get_timespec64(&t, timeout)) | 2119 | if (ksig.sigsetsize != sizeof(compat_sigset_t)) |
2120 | return -EINVAL; | ||
2121 | if (get_compat_sigset(&ksigmask, ksig.sigmask)) | ||
1883 | return -EFAULT; | 2122 | return -EFAULT; |
2123 | sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP)); | ||
2124 | sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); | ||
2125 | } | ||
1884 | 2126 | ||
2127 | ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL); | ||
2128 | if (signal_pending(current)) { | ||
2129 | if (ksig.sigmask) { | ||
2130 | current->saved_sigmask = sigsaved; | ||
2131 | set_restore_sigmask(); | ||
2132 | } | ||
2133 | if (!ret) | ||
2134 | ret = -ERESTARTNOHAND; | ||
2135 | } else { | ||
2136 | if (ksig.sigmask) | ||
2137 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | ||
1885 | } | 2138 | } |
1886 | 2139 | ||
1887 | return do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL); | 2140 | return ret; |
1888 | } | 2141 | } |
1889 | #endif | 2142 | #endif |
diff --git a/fs/eventfd.c b/fs/eventfd.c index 08d3bd602f73..61c9514da5e9 100644 --- a/fs/eventfd.c +++ b/fs/eventfd.c | |||
@@ -101,14 +101,20 @@ static int eventfd_release(struct inode *inode, struct file *file) | |||
101 | return 0; | 101 | return 0; |
102 | } | 102 | } |
103 | 103 | ||
104 | static __poll_t eventfd_poll(struct file *file, poll_table *wait) | 104 | static struct wait_queue_head * |
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) | ||
105 | { | 113 | { |
106 | struct eventfd_ctx *ctx = file->private_data; | 114 | struct eventfd_ctx *ctx = file->private_data; |
107 | __poll_t events = 0; | 115 | __poll_t events = 0; |
108 | u64 count; | 116 | u64 count; |
109 | 117 | ||
110 | poll_wait(file, &ctx->wqh, wait); | ||
111 | |||
112 | /* | 118 | /* |
113 | * All writes to ctx->count occur within ctx->wqh.lock. This read | 119 | * All writes to ctx->count occur within ctx->wqh.lock. This read |
114 | * can be done outside ctx->wqh.lock because we know that poll_wait | 120 | * can be done outside ctx->wqh.lock because we know that poll_wait |
@@ -305,7 +311,8 @@ static const struct file_operations eventfd_fops = { | |||
305 | .show_fdinfo = eventfd_show_fdinfo, | 311 | .show_fdinfo = eventfd_show_fdinfo, |
306 | #endif | 312 | #endif |
307 | .release = eventfd_release, | 313 | .release = eventfd_release, |
308 | .poll = eventfd_poll, | 314 | .get_poll_head = eventfd_get_poll_head, |
315 | .poll_mask = eventfd_poll_mask, | ||
309 | .read = eventfd_read, | 316 | .read = eventfd_read, |
310 | .write = eventfd_write, | 317 | .write = eventfd_write, |
311 | .llseek = noop_llseek, | 318 | .llseek = noop_llseek, |
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 602ca4285b2e..67db22fe99c5 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c | |||
@@ -884,8 +884,7 @@ static __poll_t ep_item_poll(const struct epitem *epi, poll_table *pt, | |||
884 | 884 | ||
885 | pt->_key = epi->event.events; | 885 | pt->_key = epi->event.events; |
886 | if (!is_file_epoll(epi->ffd.file)) | 886 | if (!is_file_epoll(epi->ffd.file)) |
887 | return epi->ffd.file->f_op->poll(epi->ffd.file, pt) & | 887 | return vfs_poll(epi->ffd.file, pt) & epi->event.events; |
888 | epi->event.events; | ||
889 | 888 | ||
890 | ep = epi->ffd.file->private_data; | 889 | ep = epi->ffd.file->private_data; |
891 | poll_wait(epi->ffd.file, &ep->poll_wait, pt); | 890 | poll_wait(epi->ffd.file, &ep->poll_wait, pt); |
@@ -2025,7 +2024,7 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, | |||
2025 | 2024 | ||
2026 | /* The target file descriptor must support poll */ | 2025 | /* The target file descriptor must support poll */ |
2027 | error = -EPERM; | 2026 | error = -EPERM; |
2028 | if (!tf.file->f_op->poll) | 2027 | if (!file_can_poll(tf.file)) |
2029 | goto error_tgt_fput; | 2028 | goto error_tgt_fput; |
2030 | 2029 | ||
2031 | /* Check if EPOLLWAKEUP is allowed */ | 2030 | /* Check if EPOLLWAKEUP is allowed */ |
@@ -509,19 +509,22 @@ static long pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
509 | } | 509 | } |
510 | } | 510 | } |
511 | 511 | ||
512 | /* No kernel lock held - fine */ | 512 | static struct wait_queue_head * |
513 | static __poll_t | 513 | pipe_get_poll_head(struct file *filp, __poll_t events) |
514 | pipe_poll(struct file *filp, poll_table *wait) | ||
515 | { | 514 | { |
516 | __poll_t mask; | ||
517 | struct pipe_inode_info *pipe = filp->private_data; | 515 | struct pipe_inode_info *pipe = filp->private_data; |
518 | int nrbufs; | ||
519 | 516 | ||
520 | poll_wait(filp, &pipe->wait, wait); | 517 | return &pipe->wait; |
518 | } | ||
519 | |||
520 | /* No kernel lock held - fine */ | ||
521 | static __poll_t pipe_poll_mask(struct file *filp, __poll_t events) | ||
522 | { | ||
523 | struct pipe_inode_info *pipe = filp->private_data; | ||
524 | int nrbufs = pipe->nrbufs; | ||
525 | __poll_t mask = 0; | ||
521 | 526 | ||
522 | /* Reading only -- no need for acquiring the semaphore. */ | 527 | /* Reading only -- no need for acquiring the semaphore. */ |
523 | nrbufs = pipe->nrbufs; | ||
524 | mask = 0; | ||
525 | if (filp->f_mode & FMODE_READ) { | 528 | if (filp->f_mode & FMODE_READ) { |
526 | mask = (nrbufs > 0) ? EPOLLIN | EPOLLRDNORM : 0; | 529 | mask = (nrbufs > 0) ? EPOLLIN | EPOLLRDNORM : 0; |
527 | if (!pipe->writers && filp->f_version != pipe->w_counter) | 530 | if (!pipe->writers && filp->f_version != pipe->w_counter) |
@@ -1020,7 +1023,8 @@ const struct file_operations pipefifo_fops = { | |||
1020 | .llseek = no_llseek, | 1023 | .llseek = no_llseek, |
1021 | .read_iter = pipe_read, | 1024 | .read_iter = pipe_read, |
1022 | .write_iter = pipe_write, | 1025 | .write_iter = pipe_write, |
1023 | .poll = pipe_poll, | 1026 | .get_poll_head = pipe_get_poll_head, |
1027 | .poll_mask = pipe_poll_mask, | ||
1024 | .unlocked_ioctl = pipe_ioctl, | 1028 | .unlocked_ioctl = pipe_ioctl, |
1025 | .release = pipe_release, | 1029 | .release = pipe_release, |
1026 | .fasync = pipe_fasync, | 1030 | .fasync = pipe_fasync, |
diff --git a/fs/select.c b/fs/select.c index ba879c51288f..bc3cc0f98896 100644 --- a/fs/select.c +++ b/fs/select.c | |||
@@ -34,6 +34,29 @@ | |||
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); | ||
37 | 60 | ||
38 | /* | 61 | /* |
39 | * Estimate expected accuracy in ns from a timeval. | 62 | * Estimate expected accuracy in ns from a timeval. |
@@ -233,7 +256,7 @@ static void __pollwait(struct file *filp, wait_queue_head_t *wait_address, | |||
233 | add_wait_queue(wait_address, &entry->wait); | 256 | add_wait_queue(wait_address, &entry->wait); |
234 | } | 257 | } |
235 | 258 | ||
236 | int poll_schedule_timeout(struct poll_wqueues *pwq, int state, | 259 | static int poll_schedule_timeout(struct poll_wqueues *pwq, int state, |
237 | ktime_t *expires, unsigned long slack) | 260 | ktime_t *expires, unsigned long slack) |
238 | { | 261 | { |
239 | int rc = -EINTR; | 262 | int rc = -EINTR; |
@@ -258,7 +281,6 @@ int poll_schedule_timeout(struct poll_wqueues *pwq, int state, | |||
258 | 281 | ||
259 | return rc; | 282 | return rc; |
260 | } | 283 | } |
261 | EXPORT_SYMBOL(poll_schedule_timeout); | ||
262 | 284 | ||
263 | /** | 285 | /** |
264 | * poll_select_set_timeout - helper function to setup the timeout value | 286 | * poll_select_set_timeout - helper function to setup the timeout value |
@@ -503,14 +525,10 @@ static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time) | |||
503 | continue; | 525 | continue; |
504 | f = fdget(i); | 526 | f = fdget(i); |
505 | if (f.file) { | 527 | if (f.file) { |
506 | const struct file_operations *f_op; | 528 | wait_key_set(wait, in, out, bit, |
507 | f_op = f.file->f_op; | 529 | busy_flag); |
508 | mask = DEFAULT_POLLMASK; | 530 | mask = vfs_poll(f.file, wait); |
509 | if (f_op->poll) { | 531 | |
510 | wait_key_set(wait, in, out, | ||
511 | bit, busy_flag); | ||
512 | mask = (*f_op->poll)(f.file, wait); | ||
513 | } | ||
514 | fdput(f); | 532 | fdput(f); |
515 | if ((mask & POLLIN_SET) && (in & bit)) { | 533 | if ((mask & POLLIN_SET) && (in & bit)) { |
516 | res_in |= bit; | 534 | res_in |= bit; |
@@ -813,34 +831,29 @@ static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait, | |||
813 | bool *can_busy_poll, | 831 | bool *can_busy_poll, |
814 | __poll_t busy_flag) | 832 | __poll_t busy_flag) |
815 | { | 833 | { |
816 | __poll_t mask; | 834 | int fd = pollfd->fd; |
817 | int fd; | 835 | __poll_t mask = 0, filter; |
818 | 836 | struct fd f; | |
819 | mask = 0; | 837 | |
820 | fd = pollfd->fd; | 838 | if (fd < 0) |
821 | if (fd >= 0) { | 839 | goto out; |
822 | struct fd f = fdget(fd); | 840 | mask = EPOLLNVAL; |
823 | mask = EPOLLNVAL; | 841 | f = fdget(fd); |
824 | if (f.file) { | 842 | if (!f.file) |
825 | /* userland u16 ->events contains POLL... bitmap */ | 843 | goto out; |
826 | __poll_t filter = demangle_poll(pollfd->events) | | 844 | |
827 | EPOLLERR | EPOLLHUP; | 845 | /* userland u16 ->events contains POLL... bitmap */ |
828 | mask = DEFAULT_POLLMASK; | 846 | filter = demangle_poll(pollfd->events) | EPOLLERR | EPOLLHUP; |
829 | if (f.file->f_op->poll) { | 847 | pwait->_key = filter | busy_flag; |
830 | pwait->_key = filter; | 848 | mask = vfs_poll(f.file, pwait); |
831 | pwait->_key |= busy_flag; | 849 | if (mask & busy_flag) |
832 | mask = f.file->f_op->poll(f.file, pwait); | 850 | *can_busy_poll = true; |
833 | if (mask & busy_flag) | 851 | mask &= filter; /* Mask out unneeded events. */ |
834 | *can_busy_poll = true; | 852 | fdput(f); |
835 | } | 853 | |
836 | /* Mask out unneeded events. */ | 854 | out: |
837 | mask &= filter; | ||
838 | fdput(f); | ||
839 | } | ||
840 | } | ||
841 | /* ... and so does ->revents */ | 855 | /* ... and so does ->revents */ |
842 | pollfd->revents = mangle_poll(mask); | 856 | pollfd->revents = mangle_poll(mask); |
843 | |||
844 | return mask; | 857 | return mask; |
845 | } | 858 | } |
846 | 859 | ||
diff --git a/fs/timerfd.c b/fs/timerfd.c index cdad49da3ff7..d84a2bee4f82 100644 --- a/fs/timerfd.c +++ b/fs/timerfd.c | |||
@@ -226,21 +226,20 @@ 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 __poll_t timerfd_poll(struct file *file, poll_table *wait) | 230 | static struct wait_queue_head *timerfd_get_poll_head(struct file *file, |
231 | __poll_t eventmask) | ||
231 | { | 232 | { |
232 | struct timerfd_ctx *ctx = file->private_data; | 233 | struct timerfd_ctx *ctx = file->private_data; |
233 | __poll_t events = 0; | ||
234 | unsigned long flags; | ||
235 | 234 | ||
236 | poll_wait(file, &ctx->wqh, wait); | 235 | return &ctx->wqh; |
236 | } | ||
237 | 237 | ||
238 | spin_lock_irqsave(&ctx->wqh.lock, flags); | 238 | static __poll_t timerfd_poll_mask(struct file *file, __poll_t eventmask) |
239 | if (ctx->ticks) | 239 | { |
240 | events |= EPOLLIN; | 240 | struct timerfd_ctx *ctx = file->private_data; |
241 | spin_unlock_irqrestore(&ctx->wqh.lock, flags); | ||
242 | 241 | ||
243 | return events; | 242 | return ctx->ticks ? EPOLLIN : 0; |
244 | } | 243 | } |
245 | 244 | ||
246 | static ssize_t timerfd_read(struct file *file, char __user *buf, size_t count, | 245 | static ssize_t timerfd_read(struct file *file, char __user *buf, size_t count, |
@@ -364,7 +363,8 @@ static long timerfd_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
364 | 363 | ||
365 | static const struct file_operations timerfd_fops = { | 364 | static const struct file_operations timerfd_fops = { |
366 | .release = timerfd_release, | 365 | .release = timerfd_release, |
367 | .poll = timerfd_poll, | 366 | .get_poll_head = timerfd_get_poll_head, |
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 482461d8931d..cc414db9da0a 100644 --- a/include/crypto/if_alg.h +++ b/include/crypto/if_alg.h | |||
@@ -245,8 +245,7 @@ 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(struct file *file, struct socket *sock, | 248 | __poll_t af_alg_poll_mask(struct socket *sock, __poll_t events); |
249 | poll_table *wait); | ||
250 | struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk, | 249 | struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk, |
251 | unsigned int areqlen); | 250 | unsigned int areqlen); |
252 | int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags, | 251 | int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags, |
diff --git a/include/linux/aio.h b/include/linux/aio.h index 9d8aabecfe2d..b83e68dd006f 100644 --- a/include/linux/aio.h +++ b/include/linux/aio.h | |||
@@ -8,8 +8,6 @@ struct kioctx; | |||
8 | struct kiocb; | 8 | struct kiocb; |
9 | struct mm_struct; | 9 | struct mm_struct; |
10 | 10 | ||
11 | #define KIOCB_KEY 0 | ||
12 | |||
13 | typedef int (kiocb_cancel_fn)(struct kiocb *); | 11 | typedef int (kiocb_cancel_fn)(struct kiocb *); |
14 | 12 | ||
15 | /* prototypes */ | 13 | /* prototypes */ |
diff --git a/include/linux/compat.h b/include/linux/compat.h index 081281ad5772..ad192057b887 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
@@ -330,6 +330,7 @@ extern int put_compat_rusage(const struct rusage *, | |||
330 | struct compat_rusage __user *); | 330 | struct compat_rusage __user *); |
331 | 331 | ||
332 | struct compat_siginfo; | 332 | struct compat_siginfo; |
333 | struct __compat_aio_sigset; | ||
333 | 334 | ||
334 | struct compat_dirent { | 335 | struct compat_dirent { |
335 | u32 d_ino; | 336 | u32 d_ino; |
@@ -553,6 +554,12 @@ asmlinkage long compat_sys_io_getevents(compat_aio_context_t ctx_id, | |||
553 | compat_long_t nr, | 554 | compat_long_t nr, |
554 | struct io_event __user *events, | 555 | struct io_event __user *events, |
555 | struct compat_timespec __user *timeout); | 556 | struct compat_timespec __user *timeout); |
557 | asmlinkage long compat_sys_io_pgetevents(compat_aio_context_t ctx_id, | ||
558 | compat_long_t min_nr, | ||
559 | compat_long_t nr, | ||
560 | struct io_event __user *events, | ||
561 | struct compat_timespec __user *timeout, | ||
562 | const struct __compat_aio_sigset __user *usig); | ||
556 | 563 | ||
557 | /* fs/cookies.c */ | 564 | /* fs/cookies.c */ |
558 | asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, compat_size_t); | 565 | asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, compat_size_t); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 7f86730b67a9..d4c37d371da5 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -1711,6 +1711,8 @@ struct file_operations { | |||
1711 | int (*iterate) (struct file *, struct dir_context *); | 1711 | int (*iterate) (struct file *, struct dir_context *); |
1712 | int (*iterate_shared) (struct file *, struct dir_context *); | 1712 | int (*iterate_shared) (struct file *, struct dir_context *); |
1713 | __poll_t (*poll) (struct file *, struct poll_table_struct *); | 1713 | __poll_t (*poll) (struct file *, struct poll_table_struct *); |
1714 | struct wait_queue_head * (*get_poll_head)(struct file *, __poll_t); | ||
1715 | __poll_t (*poll_mask) (struct file *, __poll_t); | ||
1714 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); | 1716 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); |
1715 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); | 1717 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); |
1716 | int (*mmap) (struct file *, struct vm_area_struct *); | 1718 | int (*mmap) (struct file *, struct vm_area_struct *); |
diff --git a/include/linux/net.h b/include/linux/net.h index 2248a052061d..3fd9d8c16581 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
@@ -147,6 +147,7 @@ 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); | ||
150 | __poll_t (*poll) (struct file *file, struct socket *sock, | 151 | __poll_t (*poll) (struct file *file, struct socket *sock, |
151 | struct poll_table_struct *wait); | 152 | struct poll_table_struct *wait); |
152 | int (*ioctl) (struct socket *sock, unsigned int cmd, | 153 | int (*ioctl) (struct socket *sock, unsigned int cmd, |
diff --git a/include/linux/poll.h b/include/linux/poll.h index f45ebd017eaa..fdf86b4cbc71 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h | |||
@@ -74,6 +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) | ||
78 | { | ||
79 | return file->f_op->get_poll_head && file->f_op->poll_mask; | ||
80 | } | ||
81 | |||
82 | static inline bool file_can_poll(struct file *file) | ||
83 | { | ||
84 | return file->f_op->poll || file_has_poll_mask(file); | ||
85 | } | ||
86 | |||
87 | __poll_t vfs_poll(struct file *file, struct poll_table_struct *pt); | ||
88 | |||
77 | struct poll_table_entry { | 89 | struct poll_table_entry { |
78 | struct file *filp; | 90 | struct file *filp; |
79 | __poll_t key; | 91 | __poll_t key; |
@@ -96,8 +108,6 @@ struct poll_wqueues { | |||
96 | 108 | ||
97 | extern void poll_initwait(struct poll_wqueues *pwq); | 109 | extern void poll_initwait(struct poll_wqueues *pwq); |
98 | extern void poll_freewait(struct poll_wqueues *pwq); | 110 | extern void poll_freewait(struct poll_wqueues *pwq); |
99 | extern int poll_schedule_timeout(struct poll_wqueues *pwq, int state, | ||
100 | ktime_t *expires, unsigned long slack); | ||
101 | extern u64 select_estimate_accuracy(struct timespec64 *tv); | 111 | extern u64 select_estimate_accuracy(struct timespec64 *tv); |
102 | 112 | ||
103 | #define MAX_INT64_SECONDS (((s64)(~((u64)0)>>1)/HZ)-1) | 113 | #define MAX_INT64_SECONDS (((s64)(~((u64)0)>>1)/HZ)-1) |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 9065477ed255..89198379b39d 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -3250,8 +3250,7 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags, | |||
3250 | int *peeked, int *off, int *err); | 3250 | int *peeked, int *off, int *err); |
3251 | struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, int noblock, | 3251 | struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, int noblock, |
3252 | int *err); | 3252 | int *err); |
3253 | __poll_t datagram_poll(struct file *file, struct socket *sock, | 3253 | __poll_t datagram_poll_mask(struct socket *sock, __poll_t events); |
3254 | struct poll_table_struct *wait); | ||
3255 | int skb_copy_datagram_iter(const struct sk_buff *from, int offset, | 3254 | int skb_copy_datagram_iter(const struct sk_buff *from, int offset, |
3256 | struct iov_iter *to, int size); | 3255 | struct iov_iter *to, int size); |
3257 | static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset, | 3256 | static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset, |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 70fcda1a9049..811172fcb916 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -290,6 +290,12 @@ asmlinkage long sys_io_getevents(aio_context_t ctx_id, | |||
290 | long nr, | 290 | long nr, |
291 | struct io_event __user *events, | 291 | struct io_event __user *events, |
292 | struct timespec __user *timeout); | 292 | struct timespec __user *timeout); |
293 | asmlinkage long sys_io_pgetevents(aio_context_t ctx_id, | ||
294 | long min_nr, | ||
295 | long nr, | ||
296 | struct io_event __user *events, | ||
297 | struct timespec __user *timeout, | ||
298 | const struct __aio_sigset *sig); | ||
293 | 299 | ||
294 | /* fs/xattr.c */ | 300 | /* fs/xattr.c */ |
295 | asmlinkage long sys_setxattr(const char __user *path, const char __user *name, | 301 | asmlinkage long sys_setxattr(const char __user *path, const char __user *name, |
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index ec9d6bc65855..53ce8176c313 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(struct file *file, struct socket *sock, poll_table *wait); | 274 | __poll_t bt_sock_poll_mask(struct socket *sock, __poll_t events); |
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/busy_poll.h b/include/net/busy_poll.h index 71c72a939bf8..c5187438af38 100644 --- a/include/net/busy_poll.h +++ b/include/net/busy_poll.h | |||
@@ -121,6 +121,21 @@ static inline void sk_busy_loop(struct sock *sk, int nonblock) | |||
121 | #endif | 121 | #endif |
122 | } | 122 | } |
123 | 123 | ||
124 | static inline void sock_poll_busy_loop(struct socket *sock, __poll_t events) | ||
125 | { | ||
126 | if (sk_can_busy_loop(sock->sk) && | ||
127 | events && (events & POLL_BUSY_LOOP)) { | ||
128 | /* once, only if requested by syscall */ | ||
129 | sk_busy_loop(sock->sk, 1); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | /* if this socket can poll_ll, tell the system call */ | ||
134 | static inline __poll_t sock_poll_busy_flag(struct socket *sock) | ||
135 | { | ||
136 | return sk_can_busy_loop(sock->sk) ? POLL_BUSY_LOOP : 0; | ||
137 | } | ||
138 | |||
124 | /* used in the NIC receive handler to mark the skb */ | 139 | /* used in the NIC receive handler to mark the skb */ |
125 | static inline void skb_mark_napi_id(struct sk_buff *skb, | 140 | static inline void skb_mark_napi_id(struct sk_buff *skb, |
126 | struct napi_struct *napi) | 141 | struct napi_struct *napi) |
diff --git a/include/net/iucv/af_iucv.h b/include/net/iucv/af_iucv.h index f4c21b5a1242..b0eaeb02d46d 100644 --- a/include/net/iucv/af_iucv.h +++ b/include/net/iucv/af_iucv.h | |||
@@ -153,8 +153,6 @@ 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); | ||
158 | void iucv_sock_link(struct iucv_sock_list *l, struct sock *s); | 156 | void iucv_sock_link(struct iucv_sock_list *l, struct sock *s); |
159 | void iucv_sock_unlink(struct iucv_sock_list *l, struct sock *s); | 157 | void iucv_sock_unlink(struct iucv_sock_list *l, struct sock *s); |
160 | void iucv_accept_enqueue(struct sock *parent, struct sock *sk); | 158 | 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 35498e613ff5..e6d349b2a791 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h | |||
@@ -109,8 +109,7 @@ 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(struct file *file, struct socket *sock, | 112 | __poll_t sctp_poll_mask(struct socket *sock, __poll_t events); |
113 | poll_table *wait); | ||
114 | void sctp_sock_rfree(struct sk_buff *skb); | 113 | void sctp_sock_rfree(struct sk_buff *skb); |
115 | void sctp_copy_sock(struct sock *newsk, struct sock *sk, | 114 | void sctp_copy_sock(struct sock *newsk, struct sock *sk, |
116 | struct sctp_association *asoc); | 115 | struct sctp_association *asoc); |
diff --git a/include/net/sock.h b/include/net/sock.h index 74d725fdbe0f..4d2e8ad98985 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -1591,8 +1591,6 @@ int sock_no_connect(struct socket *, struct sockaddr *, int, int); | |||
1591 | int sock_no_socketpair(struct socket *, struct socket *); | 1591 | int sock_no_socketpair(struct socket *, struct socket *); |
1592 | int sock_no_accept(struct socket *, struct socket *, int, bool); | 1592 | int sock_no_accept(struct socket *, struct socket *, int, bool); |
1593 | int sock_no_getname(struct socket *, struct sockaddr *, int); | 1593 | int sock_no_getname(struct socket *, struct sockaddr *, int); |
1594 | __poll_t sock_no_poll(struct file *, struct socket *, | ||
1595 | struct poll_table_struct *); | ||
1596 | int sock_no_ioctl(struct socket *, unsigned int, unsigned long); | 1594 | int sock_no_ioctl(struct socket *, unsigned int, unsigned long); |
1597 | int sock_no_listen(struct socket *, int); | 1595 | int sock_no_listen(struct socket *, int); |
1598 | int sock_no_shutdown(struct socket *, int); | 1596 | int sock_no_shutdown(struct socket *, int); |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 51dc7a26a2fa..f88f8a2cab0d 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -388,8 +388,7 @@ 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(struct file *file, struct socket *sock, | 391 | __poll_t tcp_poll_mask(struct socket *sock, __poll_t events); |
392 | struct poll_table_struct *wait); | ||
393 | int tcp_getsockopt(struct sock *sk, int level, int optname, | 392 | int tcp_getsockopt(struct sock *sk, int level, int optname, |
394 | char __user *optval, int __user *optlen); | 393 | char __user *optval, int __user *optlen); |
395 | int tcp_setsockopt(struct sock *sk, int level, int optname, | 394 | int tcp_setsockopt(struct sock *sk, int level, int optname, |
diff --git a/include/net/udp.h b/include/net/udp.h index 621778b80e3d..d8ca3b26964d 100644 --- a/include/net/udp.h +++ b/include/net/udp.h | |||
@@ -276,7 +276,7 @@ int udp_init_sock(struct sock *sk); | |||
276 | int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); | 276 | int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); |
277 | int __udp_disconnect(struct sock *sk, int flags); | 277 | int __udp_disconnect(struct sock *sk, int flags); |
278 | int udp_disconnect(struct sock *sk, int flags); | 278 | int udp_disconnect(struct sock *sk, int flags); |
279 | __poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait); | 279 | __poll_t udp_poll_mask(struct socket *sock, __poll_t events); |
280 | struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb, | 280 | struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb, |
281 | netdev_features_t features, | 281 | netdev_features_t features, |
282 | bool is_ipv6); | 282 | bool is_ipv6); |
diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 8bcb186c6f67..42990676a55e 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h | |||
@@ -732,9 +732,11 @@ __SYSCALL(__NR_pkey_alloc, sys_pkey_alloc) | |||
732 | __SYSCALL(__NR_pkey_free, sys_pkey_free) | 732 | __SYSCALL(__NR_pkey_free, sys_pkey_free) |
733 | #define __NR_statx 291 | 733 | #define __NR_statx 291 |
734 | __SYSCALL(__NR_statx, sys_statx) | 734 | __SYSCALL(__NR_statx, sys_statx) |
735 | #define __NR_io_pgetevents 292 | ||
736 | __SC_COMP(__NR_io_pgetevents, sys_io_pgetevents, compat_sys_io_pgetevents) | ||
735 | 737 | ||
736 | #undef __NR_syscalls | 738 | #undef __NR_syscalls |
737 | #define __NR_syscalls 292 | 739 | #define __NR_syscalls 293 |
738 | 740 | ||
739 | /* | 741 | /* |
740 | * 32 bit systems traditionally used different | 742 | * 32 bit systems traditionally used different |
diff --git a/include/uapi/linux/aio_abi.h b/include/uapi/linux/aio_abi.h index a04adbc70ddf..ed0185945bb2 100644 --- a/include/uapi/linux/aio_abi.h +++ b/include/uapi/linux/aio_abi.h | |||
@@ -29,6 +29,7 @@ | |||
29 | 29 | ||
30 | #include <linux/types.h> | 30 | #include <linux/types.h> |
31 | #include <linux/fs.h> | 31 | #include <linux/fs.h> |
32 | #include <linux/signal.h> | ||
32 | #include <asm/byteorder.h> | 33 | #include <asm/byteorder.h> |
33 | 34 | ||
34 | typedef __kernel_ulong_t aio_context_t; | 35 | typedef __kernel_ulong_t aio_context_t; |
@@ -38,10 +39,8 @@ enum { | |||
38 | IOCB_CMD_PWRITE = 1, | 39 | IOCB_CMD_PWRITE = 1, |
39 | IOCB_CMD_FSYNC = 2, | 40 | IOCB_CMD_FSYNC = 2, |
40 | IOCB_CMD_FDSYNC = 3, | 41 | IOCB_CMD_FDSYNC = 3, |
41 | /* These two are experimental. | 42 | /* 4 was the experimental IOCB_CMD_PREADX */ |
42 | * IOCB_CMD_PREADX = 4, | 43 | IOCB_CMD_POLL = 5, |
43 | * IOCB_CMD_POLL = 5, | ||
44 | */ | ||
45 | IOCB_CMD_NOOP = 6, | 44 | IOCB_CMD_NOOP = 6, |
46 | IOCB_CMD_PREADV = 7, | 45 | IOCB_CMD_PREADV = 7, |
47 | IOCB_CMD_PWRITEV = 8, | 46 | IOCB_CMD_PWRITEV = 8, |
@@ -108,5 +107,10 @@ struct iocb { | |||
108 | #undef IFBIG | 107 | #undef IFBIG |
109 | #undef IFLITTLE | 108 | #undef IFLITTLE |
110 | 109 | ||
110 | struct __aio_sigset { | ||
111 | sigset_t __user *sigmask; | ||
112 | size_t sigsetsize; | ||
113 | }; | ||
114 | |||
111 | #endif /* __LINUX__AIO_ABI_H */ | 115 | #endif /* __LINUX__AIO_ABI_H */ |
112 | 116 | ||
diff --git a/include/uapi/linux/types.h b/include/uapi/linux/types.h index cd4f0b897a48..2fce8b6876e9 100644 --- a/include/uapi/linux/types.h +++ b/include/uapi/linux/types.h | |||
@@ -49,11 +49,7 @@ typedef __u32 __bitwise __wsum; | |||
49 | #define __aligned_be64 __be64 __attribute__((aligned(8))) | 49 | #define __aligned_be64 __be64 __attribute__((aligned(8))) |
50 | #define __aligned_le64 __le64 __attribute__((aligned(8))) | 50 | #define __aligned_le64 __le64 __attribute__((aligned(8))) |
51 | 51 | ||
52 | #ifdef __CHECK_POLL | ||
53 | typedef unsigned __bitwise __poll_t; | 52 | typedef unsigned __bitwise __poll_t; |
54 | #else | ||
55 | typedef unsigned __poll_t; | ||
56 | #endif | ||
57 | 53 | ||
58 | #endif /* __ASSEMBLY__ */ | 54 | #endif /* __ASSEMBLY__ */ |
59 | #endif /* _UAPI_LINUX_TYPES_H */ | 55 | #endif /* _UAPI_LINUX_TYPES_H */ |
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index 9791364925dc..183169c2a75b 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c | |||
@@ -43,7 +43,9 @@ COND_SYSCALL(io_submit); | |||
43 | COND_SYSCALL_COMPAT(io_submit); | 43 | COND_SYSCALL_COMPAT(io_submit); |
44 | COND_SYSCALL(io_cancel); | 44 | COND_SYSCALL(io_cancel); |
45 | COND_SYSCALL(io_getevents); | 45 | COND_SYSCALL(io_getevents); |
46 | COND_SYSCALL(io_pgetevents); | ||
46 | COND_SYSCALL_COMPAT(io_getevents); | 47 | COND_SYSCALL_COMPAT(io_getevents); |
48 | COND_SYSCALL_COMPAT(io_pgetevents); | ||
47 | 49 | ||
48 | /* fs/xattr.c */ | 50 | /* fs/xattr.c */ |
49 | 51 | ||
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 2bd3df3d101a..1695f38630f1 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -3849,7 +3849,7 @@ static ssize_t memcg_write_event_control(struct kernfs_open_file *of, | |||
3849 | if (ret) | 3849 | if (ret) |
3850 | goto out_put_css; | 3850 | goto out_put_css; |
3851 | 3851 | ||
3852 | efile.file->f_op->poll(efile.file, &event->pt); | 3852 | vfs_poll(efile.file, &event->pt); |
3853 | 3853 | ||
3854 | spin_lock(&memcg->event_list_lock); | 3854 | spin_lock(&memcg->event_list_lock); |
3855 | list_add(&event->list, &memcg->event_list); | 3855 | list_add(&event->list, &memcg->event_list); |
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c index 848969fe7979..588bf88c3305 100644 --- a/net/9p/trans_fd.c +++ b/net/9p/trans_fd.c | |||
@@ -231,7 +231,7 @@ static void p9_conn_cancel(struct p9_conn *m, int err) | |||
231 | static __poll_t | 231 | static __poll_t |
232 | p9_fd_poll(struct p9_client *client, struct poll_table_struct *pt, int *err) | 232 | p9_fd_poll(struct p9_client *client, struct poll_table_struct *pt, int *err) |
233 | { | 233 | { |
234 | __poll_t ret, n; | 234 | __poll_t ret; |
235 | struct p9_trans_fd *ts = NULL; | 235 | struct p9_trans_fd *ts = NULL; |
236 | 236 | ||
237 | if (client && client->status == Connected) | 237 | if (client && client->status == Connected) |
@@ -243,19 +243,9 @@ p9_fd_poll(struct p9_client *client, struct poll_table_struct *pt, int *err) | |||
243 | return EPOLLERR; | 243 | return EPOLLERR; |
244 | } | 244 | } |
245 | 245 | ||
246 | if (!ts->rd->f_op->poll) | 246 | ret = vfs_poll(ts->rd, pt); |
247 | ret = DEFAULT_POLLMASK; | 247 | if (ts->rd != ts->wr) |
248 | else | 248 | ret = (ret & ~EPOLLOUT) | (vfs_poll(ts->wr, pt) & ~EPOLLIN); |
249 | ret = ts->rd->f_op->poll(ts->rd, pt); | ||
250 | |||
251 | if (ts->rd != ts->wr) { | ||
252 | if (!ts->wr->f_op->poll) | ||
253 | n = DEFAULT_POLLMASK; | ||
254 | else | ||
255 | n = ts->wr->f_op->poll(ts->wr, pt); | ||
256 | ret = (ret & ~EPOLLOUT) | (n & ~EPOLLIN); | ||
257 | } | ||
258 | |||
259 | return ret; | 249 | return ret; |
260 | } | 250 | } |
261 | 251 | ||
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 9b6bc5abe946..55fdba05d7d9 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 = datagram_poll, | 1872 | .poll_mask = datagram_poll_mask, |
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 fc78a0508ae1..1f2af59935db 100644 --- a/net/atm/common.c +++ b/net/atm/common.c | |||
@@ -648,16 +648,11 @@ out: | |||
648 | return error; | 648 | return error; |
649 | } | 649 | } |
650 | 650 | ||
651 | __poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait) | 651 | __poll_t vcc_poll_mask(struct socket *sock, __poll_t events) |
652 | { | 652 | { |
653 | struct sock *sk = sock->sk; | 653 | struct sock *sk = sock->sk; |
654 | struct atm_vcc *vcc; | 654 | struct atm_vcc *vcc = ATM_SD(sock); |
655 | __poll_t mask; | 655 | __poll_t mask = 0; |
656 | |||
657 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
658 | mask = 0; | ||
659 | |||
660 | vcc = ATM_SD(sock); | ||
661 | 656 | ||
662 | /* exceptional events */ | 657 | /* exceptional events */ |
663 | if (sk->sk_err) | 658 | if (sk->sk_err) |
diff --git a/net/atm/common.h b/net/atm/common.h index 5850649068bb..526796ad230f 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(struct file *file, struct socket *sock, poll_table *wait); | 20 | __poll_t vcc_poll_mask(struct socket *sock, __poll_t events); |
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 2cb10af16afc..9f75092fe778 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 = vcc_poll, | 116 | .poll_mask = vcc_poll_mask, |
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 2f91b766ac42..53f4ad7087b1 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 = vcc_poll, | 639 | .poll_mask = vcc_poll_mask, |
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 c603d33d5410..d1d2442ce573 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 = datagram_poll, | 1944 | .poll_mask = datagram_poll_mask, |
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 3264e1873219..510ab4f55df5 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -437,16 +437,13 @@ 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(struct file *file, struct socket *sock, | 440 | __poll_t bt_sock_poll_mask(struct socket *sock, __poll_t events) |
441 | poll_table *wait) | ||
442 | { | 441 | { |
443 | struct sock *sk = sock->sk; | 442 | struct sock *sk = sock->sk; |
444 | __poll_t mask = 0; | 443 | __poll_t mask = 0; |
445 | 444 | ||
446 | BT_DBG("sock %p, sk %p", sock, sk); | 445 | BT_DBG("sock %p, sk %p", sock, sk); |
447 | 446 | ||
448 | poll_wait(file, sk_sleep(sk), wait); | ||
449 | |||
450 | if (sk->sk_state == BT_LISTEN) | 447 | if (sk->sk_state == BT_LISTEN) |
451 | return bt_accept_poll(sk); | 448 | return bt_accept_poll(sk); |
452 | 449 | ||
@@ -478,7 +475,7 @@ __poll_t bt_sock_poll(struct file *file, struct socket *sock, | |||
478 | 475 | ||
479 | return mask; | 476 | return mask; |
480 | } | 477 | } |
481 | EXPORT_SYMBOL(bt_sock_poll); | 478 | EXPORT_SYMBOL(bt_sock_poll_mask); |
482 | 479 | ||
483 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | 480 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) |
484 | { | 481 | { |
diff --git a/net/bluetooth/bnep/sock.c b/net/bluetooth/bnep/sock.c index b5116fa9835e..00deacdcb51c 100644 --- a/net/bluetooth/bnep/sock.c +++ b/net/bluetooth/bnep/sock.c | |||
@@ -175,7 +175,6 @@ static const struct proto_ops bnep_sock_ops = { | |||
175 | .getname = sock_no_getname, | 175 | .getname = sock_no_getname, |
176 | .sendmsg = sock_no_sendmsg, | 176 | .sendmsg = sock_no_sendmsg, |
177 | .recvmsg = sock_no_recvmsg, | 177 | .recvmsg = sock_no_recvmsg, |
178 | .poll = sock_no_poll, | ||
179 | .listen = sock_no_listen, | 178 | .listen = sock_no_listen, |
180 | .shutdown = sock_no_shutdown, | 179 | .shutdown = sock_no_shutdown, |
181 | .setsockopt = sock_no_setsockopt, | 180 | .setsockopt = sock_no_setsockopt, |
diff --git a/net/bluetooth/cmtp/sock.c b/net/bluetooth/cmtp/sock.c index ce86a7bae844..e08f28fadd65 100644 --- a/net/bluetooth/cmtp/sock.c +++ b/net/bluetooth/cmtp/sock.c | |||
@@ -178,7 +178,6 @@ static const struct proto_ops cmtp_sock_ops = { | |||
178 | .getname = sock_no_getname, | 178 | .getname = sock_no_getname, |
179 | .sendmsg = sock_no_sendmsg, | 179 | .sendmsg = sock_no_sendmsg, |
180 | .recvmsg = sock_no_recvmsg, | 180 | .recvmsg = sock_no_recvmsg, |
181 | .poll = sock_no_poll, | ||
182 | .listen = sock_no_listen, | 181 | .listen = sock_no_listen, |
183 | .shutdown = sock_no_shutdown, | 182 | .shutdown = sock_no_shutdown, |
184 | .setsockopt = sock_no_setsockopt, | 183 | .setsockopt = sock_no_setsockopt, |
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 1506e1632394..d6c099861538 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 = datagram_poll, | 1978 | .poll_mask = datagram_poll_mask, |
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/hidp/sock.c b/net/bluetooth/hidp/sock.c index 008ba439bd62..1eaac01f85de 100644 --- a/net/bluetooth/hidp/sock.c +++ b/net/bluetooth/hidp/sock.c | |||
@@ -208,7 +208,6 @@ static const struct proto_ops hidp_sock_ops = { | |||
208 | .getname = sock_no_getname, | 208 | .getname = sock_no_getname, |
209 | .sendmsg = sock_no_sendmsg, | 209 | .sendmsg = sock_no_sendmsg, |
210 | .recvmsg = sock_no_recvmsg, | 210 | .recvmsg = sock_no_recvmsg, |
211 | .poll = sock_no_poll, | ||
212 | .listen = sock_no_listen, | 211 | .listen = sock_no_listen, |
213 | .shutdown = sock_no_shutdown, | 212 | .shutdown = sock_no_shutdown, |
214 | .setsockopt = sock_no_setsockopt, | 213 | .setsockopt = sock_no_setsockopt, |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 686bdc6b35b0..742a190034e6 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 = bt_sock_poll, | 1656 | .poll_mask = bt_sock_poll_mask, |
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 d606e9212291..1cf57622473a 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 = bt_sock_poll, | 1052 | .poll_mask = bt_sock_poll_mask, |
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 413b8ee49fec..d60dbc61d170 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 = bt_sock_poll, | 1200 | .poll_mask = bt_sock_poll_mask, |
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 a6fb1b3bcad9..c7991867d622 100644 --- a/net/caif/caif_socket.c +++ b/net/caif/caif_socket.c | |||
@@ -934,15 +934,11 @@ 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(struct file *file, | 937 | static __poll_t caif_poll_mask(struct socket *sock, __poll_t events) |
938 | struct socket *sock, poll_table *wait) | ||
939 | { | 938 | { |
940 | struct sock *sk = sock->sk; | 939 | struct sock *sk = sock->sk; |
941 | __poll_t mask; | ||
942 | struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); | 940 | struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); |
943 | 941 | __poll_t mask = 0; | |
944 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
945 | mask = 0; | ||
946 | 942 | ||
947 | /* exceptional events? */ | 943 | /* exceptional events? */ |
948 | if (sk->sk_err) | 944 | if (sk->sk_err) |
@@ -976,7 +972,7 @@ static const struct proto_ops caif_seqpacket_ops = { | |||
976 | .socketpair = sock_no_socketpair, | 972 | .socketpair = sock_no_socketpair, |
977 | .accept = sock_no_accept, | 973 | .accept = sock_no_accept, |
978 | .getname = sock_no_getname, | 974 | .getname = sock_no_getname, |
979 | .poll = caif_poll, | 975 | .poll_mask = caif_poll_mask, |
980 | .ioctl = sock_no_ioctl, | 976 | .ioctl = sock_no_ioctl, |
981 | .listen = sock_no_listen, | 977 | .listen = sock_no_listen, |
982 | .shutdown = sock_no_shutdown, | 978 | .shutdown = sock_no_shutdown, |
@@ -997,7 +993,7 @@ static const struct proto_ops caif_stream_ops = { | |||
997 | .socketpair = sock_no_socketpair, | 993 | .socketpair = sock_no_socketpair, |
998 | .accept = sock_no_accept, | 994 | .accept = sock_no_accept, |
999 | .getname = sock_no_getname, | 995 | .getname = sock_no_getname, |
1000 | .poll = caif_poll, | 996 | .poll_mask = caif_poll_mask, |
1001 | .ioctl = sock_no_ioctl, | 997 | .ioctl = sock_no_ioctl, |
1002 | .listen = sock_no_listen, | 998 | .listen = sock_no_listen, |
1003 | .shutdown = sock_no_shutdown, | 999 | .shutdown = sock_no_shutdown, |
diff --git a/net/can/bcm.c b/net/can/bcm.c index 6ad89f49b341..97fedff3f0c4 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
@@ -1657,7 +1657,7 @@ static const struct proto_ops bcm_ops = { | |||
1657 | .socketpair = sock_no_socketpair, | 1657 | .socketpair = sock_no_socketpair, |
1658 | .accept = sock_no_accept, | 1658 | .accept = sock_no_accept, |
1659 | .getname = sock_no_getname, | 1659 | .getname = sock_no_getname, |
1660 | .poll = datagram_poll, | 1660 | .poll_mask = datagram_poll_mask, |
1661 | .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ | 1661 | .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ |
1662 | .listen = sock_no_listen, | 1662 | .listen = sock_no_listen, |
1663 | .shutdown = sock_no_shutdown, | 1663 | .shutdown = sock_no_shutdown, |
diff --git a/net/can/raw.c b/net/can/raw.c index 1051eee82581..fd7e2f49ea6a 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 = datagram_poll, | 846 | .poll_mask = datagram_poll_mask, |
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 9938952c5c78..f19bf3dc2bd6 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
@@ -819,9 +819,8 @@ 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 | ||
823 | * @sock: socket | 822 | * @sock: socket |
824 | * @wait: poll table | 823 | * @events to wait for |
825 | * | 824 | * |
826 | * Datagram poll: Again totally generic. This also handles | 825 | * Datagram poll: Again totally generic. This also handles |
827 | * sequenced packet sockets providing the socket receive queue | 826 | * sequenced packet sockets providing the socket receive queue |
@@ -831,14 +830,10 @@ EXPORT_SYMBOL(skb_copy_and_csum_datagram_msg); | |||
831 | * and you use a different write policy from sock_writeable() | 830 | * and you use a different write policy from sock_writeable() |
832 | * then please supply your own write_space callback. | 831 | * then please supply your own write_space callback. |
833 | */ | 832 | */ |
834 | __poll_t datagram_poll(struct file *file, struct socket *sock, | 833 | __poll_t datagram_poll_mask(struct socket *sock, __poll_t events) |
835 | poll_table *wait) | ||
836 | { | 834 | { |
837 | struct sock *sk = sock->sk; | 835 | struct sock *sk = sock->sk; |
838 | __poll_t mask; | 836 | __poll_t mask = 0; |
839 | |||
840 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
841 | mask = 0; | ||
842 | 837 | ||
843 | /* exceptional events? */ | 838 | /* exceptional events? */ |
844 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) | 839 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) |
@@ -871,4 +866,4 @@ __poll_t datagram_poll(struct file *file, struct socket *sock, | |||
871 | 866 | ||
872 | return mask; | 867 | return mask; |
873 | } | 868 | } |
874 | EXPORT_SYMBOL(datagram_poll); | 869 | EXPORT_SYMBOL(datagram_poll_mask); |
diff --git a/net/core/sock.c b/net/core/sock.c index 815770333d91..2aed99a541d5 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -2567,12 +2567,6 @@ int sock_no_getname(struct socket *sock, struct sockaddr *saddr, | |||
2567 | } | 2567 | } |
2568 | EXPORT_SYMBOL(sock_no_getname); | 2568 | EXPORT_SYMBOL(sock_no_getname); |
2569 | 2569 | ||
2570 | __poll_t sock_no_poll(struct file *file, struct socket *sock, poll_table *pt) | ||
2571 | { | ||
2572 | return 0; | ||
2573 | } | ||
2574 | EXPORT_SYMBOL(sock_no_poll); | ||
2575 | |||
2576 | int sock_no_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | 2570 | int sock_no_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) |
2577 | { | 2571 | { |
2578 | return -EOPNOTSUPP; | 2572 | return -EOPNOTSUPP; |
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h index f91e3816806b..0ea2ee56ac1b 100644 --- a/net/dccp/dccp.h +++ b/net/dccp/dccp.h | |||
@@ -316,8 +316,7 @@ 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(struct file *file, struct socket *sock, | 319 | __poll_t dccp_poll_mask(struct socket *sock, __poll_t events); |
320 | poll_table *wait); | ||
321 | int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); | 320 | int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); |
322 | void dccp_req_err(struct sock *sk, u64 seq); | 321 | void dccp_req_err(struct sock *sk, u64 seq); |
323 | 322 | ||
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index b08feb219b44..a9e478cd3787 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 = dccp_poll, | 987 | .poll_mask = dccp_poll_mask, |
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 6344f1b18a6a..17fc4e0166ba 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 = dccp_poll, | 1073 | .poll_mask = dccp_poll_mask, |
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 0d56e36a6db7..ca21c1c76da0 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -312,20 +312,11 @@ 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 | /* | 315 | __poll_t dccp_poll_mask(struct socket *sock, __poll_t events) |
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) | ||
324 | { | 316 | { |
325 | __poll_t mask; | 317 | __poll_t mask; |
326 | struct sock *sk = sock->sk; | 318 | struct sock *sk = sock->sk; |
327 | 319 | ||
328 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
329 | if (sk->sk_state == DCCP_LISTEN) | 320 | if (sk->sk_state == DCCP_LISTEN) |
330 | return inet_csk_listen_poll(sk); | 321 | return inet_csk_listen_poll(sk); |
331 | 322 | ||
@@ -367,7 +358,7 @@ __poll_t dccp_poll(struct file *file, struct socket *sock, | |||
367 | return mask; | 358 | return mask; |
368 | } | 359 | } |
369 | 360 | ||
370 | EXPORT_SYMBOL_GPL(dccp_poll); | 361 | EXPORT_SYMBOL_GPL(dccp_poll_mask); |
371 | 362 | ||
372 | int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg) | 363 | int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg) |
373 | { | 364 | { |
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 7d6ff983ba2c..9a686d890bfa 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(struct file *file, struct socket *sock, poll_table *wait) | 1210 | static __poll_t dn_poll_mask(struct socket *sock, __poll_t events) |
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(file, sock, wait); | 1214 | __poll_t mask = datagram_poll_mask(sock, events); |
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 = dn_poll, | 2334 | .poll_mask = dn_poll_mask, |
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 a60658c85a9a..a0768d2759b8 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 = datagram_poll, | 426 | .poll_mask = datagram_poll_mask, |
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 = datagram_poll, | 972 | .poll_mask = datagram_poll_mask, |
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 eaed0367e669..8a59428e63ab 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 = tcp_poll, | 989 | .poll_mask = tcp_poll_mask, |
990 | .ioctl = inet_ioctl, | 990 | .ioctl = inet_ioctl, |
991 | .listen = inet_listen, | 991 | .listen = inet_listen, |
992 | .shutdown = inet_shutdown, | 992 | .shutdown = inet_shutdown, |
@@ -1018,7 +1018,7 @@ const struct proto_ops inet_dgram_ops = { | |||
1018 | .socketpair = sock_no_socketpair, | 1018 | .socketpair = sock_no_socketpair, |
1019 | .accept = sock_no_accept, | 1019 | .accept = sock_no_accept, |
1020 | .getname = inet_getname, | 1020 | .getname = inet_getname, |
1021 | .poll = udp_poll, | 1021 | .poll_mask = udp_poll_mask, |
1022 | .ioctl = inet_ioctl, | 1022 | .ioctl = inet_ioctl, |
1023 | .listen = sock_no_listen, | 1023 | .listen = sock_no_listen, |
1024 | .shutdown = inet_shutdown, | 1024 | .shutdown = inet_shutdown, |
@@ -1039,7 +1039,7 @@ EXPORT_SYMBOL(inet_dgram_ops); | |||
1039 | 1039 | ||
1040 | /* | 1040 | /* |
1041 | * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without | 1041 | * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without |
1042 | * udp_poll | 1042 | * udp_poll_mask |
1043 | */ | 1043 | */ |
1044 | static const struct proto_ops inet_sockraw_ops = { | 1044 | static const struct proto_ops inet_sockraw_ops = { |
1045 | .family = PF_INET, | 1045 | .family = PF_INET, |
@@ -1050,7 +1050,7 @@ static const struct proto_ops inet_sockraw_ops = { | |||
1050 | .socketpair = sock_no_socketpair, | 1050 | .socketpair = sock_no_socketpair, |
1051 | .accept = sock_no_accept, | 1051 | .accept = sock_no_accept, |
1052 | .getname = inet_getname, | 1052 | .getname = inet_getname, |
1053 | .poll = datagram_poll, | 1053 | .poll_mask = datagram_poll_mask, |
1054 | .ioctl = inet_ioctl, | 1054 | .ioctl = inet_ioctl, |
1055 | .listen = sock_no_listen, | 1055 | .listen = sock_no_listen, |
1056 | .shutdown = inet_shutdown, | 1056 | .shutdown = inet_shutdown, |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index c9d00ef54dec..dec47e6789e7 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -494,32 +494,21 @@ static inline bool tcp_stream_is_readable(const struct tcp_sock *tp, | |||
494 | } | 494 | } |
495 | 495 | ||
496 | /* | 496 | /* |
497 | * Wait for a TCP event. | 497 | * Socket is not locked. We are protected from async events by poll logic and |
498 | * | 498 | * correct handling of state changes made by other threads is impossible in |
499 | * Note that we don't need to lock the socket, as the upper poll layers | 499 | * any case. |
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. | ||
502 | */ | 500 | */ |
503 | __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait) | 501 | __poll_t tcp_poll_mask(struct socket *sock, __poll_t events) |
504 | { | 502 | { |
505 | __poll_t mask; | ||
506 | struct sock *sk = sock->sk; | 503 | struct sock *sk = sock->sk; |
507 | const struct tcp_sock *tp = tcp_sk(sk); | 504 | const struct tcp_sock *tp = tcp_sk(sk); |
505 | __poll_t mask = 0; | ||
508 | int state; | 506 | int state; |
509 | 507 | ||
510 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
511 | |||
512 | state = inet_sk_state_load(sk); | 508 | state = inet_sk_state_load(sk); |
513 | if (state == TCP_LISTEN) | 509 | if (state == TCP_LISTEN) |
514 | return inet_csk_listen_poll(sk); | 510 | return inet_csk_listen_poll(sk); |
515 | 511 | ||
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 | |||
523 | /* | 512 | /* |
524 | * EPOLLHUP is certainly not done right. But poll() doesn't | 513 | * EPOLLHUP is certainly not done right. But poll() doesn't |
525 | * have a notion of HUP in just one direction, and for a | 514 | * have a notion of HUP in just one direction, and for a |
@@ -600,7 +589,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait) | |||
600 | 589 | ||
601 | return mask; | 590 | return mask; |
602 | } | 591 | } |
603 | EXPORT_SYMBOL(tcp_poll); | 592 | EXPORT_SYMBOL(tcp_poll_mask); |
604 | 593 | ||
605 | int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg) | 594 | int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg) |
606 | { | 595 | { |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 051a43ff3fb8..675433eb53a8 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -2501,7 +2501,7 @@ int compat_udp_getsockopt(struct sock *sk, int level, int optname, | |||
2501 | * udp_poll - wait for a UDP event. | 2501 | * udp_poll - wait for a UDP event. |
2502 | * @file - file struct | 2502 | * @file - file struct |
2503 | * @sock - socket | 2503 | * @sock - socket |
2504 | * @wait - poll table | 2504 | * @events - events to wait for |
2505 | * | 2505 | * |
2506 | * This is same as datagram poll, except for the special case of | 2506 | * This is same as datagram poll, except for the special case of |
2507 | * blocking sockets. If application is using a blocking fd | 2507 | * blocking sockets. If application is using a blocking fd |
@@ -2510,23 +2510,23 @@ int compat_udp_getsockopt(struct sock *sk, int level, int optname, | |||
2510 | * but then block when reading it. Add special case code | 2510 | * but then block when reading it. Add special case code |
2511 | * to work around these arguably broken applications. | 2511 | * to work around these arguably broken applications. |
2512 | */ | 2512 | */ |
2513 | __poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait) | 2513 | __poll_t udp_poll_mask(struct socket *sock, __poll_t events) |
2514 | { | 2514 | { |
2515 | __poll_t mask = datagram_poll(file, sock, wait); | 2515 | __poll_t mask = datagram_poll_mask(sock, events); |
2516 | struct sock *sk = sock->sk; | 2516 | struct sock *sk = sock->sk; |
2517 | 2517 | ||
2518 | if (!skb_queue_empty(&udp_sk(sk)->reader_queue)) | 2518 | if (!skb_queue_empty(&udp_sk(sk)->reader_queue)) |
2519 | mask |= EPOLLIN | EPOLLRDNORM; | 2519 | mask |= EPOLLIN | EPOLLRDNORM; |
2520 | 2520 | ||
2521 | /* Check for false positives due to checksum errors */ | 2521 | /* Check for false positives due to checksum errors */ |
2522 | if ((mask & EPOLLRDNORM) && !(file->f_flags & O_NONBLOCK) && | 2522 | if ((mask & EPOLLRDNORM) && !(sock->file->f_flags & O_NONBLOCK) && |
2523 | !(sk->sk_shutdown & RCV_SHUTDOWN) && first_packet_length(sk) == -1) | 2523 | !(sk->sk_shutdown & RCV_SHUTDOWN) && first_packet_length(sk) == -1) |
2524 | mask &= ~(EPOLLIN | EPOLLRDNORM); | 2524 | mask &= ~(EPOLLIN | EPOLLRDNORM); |
2525 | 2525 | ||
2526 | return mask; | 2526 | return mask; |
2527 | 2527 | ||
2528 | } | 2528 | } |
2529 | EXPORT_SYMBOL(udp_poll); | 2529 | EXPORT_SYMBOL(udp_poll_mask); |
2530 | 2530 | ||
2531 | int udp_abort(struct sock *sk, int err) | 2531 | int udp_abort(struct sock *sk, int err) |
2532 | { | 2532 | { |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 8da0b513f188..d443c18b45fe 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -571,7 +571,7 @@ const struct proto_ops inet6_stream_ops = { | |||
571 | .socketpair = sock_no_socketpair, /* a do nothing */ | 571 | .socketpair = sock_no_socketpair, /* a do nothing */ |
572 | .accept = inet_accept, /* ok */ | 572 | .accept = inet_accept, /* ok */ |
573 | .getname = inet6_getname, | 573 | .getname = inet6_getname, |
574 | .poll = tcp_poll, /* ok */ | 574 | .poll_mask = tcp_poll_mask, /* ok */ |
575 | .ioctl = inet6_ioctl, /* must change */ | 575 | .ioctl = inet6_ioctl, /* must change */ |
576 | .listen = inet_listen, /* ok */ | 576 | .listen = inet_listen, /* ok */ |
577 | .shutdown = inet_shutdown, /* ok */ | 577 | .shutdown = inet_shutdown, /* ok */ |
@@ -601,7 +601,7 @@ const struct proto_ops inet6_dgram_ops = { | |||
601 | .socketpair = sock_no_socketpair, /* a do nothing */ | 601 | .socketpair = sock_no_socketpair, /* a do nothing */ |
602 | .accept = sock_no_accept, /* a do nothing */ | 602 | .accept = sock_no_accept, /* a do nothing */ |
603 | .getname = inet6_getname, | 603 | .getname = inet6_getname, |
604 | .poll = udp_poll, /* ok */ | 604 | .poll_mask = udp_poll_mask, /* ok */ |
605 | .ioctl = inet6_ioctl, /* must change */ | 605 | .ioctl = inet6_ioctl, /* must change */ |
606 | .listen = sock_no_listen, /* ok */ | 606 | .listen = sock_no_listen, /* ok */ |
607 | .shutdown = inet_shutdown, /* ok */ | 607 | .shutdown = inet_shutdown, /* ok */ |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index afc307c89d1a..ce6f0d15b5dd 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. */ | 1337 | /* Same as inet6_dgram_ops, sans udp_poll_mask. */ |
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 = datagram_poll, /* ok */ | 1347 | .poll_mask = datagram_poll_mask, /* 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 893a022f9620..68e86257a549 100644 --- a/net/iucv/af_iucv.c +++ b/net/iucv/af_iucv.c | |||
@@ -1488,14 +1488,11 @@ static inline __poll_t iucv_accept_poll(struct sock *parent) | |||
1488 | return 0; | 1488 | return 0; |
1489 | } | 1489 | } |
1490 | 1490 | ||
1491 | __poll_t iucv_sock_poll(struct file *file, struct socket *sock, | 1491 | static __poll_t iucv_sock_poll_mask(struct socket *sock, __poll_t events) |
1492 | poll_table *wait) | ||
1493 | { | 1492 | { |
1494 | struct sock *sk = sock->sk; | 1493 | struct sock *sk = sock->sk; |
1495 | __poll_t mask = 0; | 1494 | __poll_t mask = 0; |
1496 | 1495 | ||
1497 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
1498 | |||
1499 | if (sk->sk_state == IUCV_LISTEN) | 1496 | if (sk->sk_state == IUCV_LISTEN) |
1500 | return iucv_accept_poll(sk); | 1497 | return iucv_accept_poll(sk); |
1501 | 1498 | ||
@@ -2388,7 +2385,7 @@ static const struct proto_ops iucv_sock_ops = { | |||
2388 | .getname = iucv_sock_getname, | 2385 | .getname = iucv_sock_getname, |
2389 | .sendmsg = iucv_sock_sendmsg, | 2386 | .sendmsg = iucv_sock_sendmsg, |
2390 | .recvmsg = iucv_sock_recvmsg, | 2387 | .recvmsg = iucv_sock_recvmsg, |
2391 | .poll = iucv_sock_poll, | 2388 | .poll_mask = iucv_sock_poll_mask, |
2392 | .ioctl = sock_no_ioctl, | 2389 | .ioctl = sock_no_ioctl, |
2393 | .mmap = sock_no_mmap, | 2390 | .mmap = sock_no_mmap, |
2394 | .socketpair = sock_no_socketpair, | 2391 | .socketpair = sock_no_socketpair, |
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c index d3601d421571..84b7d5c6fec8 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 checks the sk_state, so | 1339 | /* For SOCK_SEQPACKET sock type, datagram_poll_mask checks the sk_state, |
1340 | * we set sk_state, otherwise epoll_wait always returns right away with | 1340 | * so we set sk_state, otherwise epoll_wait always returns right away |
1341 | * EPOLLHUP | 1341 | * with 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 = datagram_poll, | 1906 | .poll_mask = datagram_poll_mask, |
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 = datagram_poll, | 1927 | .poll_mask = datagram_poll_mask, |
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 5e1d2946ffbf..8bdc1cbe490a 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 = datagram_poll, | 3754 | .poll_mask = datagram_poll_mask, |
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 a9c05b2bc1b0..181073bf6925 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 = datagram_poll, | 616 | .poll_mask = datagram_poll_mask, |
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 957369192ca1..336e4c00abbc 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 = datagram_poll, | 757 | .poll_mask = datagram_poll_mask, |
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 830469766c1f..3d8ca1231f8f 100644 --- a/net/l2tp/l2tp_ppp.c +++ b/net/l2tp/l2tp_ppp.c | |||
@@ -1788,7 +1788,7 @@ static const struct proto_ops pppol2tp_ops = { | |||
1788 | .socketpair = sock_no_socketpair, | 1788 | .socketpair = sock_no_socketpair, |
1789 | .accept = sock_no_accept, | 1789 | .accept = sock_no_accept, |
1790 | .getname = pppol2tp_getname, | 1790 | .getname = pppol2tp_getname, |
1791 | .poll = datagram_poll, | 1791 | .poll_mask = datagram_poll_mask, |
1792 | .listen = sock_no_listen, | 1792 | .listen = sock_no_listen, |
1793 | .shutdown = sock_no_shutdown, | 1793 | .shutdown = sock_no_shutdown, |
1794 | .setsockopt = pppol2tp_setsockopt, | 1794 | .setsockopt = pppol2tp_setsockopt, |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 1beeea9549fa..804de8490186 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 = datagram_poll, | 1195 | .poll_mask = datagram_poll_mask, |
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 393573a99a5a..1189b84413d5 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 = datagram_poll, | 2661 | .poll_mask = datagram_poll_mask, |
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 c2888c78d4c1..b97eb766a1d5 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 = datagram_poll, | 1358 | .poll_mask = datagram_poll_mask, |
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 ea0c0c6f1874..ab5bb14b49af 100644 --- a/net/nfc/llcp_sock.c +++ b/net/nfc/llcp_sock.c | |||
@@ -548,16 +548,13 @@ 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(struct file *file, struct socket *sock, | 551 | static __poll_t llcp_sock_poll_mask(struct socket *sock, __poll_t events) |
552 | poll_table *wait) | ||
553 | { | 552 | { |
554 | struct sock *sk = sock->sk; | 553 | struct sock *sk = sock->sk; |
555 | __poll_t mask = 0; | 554 | __poll_t mask = 0; |
556 | 555 | ||
557 | pr_debug("%p\n", sk); | 556 | pr_debug("%p\n", sk); |
558 | 557 | ||
559 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
560 | |||
561 | if (sk->sk_state == LLCP_LISTEN) | 558 | if (sk->sk_state == LLCP_LISTEN) |
562 | return llcp_accept_poll(sk); | 559 | return llcp_accept_poll(sk); |
563 | 560 | ||
@@ -899,7 +896,7 @@ static const struct proto_ops llcp_sock_ops = { | |||
899 | .socketpair = sock_no_socketpair, | 896 | .socketpair = sock_no_socketpair, |
900 | .accept = llcp_sock_accept, | 897 | .accept = llcp_sock_accept, |
901 | .getname = llcp_sock_getname, | 898 | .getname = llcp_sock_getname, |
902 | .poll = llcp_sock_poll, | 899 | .poll_mask = llcp_sock_poll_mask, |
903 | .ioctl = sock_no_ioctl, | 900 | .ioctl = sock_no_ioctl, |
904 | .listen = llcp_sock_listen, | 901 | .listen = llcp_sock_listen, |
905 | .shutdown = sock_no_shutdown, | 902 | .shutdown = sock_no_shutdown, |
@@ -919,7 +916,7 @@ static const struct proto_ops llcp_rawsock_ops = { | |||
919 | .socketpair = sock_no_socketpair, | 916 | .socketpair = sock_no_socketpair, |
920 | .accept = sock_no_accept, | 917 | .accept = sock_no_accept, |
921 | .getname = llcp_sock_getname, | 918 | .getname = llcp_sock_getname, |
922 | .poll = llcp_sock_poll, | 919 | .poll_mask = llcp_sock_poll_mask, |
923 | .ioctl = sock_no_ioctl, | 920 | .ioctl = sock_no_ioctl, |
924 | .listen = sock_no_listen, | 921 | .listen = sock_no_listen, |
925 | .shutdown = sock_no_shutdown, | 922 | .shutdown = sock_no_shutdown, |
diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c index e2188deb08dc..60c322531c49 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 = datagram_poll, | 287 | .poll_mask = datagram_poll_mask, |
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 = datagram_poll, | 307 | .poll_mask = datagram_poll_mask, |
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 f9cdd27a7f6f..674390b1f084 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -4110,12 +4110,11 @@ static int packet_ioctl(struct socket *sock, unsigned int cmd, | |||
4110 | return 0; | 4110 | return 0; |
4111 | } | 4111 | } |
4112 | 4112 | ||
4113 | static __poll_t packet_poll(struct file *file, struct socket *sock, | 4113 | static __poll_t packet_poll_mask(struct socket *sock, __poll_t events) |
4114 | poll_table *wait) | ||
4115 | { | 4114 | { |
4116 | struct sock *sk = sock->sk; | 4115 | struct sock *sk = sock->sk; |
4117 | struct packet_sock *po = pkt_sk(sk); | 4116 | struct packet_sock *po = pkt_sk(sk); |
4118 | __poll_t mask = datagram_poll(file, sock, wait); | 4117 | __poll_t mask = datagram_poll_mask(sock, events); |
4119 | 4118 | ||
4120 | spin_lock_bh(&sk->sk_receive_queue.lock); | 4119 | spin_lock_bh(&sk->sk_receive_queue.lock); |
4121 | if (po->rx_ring.pg_vec) { | 4120 | if (po->rx_ring.pg_vec) { |
@@ -4457,7 +4456,7 @@ static const struct proto_ops packet_ops_spkt = { | |||
4457 | .socketpair = sock_no_socketpair, | 4456 | .socketpair = sock_no_socketpair, |
4458 | .accept = sock_no_accept, | 4457 | .accept = sock_no_accept, |
4459 | .getname = packet_getname_spkt, | 4458 | .getname = packet_getname_spkt, |
4460 | .poll = datagram_poll, | 4459 | .poll_mask = datagram_poll_mask, |
4461 | .ioctl = packet_ioctl, | 4460 | .ioctl = packet_ioctl, |
4462 | .listen = sock_no_listen, | 4461 | .listen = sock_no_listen, |
4463 | .shutdown = sock_no_shutdown, | 4462 | .shutdown = sock_no_shutdown, |
@@ -4478,7 +4477,7 @@ static const struct proto_ops packet_ops = { | |||
4478 | .socketpair = sock_no_socketpair, | 4477 | .socketpair = sock_no_socketpair, |
4479 | .accept = sock_no_accept, | 4478 | .accept = sock_no_accept, |
4480 | .getname = packet_getname, | 4479 | .getname = packet_getname, |
4481 | .poll = packet_poll, | 4480 | .poll_mask = packet_poll_mask, |
4482 | .ioctl = packet_ioctl, | 4481 | .ioctl = packet_ioctl, |
4483 | .listen = sock_no_listen, | 4482 | .listen = sock_no_listen, |
4484 | .shutdown = sock_no_shutdown, | 4483 | .shutdown = sock_no_shutdown, |
diff --git a/net/phonet/socket.c b/net/phonet/socket.c index 30187990257f..c295c4e20f01 100644 --- a/net/phonet/socket.c +++ b/net/phonet/socket.c | |||
@@ -340,15 +340,12 @@ 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(struct file *file, struct socket *sock, | 343 | static __poll_t pn_socket_poll_mask(struct socket *sock, __poll_t events) |
344 | poll_table *wait) | ||
345 | { | 344 | { |
346 | struct sock *sk = sock->sk; | 345 | struct sock *sk = sock->sk; |
347 | struct pep_sock *pn = pep_sk(sk); | 346 | struct pep_sock *pn = pep_sk(sk); |
348 | __poll_t mask = 0; | 347 | __poll_t mask = 0; |
349 | 348 | ||
350 | poll_wait(file, sk_sleep(sk), wait); | ||
351 | |||
352 | if (sk->sk_state == TCP_CLOSE) | 349 | if (sk->sk_state == TCP_CLOSE) |
353 | return EPOLLERR; | 350 | return EPOLLERR; |
354 | if (!skb_queue_empty(&sk->sk_receive_queue)) | 351 | if (!skb_queue_empty(&sk->sk_receive_queue)) |
@@ -448,7 +445,7 @@ const struct proto_ops phonet_dgram_ops = { | |||
448 | .socketpair = sock_no_socketpair, | 445 | .socketpair = sock_no_socketpair, |
449 | .accept = sock_no_accept, | 446 | .accept = sock_no_accept, |
450 | .getname = pn_socket_getname, | 447 | .getname = pn_socket_getname, |
451 | .poll = datagram_poll, | 448 | .poll_mask = datagram_poll_mask, |
452 | .ioctl = pn_socket_ioctl, | 449 | .ioctl = pn_socket_ioctl, |
453 | .listen = sock_no_listen, | 450 | .listen = sock_no_listen, |
454 | .shutdown = sock_no_shutdown, | 451 | .shutdown = sock_no_shutdown, |
@@ -473,7 +470,7 @@ const struct proto_ops phonet_stream_ops = { | |||
473 | .socketpair = sock_no_socketpair, | 470 | .socketpair = sock_no_socketpair, |
474 | .accept = pn_socket_accept, | 471 | .accept = pn_socket_accept, |
475 | .getname = pn_socket_getname, | 472 | .getname = pn_socket_getname, |
476 | .poll = pn_socket_poll, | 473 | .poll_mask = pn_socket_poll_mask, |
477 | .ioctl = pn_socket_ioctl, | 474 | .ioctl = pn_socket_ioctl, |
478 | .listen = pn_socket_listen, | 475 | .listen = pn_socket_listen, |
479 | .shutdown = sock_no_shutdown, | 476 | .shutdown = sock_no_shutdown, |
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index 2aa07b547b16..1b5025ea5b04 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 = datagram_poll, | 1026 | .poll_mask = datagram_poll_mask, |
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 22a7f2b413ac..5b73fea849df 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 = datagram_poll, | 1473 | .poll_mask = datagram_poll_mask, |
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 2b463047dd7b..3b1ac93efee2 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c | |||
@@ -734,15 +734,11 @@ 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(struct file *file, struct socket *sock, | 737 | static __poll_t rxrpc_poll_mask(struct socket *sock, __poll_t events) |
738 | poll_table *wait) | ||
739 | { | 738 | { |
740 | struct sock *sk = sock->sk; | 739 | struct sock *sk = sock->sk; |
741 | struct rxrpc_sock *rx = rxrpc_sk(sk); | 740 | struct rxrpc_sock *rx = rxrpc_sk(sk); |
742 | __poll_t mask; | 741 | __poll_t mask = 0; |
743 | |||
744 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
745 | mask = 0; | ||
746 | 742 | ||
747 | /* the socket is readable if there are any messages waiting on the Rx | 743 | /* the socket is readable if there are any messages waiting on the Rx |
748 | * queue */ | 744 | * queue */ |
@@ -949,7 +945,7 @@ static const struct proto_ops rxrpc_rpc_ops = { | |||
949 | .socketpair = sock_no_socketpair, | 945 | .socketpair = sock_no_socketpair, |
950 | .accept = sock_no_accept, | 946 | .accept = sock_no_accept, |
951 | .getname = sock_no_getname, | 947 | .getname = sock_no_getname, |
952 | .poll = rxrpc_poll, | 948 | .poll_mask = rxrpc_poll_mask, |
953 | .ioctl = sock_no_ioctl, | 949 | .ioctl = sock_no_ioctl, |
954 | .listen = rxrpc_listen, | 950 | .listen = rxrpc_listen, |
955 | .shutdown = rxrpc_shutdown, | 951 | .shutdown = rxrpc_shutdown, |
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index 0cd2e764f47f..7339918a805d 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 = sctp_poll, | 1013 | .poll_mask = sctp_poll_mask, |
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 6bf0a9971888..11d93377ba5e 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 = sctp_poll, | 1019 | .poll_mask = sctp_poll_mask, |
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 ae7e7c606f72..bf747094d26b 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -7722,14 +7722,12 @@ out: | |||
7722 | * here, again, by modeling the current TCP/UDP code. We don't have | 7722 | * here, again, by modeling the current TCP/UDP code. We don't have |
7723 | * a good way to test with it yet. | 7723 | * a good way to test with it yet. |
7724 | */ | 7724 | */ |
7725 | __poll_t sctp_poll(struct file *file, struct socket *sock, poll_table *wait) | 7725 | __poll_t sctp_poll_mask(struct socket *sock, __poll_t events) |
7726 | { | 7726 | { |
7727 | struct sock *sk = sock->sk; | 7727 | struct sock *sk = sock->sk; |
7728 | struct sctp_sock *sp = sctp_sk(sk); | 7728 | struct sctp_sock *sp = sctp_sk(sk); |
7729 | __poll_t mask; | 7729 | __poll_t mask; |
7730 | 7730 | ||
7731 | poll_wait(file, sk_sleep(sk), wait); | ||
7732 | |||
7733 | sock_rps_record_flow(sk); | 7731 | sock_rps_record_flow(sk); |
7734 | 7732 | ||
7735 | /* A TCP-style listening socket becomes readable when the accept queue | 7733 | /* A TCP-style listening socket becomes readable when the accept queue |
diff --git a/net/socket.c b/net/socket.c index f10f1d947c78..2d752e9eb3f9 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -117,8 +117,10 @@ 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 __poll_t sock_poll(struct file *file, | 120 | static struct wait_queue_head *sock_get_poll_head(struct file *file, |
121 | struct poll_table_struct *wait); | 121 | __poll_t events); |
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); | ||
122 | static long sock_ioctl(struct file *file, unsigned int cmd, unsigned long arg); | 124 | static long sock_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
123 | #ifdef CONFIG_COMPAT | 125 | #ifdef CONFIG_COMPAT |
124 | static long compat_sock_ioctl(struct file *file, | 126 | static long compat_sock_ioctl(struct file *file, |
@@ -141,6 +143,8 @@ static const struct file_operations socket_file_ops = { | |||
141 | .llseek = no_llseek, | 143 | .llseek = no_llseek, |
142 | .read_iter = sock_read_iter, | 144 | .read_iter = sock_read_iter, |
143 | .write_iter = sock_write_iter, | 145 | .write_iter = sock_write_iter, |
146 | .get_poll_head = sock_get_poll_head, | ||
147 | .poll_mask = sock_poll_mask, | ||
144 | .poll = sock_poll, | 148 | .poll = sock_poll, |
145 | .unlocked_ioctl = sock_ioctl, | 149 | .unlocked_ioctl = sock_ioctl, |
146 | #ifdef CONFIG_COMPAT | 150 | #ifdef CONFIG_COMPAT |
@@ -1114,27 +1118,48 @@ out_release: | |||
1114 | } | 1118 | } |
1115 | EXPORT_SYMBOL(sock_create_lite); | 1119 | EXPORT_SYMBOL(sock_create_lite); |
1116 | 1120 | ||
1117 | /* No kernel lock held - perfect */ | 1121 | static struct wait_queue_head *sock_get_poll_head(struct file *file, |
1118 | static __poll_t sock_poll(struct file *file, poll_table *wait) | 1122 | __poll_t events) |
1119 | { | 1123 | { |
1120 | __poll_t busy_flag = 0; | 1124 | struct socket *sock = file->private_data; |
1121 | struct socket *sock; | 1125 | |
1126 | if (!sock->ops->poll_mask) | ||
1127 | return NULL; | ||
1128 | sock_poll_busy_loop(sock, events); | ||
1129 | return sk_sleep(sock->sk); | ||
1130 | } | ||
1131 | |||
1132 | static __poll_t sock_poll_mask(struct file *file, __poll_t events) | ||
1133 | { | ||
1134 | struct socket *sock = file->private_data; | ||
1122 | 1135 | ||
1123 | /* | 1136 | /* |
1124 | * We can't return errors to poll, so it's either yes or no. | 1137 | * We need to be sure we are in sync with the socket flags modification. |
1138 | * | ||
1139 | * This memory barrier is paired in the wq_has_sleeper. | ||
1125 | */ | 1140 | */ |
1126 | sock = file->private_data; | 1141 | smp_mb(); |
1142 | |||
1143 | /* this socket can poll_ll so tell the system call */ | ||
1144 | return sock->ops->poll_mask(sock, events) | | ||
1145 | (sk_can_busy_loop(sock->sk) ? POLL_BUSY_LOOP : 0); | ||
1146 | } | ||
1127 | 1147 | ||
1128 | if (sk_can_busy_loop(sock->sk)) { | 1148 | /* No kernel lock held - perfect */ |
1129 | /* this socket can poll_ll so tell the system call */ | 1149 | static __poll_t sock_poll(struct file *file, poll_table *wait) |
1130 | busy_flag = POLL_BUSY_LOOP; | 1150 | { |
1151 | struct socket *sock = file->private_data; | ||
1152 | __poll_t events = poll_requested_events(wait), mask = 0; | ||
1131 | 1153 | ||
1132 | /* once, only if requested by syscall */ | 1154 | if (sock->ops->poll) { |
1133 | if (wait && (wait->_key & POLL_BUSY_LOOP)) | 1155 | sock_poll_busy_loop(sock, events); |
1134 | sk_busy_loop(sock->sk, 1); | 1156 | mask = sock->ops->poll(file, sock, wait); |
1157 | } else if (sock->ops->poll_mask) { | ||
1158 | sock_poll_wait(file, sock_get_poll_head(file, events), wait); | ||
1159 | mask = sock->ops->poll_mask(sock, events); | ||
1135 | } | 1160 | } |
1136 | 1161 | ||
1137 | return busy_flag | sock->ops->poll(file, sock, wait); | 1162 | return mask | sock_poll_busy_flag(sock); |
1138 | } | 1163 | } |
1139 | 1164 | ||
1140 | static int sock_mmap(struct file *file, struct vm_area_struct *vma) | 1165 | 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 6be21575503a..3bb45042e833 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -692,10 +692,9 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr, | |||
692 | } | 692 | } |
693 | 693 | ||
694 | /** | 694 | /** |
695 | * tipc_poll - read and possibly block on pollmask | 695 | * tipc_poll - read 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: ??? | ||
699 | * | 698 | * |
700 | * Returns pollmask value | 699 | * Returns pollmask value |
701 | * | 700 | * |
@@ -709,15 +708,12 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr, | |||
709 | * imply that the operation will succeed, merely that it should be performed | 708 | * imply that the operation will succeed, merely that it should be performed |
710 | * and will not block. | 709 | * and will not block. |
711 | */ | 710 | */ |
712 | static __poll_t tipc_poll(struct file *file, struct socket *sock, | 711 | static __poll_t tipc_poll_mask(struct socket *sock, __poll_t events) |
713 | poll_table *wait) | ||
714 | { | 712 | { |
715 | struct sock *sk = sock->sk; | 713 | struct sock *sk = sock->sk; |
716 | struct tipc_sock *tsk = tipc_sk(sk); | 714 | struct tipc_sock *tsk = tipc_sk(sk); |
717 | __poll_t revents = 0; | 715 | __poll_t revents = 0; |
718 | 716 | ||
719 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
720 | |||
721 | if (sk->sk_shutdown & RCV_SHUTDOWN) | 717 | if (sk->sk_shutdown & RCV_SHUTDOWN) |
722 | revents |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM; | 718 | revents |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM; |
723 | if (sk->sk_shutdown == SHUTDOWN_MASK) | 719 | if (sk->sk_shutdown == SHUTDOWN_MASK) |
@@ -3028,7 +3024,7 @@ static const struct proto_ops msg_ops = { | |||
3028 | .socketpair = tipc_socketpair, | 3024 | .socketpair = tipc_socketpair, |
3029 | .accept = sock_no_accept, | 3025 | .accept = sock_no_accept, |
3030 | .getname = tipc_getname, | 3026 | .getname = tipc_getname, |
3031 | .poll = tipc_poll, | 3027 | .poll_mask = tipc_poll_mask, |
3032 | .ioctl = tipc_ioctl, | 3028 | .ioctl = tipc_ioctl, |
3033 | .listen = sock_no_listen, | 3029 | .listen = sock_no_listen, |
3034 | .shutdown = tipc_shutdown, | 3030 | .shutdown = tipc_shutdown, |
@@ -3049,7 +3045,7 @@ static const struct proto_ops packet_ops = { | |||
3049 | .socketpair = tipc_socketpair, | 3045 | .socketpair = tipc_socketpair, |
3050 | .accept = tipc_accept, | 3046 | .accept = tipc_accept, |
3051 | .getname = tipc_getname, | 3047 | .getname = tipc_getname, |
3052 | .poll = tipc_poll, | 3048 | .poll_mask = tipc_poll_mask, |
3053 | .ioctl = tipc_ioctl, | 3049 | .ioctl = tipc_ioctl, |
3054 | .listen = tipc_listen, | 3050 | .listen = tipc_listen, |
3055 | .shutdown = tipc_shutdown, | 3051 | .shutdown = tipc_shutdown, |
@@ -3070,7 +3066,7 @@ static const struct proto_ops stream_ops = { | |||
3070 | .socketpair = tipc_socketpair, | 3066 | .socketpair = tipc_socketpair, |
3071 | .accept = tipc_accept, | 3067 | .accept = tipc_accept, |
3072 | .getname = tipc_getname, | 3068 | .getname = tipc_getname, |
3073 | .poll = tipc_poll, | 3069 | .poll_mask = tipc_poll_mask, |
3074 | .ioctl = tipc_ioctl, | 3070 | .ioctl = tipc_ioctl, |
3075 | .listen = tipc_listen, | 3071 | .listen = tipc_listen, |
3076 | .shutdown = tipc_shutdown, | 3072 | .shutdown = tipc_shutdown, |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index e5473c03d667..95b02a71fd47 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -638,9 +638,8 @@ 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(struct file *, struct socket *, poll_table *); | 641 | static __poll_t unix_poll_mask(struct socket *, __poll_t); |
642 | static __poll_t unix_dgram_poll(struct file *, struct socket *, | 642 | static __poll_t unix_dgram_poll_mask(struct socket *, __poll_t); |
643 | poll_table *); | ||
644 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); | 643 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); |
645 | static int unix_shutdown(struct socket *, int); | 644 | static int unix_shutdown(struct socket *, int); |
646 | static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t); | 645 | static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t); |
@@ -681,7 +680,7 @@ static const struct proto_ops unix_stream_ops = { | |||
681 | .socketpair = unix_socketpair, | 680 | .socketpair = unix_socketpair, |
682 | .accept = unix_accept, | 681 | .accept = unix_accept, |
683 | .getname = unix_getname, | 682 | .getname = unix_getname, |
684 | .poll = unix_poll, | 683 | .poll_mask = unix_poll_mask, |
685 | .ioctl = unix_ioctl, | 684 | .ioctl = unix_ioctl, |
686 | .listen = unix_listen, | 685 | .listen = unix_listen, |
687 | .shutdown = unix_shutdown, | 686 | .shutdown = unix_shutdown, |
@@ -704,7 +703,7 @@ static const struct proto_ops unix_dgram_ops = { | |||
704 | .socketpair = unix_socketpair, | 703 | .socketpair = unix_socketpair, |
705 | .accept = sock_no_accept, | 704 | .accept = sock_no_accept, |
706 | .getname = unix_getname, | 705 | .getname = unix_getname, |
707 | .poll = unix_dgram_poll, | 706 | .poll_mask = unix_dgram_poll_mask, |
708 | .ioctl = unix_ioctl, | 707 | .ioctl = unix_ioctl, |
709 | .listen = sock_no_listen, | 708 | .listen = sock_no_listen, |
710 | .shutdown = unix_shutdown, | 709 | .shutdown = unix_shutdown, |
@@ -726,7 +725,7 @@ static const struct proto_ops unix_seqpacket_ops = { | |||
726 | .socketpair = unix_socketpair, | 725 | .socketpair = unix_socketpair, |
727 | .accept = unix_accept, | 726 | .accept = unix_accept, |
728 | .getname = unix_getname, | 727 | .getname = unix_getname, |
729 | .poll = unix_dgram_poll, | 728 | .poll_mask = unix_dgram_poll_mask, |
730 | .ioctl = unix_ioctl, | 729 | .ioctl = unix_ioctl, |
731 | .listen = unix_listen, | 730 | .listen = unix_listen, |
732 | .shutdown = unix_shutdown, | 731 | .shutdown = unix_shutdown, |
@@ -2630,13 +2629,10 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
2630 | return err; | 2629 | return err; |
2631 | } | 2630 | } |
2632 | 2631 | ||
2633 | static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wait) | 2632 | static __poll_t unix_poll_mask(struct socket *sock, __poll_t events) |
2634 | { | 2633 | { |
2635 | struct sock *sk = sock->sk; | 2634 | struct sock *sk = sock->sk; |
2636 | __poll_t mask; | 2635 | __poll_t mask = 0; |
2637 | |||
2638 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
2639 | mask = 0; | ||
2640 | 2636 | ||
2641 | /* exceptional events? */ | 2637 | /* exceptional events? */ |
2642 | if (sk->sk_err) | 2638 | if (sk->sk_err) |
@@ -2665,15 +2661,11 @@ static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wa | |||
2665 | return mask; | 2661 | return mask; |
2666 | } | 2662 | } |
2667 | 2663 | ||
2668 | static __poll_t unix_dgram_poll(struct file *file, struct socket *sock, | 2664 | static __poll_t unix_dgram_poll_mask(struct socket *sock, __poll_t events) |
2669 | poll_table *wait) | ||
2670 | { | 2665 | { |
2671 | struct sock *sk = sock->sk, *other; | 2666 | struct sock *sk = sock->sk, *other; |
2672 | unsigned int writable; | 2667 | int writable; |
2673 | __poll_t mask; | 2668 | __poll_t mask = 0; |
2674 | |||
2675 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
2676 | mask = 0; | ||
2677 | 2669 | ||
2678 | /* exceptional events? */ | 2670 | /* exceptional events? */ |
2679 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) | 2671 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) |
@@ -2699,7 +2691,7 @@ static __poll_t unix_dgram_poll(struct file *file, struct socket *sock, | |||
2699 | } | 2691 | } |
2700 | 2692 | ||
2701 | /* No write status requested, avoid expensive OUT tests. */ | 2693 | /* No write status requested, avoid expensive OUT tests. */ |
2702 | if (!(poll_requested_events(wait) & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT))) | 2694 | if (!(events & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT))) |
2703 | return mask; | 2695 | return mask; |
2704 | 2696 | ||
2705 | writable = unix_writable(sk); | 2697 | writable = unix_writable(sk); |
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index c1076c19b858..bb5d5fa68c35 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c | |||
@@ -850,18 +850,11 @@ 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(struct file *file, struct socket *sock, | 853 | static __poll_t vsock_poll_mask(struct socket *sock, __poll_t events) |
854 | poll_table *wait) | ||
855 | { | 854 | { |
856 | struct sock *sk; | 855 | struct sock *sk = sock->sk; |
857 | __poll_t mask; | 856 | struct vsock_sock *vsk = vsock_sk(sk); |
858 | struct vsock_sock *vsk; | 857 | __poll_t mask = 0; |
859 | |||
860 | sk = sock->sk; | ||
861 | vsk = vsock_sk(sk); | ||
862 | |||
863 | poll_wait(file, sk_sleep(sk), wait); | ||
864 | mask = 0; | ||
865 | 858 | ||
866 | if (sk->sk_err) | 859 | if (sk->sk_err) |
867 | /* Signify that there has been an error on this socket. */ | 860 | /* Signify that there has been an error on this socket. */ |
@@ -1091,7 +1084,7 @@ static const struct proto_ops vsock_dgram_ops = { | |||
1091 | .socketpair = sock_no_socketpair, | 1084 | .socketpair = sock_no_socketpair, |
1092 | .accept = sock_no_accept, | 1085 | .accept = sock_no_accept, |
1093 | .getname = vsock_getname, | 1086 | .getname = vsock_getname, |
1094 | .poll = vsock_poll, | 1087 | .poll_mask = vsock_poll_mask, |
1095 | .ioctl = sock_no_ioctl, | 1088 | .ioctl = sock_no_ioctl, |
1096 | .listen = sock_no_listen, | 1089 | .listen = sock_no_listen, |
1097 | .shutdown = vsock_shutdown, | 1090 | .shutdown = vsock_shutdown, |
@@ -1849,7 +1842,7 @@ static const struct proto_ops vsock_stream_ops = { | |||
1849 | .socketpair = sock_no_socketpair, | 1842 | .socketpair = sock_no_socketpair, |
1850 | .accept = vsock_accept, | 1843 | .accept = vsock_accept, |
1851 | .getname = vsock_getname, | 1844 | .getname = vsock_getname, |
1852 | .poll = vsock_poll, | 1845 | .poll_mask = vsock_poll_mask, |
1853 | .ioctl = sock_no_ioctl, | 1846 | .ioctl = sock_no_ioctl, |
1854 | .listen = vsock_listen, | 1847 | .listen = vsock_listen, |
1855 | .shutdown = vsock_shutdown, | 1848 | .shutdown = vsock_shutdown, |
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c index d49aa79b7997..f93365ae0fdd 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 = datagram_poll, | 1753 | .poll_mask = datagram_poll_mask, |
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/virt/kvm/eventfd.c b/virt/kvm/eventfd.c index 6e865e8b5b10..90d30fbe95ae 100644 --- a/virt/kvm/eventfd.c +++ b/virt/kvm/eventfd.c | |||
@@ -397,7 +397,7 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args) | |||
397 | * Check if there was an event already pending on the eventfd | 397 | * Check if there was an event already pending on the eventfd |
398 | * before we registered, and trigger it as if we didn't miss it. | 398 | * before we registered, and trigger it as if we didn't miss it. |
399 | */ | 399 | */ |
400 | events = f.file->f_op->poll(f.file, &irqfd->pt); | 400 | events = vfs_poll(f.file, &irqfd->pt); |
401 | 401 | ||
402 | if (events & EPOLLIN) | 402 | if (events & EPOLLIN) |
403 | schedule_work(&irqfd->inject); | 403 | schedule_work(&irqfd->inject); |