aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c25
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
1061int sock_wake_async(struct socket *sock, int how, int band) 1062int 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}
1092EXPORT_SYMBOL(sock_wake_async); 1086EXPORT_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
2246out_put: 2243out_put: