summaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp.c
diff options
context:
space:
mode:
authorJens Axboe <jens.axboe@oracle.com>2007-06-23 23:07:50 -0700
committerDavid S. Miller <davem@davemloft.net>2007-06-23 23:07:50 -0700
commitddb61a57bb6df673986e6476407f97d28b02031f (patch)
tree1e7faaddbb0fa96d5fec64e15140a697c0cfd5eb /net/ipv4/tcp.c
parent4b2a8fb3a7f7935f62a7bbdc851789fb7c2da032 (diff)
downloadlinux-ddb61a57bb6df673986e6476407f97d28b02031f.tar.gz
linux-ddb61a57bb6df673986e6476407f97d28b02031f.tar.bz2
linux-ddb61a57bb6df673986e6476407f97d28b02031f.zip
[TCP] tcp_read_sock: Allow recv_actor() return return negative error value.
tcp_read_sock() currently assumes that the recv_actor() only returns number of bytes copied. For network splice receive, we may have to return an error in some cases. So allow the actor to return a negative error value. Signed-off-by: Jens Axboe <jens.axboe@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp.c')
-rw-r--r--net/ipv4/tcp.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index cd3c7e95de9e..450f44bb2c8e 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1064,7 +1064,11 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
break;
}
used = recv_actor(desc, skb, offset, len);
- if (used <= len) {
+ if (used < 0) {
+ if (!copied)
+ copied = used;
+ break;
+ } else if (used <= len) {
seq += used;
copied += used;
offset += used;
@@ -1086,7 +1090,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
tcp_rcv_space_adjust(sk);
/* Clean up data we have read: This will do ACK frames. */
- if (copied)
+ if (copied > 0)
tcp_cleanup_rbuf(sk, copied);
return copied;
}