diff options
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/net/socket.c b/net/socket.c index dd2c247c99e3..91c2de6f5020 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -257,6 +257,7 @@ static struct inode *sock_alloc_inode(struct super_block *sb) | |||
257 | } | 257 | } |
258 | init_waitqueue_head(&wq->wait); | 258 | init_waitqueue_head(&wq->wait); |
259 | wq->fasync_list = NULL; | 259 | wq->fasync_list = NULL; |
260 | wq->flags = 0; | ||
260 | RCU_INIT_POINTER(ei->socket.wq, wq); | 261 | RCU_INIT_POINTER(ei->socket.wq, wq); |
261 | 262 | ||
262 | ei->socket.state = SS_UNCONNECTED; | 263 | ei->socket.state = SS_UNCONNECTED; |
@@ -1056,27 +1057,20 @@ static int sock_fasync(int fd, struct file *filp, int on) | |||
1056 | return 0; | 1057 | return 0; |
1057 | } | 1058 | } |
1058 | 1059 | ||
1059 | /* This function may be called only under socket lock or callback_lock or rcu_lock */ | 1060 | /* This function may be called only under rcu_lock */ |
1060 | 1061 | ||
1061 | int sock_wake_async(struct socket *sock, int how, int band) | 1062 | int sock_wake_async(struct socket_wq *wq, int how, int band) |
1062 | { | 1063 | { |
1063 | struct socket_wq *wq; | 1064 | if (!wq || !wq->fasync_list) |
1064 | |||
1065 | if (!sock) | ||
1066 | return -1; | ||
1067 | rcu_read_lock(); | ||
1068 | wq = rcu_dereference(sock->wq); | ||
1069 | if (!wq || !wq->fasync_list) { | ||
1070 | rcu_read_unlock(); | ||
1071 | return -1; | 1065 | return -1; |
1072 | } | 1066 | |
1073 | switch (how) { | 1067 | switch (how) { |
1074 | case SOCK_WAKE_WAITD: | 1068 | case SOCK_WAKE_WAITD: |
1075 | if (test_bit(SOCK_ASYNC_WAITDATA, &sock->flags)) | 1069 | if (test_bit(SOCKWQ_ASYNC_WAITDATA, &wq->flags)) |
1076 | break; | 1070 | break; |
1077 | goto call_kill; | 1071 | goto call_kill; |
1078 | case SOCK_WAKE_SPACE: | 1072 | case SOCK_WAKE_SPACE: |
1079 | if (!test_and_clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags)) | 1073 | if (!test_and_clear_bit(SOCKWQ_ASYNC_NOSPACE, &wq->flags)) |
1080 | break; | 1074 | break; |
1081 | /* fall through */ | 1075 | /* fall through */ |
1082 | case SOCK_WAKE_IO: | 1076 | case SOCK_WAKE_IO: |
@@ -1086,7 +1080,7 @@ call_kill: | |||
1086 | case SOCK_WAKE_URG: | 1080 | case SOCK_WAKE_URG: |
1087 | kill_fasync(&wq->fasync_list, SIGURG, band); | 1081 | kill_fasync(&wq->fasync_list, SIGURG, band); |
1088 | } | 1082 | } |
1089 | rcu_read_unlock(); | 1083 | |
1090 | return 0; | 1084 | return 0; |
1091 | } | 1085 | } |
1092 | EXPORT_SYMBOL(sock_wake_async); | 1086 | EXPORT_SYMBOL(sock_wake_async); |
@@ -1702,6 +1696,7 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size, | |||
1702 | msg.msg_name = addr ? (struct sockaddr *)&address : NULL; | 1696 | msg.msg_name = addr ? (struct sockaddr *)&address : NULL; |
1703 | /* We assume all kernel code knows the size of sockaddr_storage */ | 1697 | /* We assume all kernel code knows the size of sockaddr_storage */ |
1704 | msg.msg_namelen = 0; | 1698 | msg.msg_namelen = 0; |
1699 | msg.msg_iocb = NULL; | ||
1705 | if (sock->file->f_flags & O_NONBLOCK) | 1700 | if (sock->file->f_flags & O_NONBLOCK) |
1706 | flags |= MSG_DONTWAIT; | 1701 | flags |= MSG_DONTWAIT; |
1707 | err = sock_recvmsg(sock, &msg, iov_iter_count(&msg.msg_iter), flags); | 1702 | err = sock_recvmsg(sock, &msg, iov_iter_count(&msg.msg_iter), flags); |
@@ -2046,6 +2041,7 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
2046 | if (err) | 2041 | if (err) |
2047 | break; | 2042 | break; |
2048 | ++datagrams; | 2043 | ++datagrams; |
2044 | cond_resched(); | ||
2049 | } | 2045 | } |
2050 | 2046 | ||
2051 | fput_light(sock->file, fput_needed); | 2047 | fput_light(sock->file, fput_needed); |
@@ -2241,6 +2237,7 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
2241 | /* Out of band data, return right away */ | 2237 | /* Out of band data, return right away */ |
2242 | if (msg_sys.msg_flags & MSG_OOB) | 2238 | if (msg_sys.msg_flags & MSG_OOB) |
2243 | break; | 2239 | break; |
2240 | cond_resched(); | ||
2244 | } | 2241 | } |
2245 | 2242 | ||
2246 | out_put: | 2243 | out_put: |