diff options
author | Florian Westphal <fw@strlen.de> | 2010-08-17 13:00:04 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-08-18 02:31:51 +0200 |
commit | 3720d40b201fe82dce1d8a64a31bfbf49c221771 (patch) | |
tree | f20f2d614a0949b25a27004ecf9abe7c8dd6794d /net/tipc/socket.c | |
parent | tipc: Fix log buffer memory leak if initialization fails (diff) | |
download | linux-3720d40b201fe82dce1d8a64a31bfbf49c221771.tar.xz linux-3720d40b201fe82dce1d8a64a31bfbf49c221771.zip |
tipc: add SO_RCVLOWAT support to stream socket receive path
Add support for the SO_RCVLOWAT socket option to TIPC's stream socket
type.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r-- | net/tipc/socket.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 66e889ba48fd..69d0fd1f3920 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -1026,9 +1026,8 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock, struct sk_buff *buf; struct tipc_msg *msg; unsigned int sz; - int sz_to_copy; + int sz_to_copy, target, needed; int sz_copied = 0; - int needed; char __user *crs = m->msg_iov->iov_base; unsigned char *buf_crs; u32 err; @@ -1050,6 +1049,8 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock, goto exit; } + target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len); + restart: /* Look for a message in receive queue; wait if necessary */ @@ -1138,7 +1139,7 @@ restart: if ((sz_copied < buf_len) && /* didn't get all requested data */ (!skb_queue_empty(&sk->sk_receive_queue) || - (flags & MSG_WAITALL)) && /* and more is ready or required */ + (sz_copied < target)) && /* and more is ready or required */ (!(flags & MSG_PEEK)) && /* and aren't just peeking at data */ (!err)) /* and haven't reached a FIN */ goto restart; |