Pārlūkot izejas kodu

[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>
Jens Axboe 18 gadi atpakaļ
vecāks
revīzija
ddb61a57bb
1 mainītis faili ar 6 papildinājumiem un 2 dzēšanām
  1. 6 2
      net/ipv4/tcp.c

+ 6 - 2
net/ipv4/tcp.c

@@ -1064,7 +1064,11 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
 					break;
 					break;
 			}
 			}
 			used = recv_actor(desc, skb, offset, len);
 			used = recv_actor(desc, skb, offset, len);
-			if (used <= len) {
+			if (used < 0) {
+				if (!copied)
+					copied = used;
+				break;
+			} else if (used <= len) {
 				seq += used;
 				seq += used;
 				copied += used;
 				copied += used;
 				offset += used;
 				offset += used;
@@ -1086,7 +1090,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
 	tcp_rcv_space_adjust(sk);
 	tcp_rcv_space_adjust(sk);
 
 
 	/* Clean up data we have read: This will do ACK frames. */
 	/* Clean up data we have read: This will do ACK frames. */
-	if (copied)
+	if (copied > 0)
 		tcp_cleanup_rbuf(sk, copied);
 		tcp_cleanup_rbuf(sk, copied);
 	return copied;
 	return copied;
 }
 }