]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
tipc: add SO_RCVLOWAT support to stream socket receive path
authorFlorian Westphal <fw@strlen.de>
Tue, 17 Aug 2010 11:00:04 +0000 (11:00 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 Aug 2010 00:31:51 +0000 (17:31 -0700)
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>
net/tipc/socket.c

index 66e889ba48fd4d61088bd6e3f5e0721d7348d20b..69d0fd1f39205cfcd8d98b5c3918c0e288db1f6a 100644 (file)
@@ -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;