| From db76deb171d8ba2e30ab4928863d1ac59b186f97 Mon Sep 17 00:00:00 2001 |
| From: Lennert Buytenhek <buytenh@marvell.com> |
| Date: Tue, 20 Jan 2009 15:25:21 -0800 |
| Subject: tcp: don't mask EOF and socket errors on nonblocking splice receive |
| |
| From: Lennert Buytenhek <buytenh@marvell.com> |
| |
| [ Upstream commit: 4f7d54f59bc470f0aaa932f747a95232d7ebf8b1 ] |
| |
| Currently, setting SPLICE_F_NONBLOCK on splice from a TCP socket |
| results in masking of EOF (RDHUP) and error conditions on the socket |
| by an -EAGAIN return. Move the NONBLOCK check in tcp_splice_read() |
| to be after the EOF and error checks to fix this. |
| |
| Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| net/ipv4/tcp.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/net/ipv4/tcp.c |
| +++ b/net/ipv4/tcp.c |
| @@ -576,10 +576,6 @@ ssize_t tcp_splice_read(struct socket *s |
| else if (!ret) { |
| if (spliced) |
| break; |
| - if (flags & SPLICE_F_NONBLOCK) { |
| - ret = -EAGAIN; |
| - break; |
| - } |
| if (sock_flag(sk, SOCK_DONE)) |
| break; |
| if (sk->sk_err) { |
| @@ -597,6 +593,10 @@ ssize_t tcp_splice_read(struct socket *s |
| ret = -ENOTCONN; |
| break; |
| } |
| + if (flags & SPLICE_F_NONBLOCK) { |
| + ret = -EAGAIN; |
| + break; |
| + } |
| if (!timeo) { |
| ret = -EAGAIN; |
| break; |