diff options
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/net/socket.c b/net/socket.c index 769c386bd428..35bc198bbf68 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -87,6 +87,7 @@ | |||
87 | #include <linux/wireless.h> | 87 | #include <linux/wireless.h> |
88 | #include <linux/nsproxy.h> | 88 | #include <linux/nsproxy.h> |
89 | #include <linux/magic.h> | 89 | #include <linux/magic.h> |
90 | #include <linux/slab.h> | ||
90 | 91 | ||
91 | #include <asm/uaccess.h> | 92 | #include <asm/uaccess.h> |
92 | #include <asm/unistd.h> | 93 | #include <asm/unistd.h> |
@@ -619,10 +620,9 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, | |||
619 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP, | 620 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP, |
620 | sizeof(tv), &tv); | 621 | sizeof(tv), &tv); |
621 | } else { | 622 | } else { |
622 | struct timespec ts; | 623 | skb_get_timestampns(skb, &ts[0]); |
623 | skb_get_timestampns(skb, &ts); | ||
624 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS, | 624 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS, |
625 | sizeof(ts), &ts); | 625 | sizeof(ts[0]), &ts[0]); |
626 | } | 626 | } |
627 | } | 627 | } |
628 | 628 | ||
@@ -2135,6 +2135,10 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
2135 | break; | 2135 | break; |
2136 | ++datagrams; | 2136 | ++datagrams; |
2137 | 2137 | ||
2138 | /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */ | ||
2139 | if (flags & MSG_WAITFORONE) | ||
2140 | flags |= MSG_DONTWAIT; | ||
2141 | |||
2138 | if (timeout) { | 2142 | if (timeout) { |
2139 | ktime_get_ts(timeout); | 2143 | ktime_get_ts(timeout); |
2140 | *timeout = timespec_sub(end_time, *timeout); | 2144 | *timeout = timespec_sub(end_time, *timeout); |