summaryrefslogtreecommitdiff
path: root/net/tipc
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2010-08-17 11:00:04 +0000
committerDavid S. Miller <davem@davemloft.net>2010-08-17 17:31:51 -0700
commit3720d40b201fe82dce1d8a64a31bfbf49c221771 (patch)
treef20f2d614a0949b25a27004ecf9abe7c8dd6794d /net/tipc
parentf81380925209bc60732a57eef41ab440c056aacf (diff)
downloadlinux-3.10-3720d40b201fe82dce1d8a64a31bfbf49c221771.tar.gz
linux-3.10-3720d40b201fe82dce1d8a64a31bfbf49c221771.tar.bz2
linux-3.10-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')
-rw-r--r--net/tipc/socket.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 66e889ba48f..69d0fd1f392 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;