| From foo@baz Mon May 16 11:20:33 PDT 2016 |
| From: Ian Campbell <ian.campbell@docker.com> |
| Date: Wed, 4 May 2016 14:21:53 +0100 |
| Subject: VSOCK: do not disconnect socket when peer has shutdown SEND only |
| |
| From: Ian Campbell <ian.campbell@docker.com> |
| |
| [ Upstream commit dedc58e067d8c379a15a8a183c5db318201295bb ] |
| |
| The peer may be expecting a reply having sent a request and then done a |
| shutdown(SHUT_WR), so tearing down the whole socket at this point seems |
| wrong and breaks for me with a client which does a SHUT_WR. |
| |
| Looking at other socket family's stream_recvmsg callbacks doing a shutdown |
| here does not seem to be the norm and removing it does not seem to have |
| had any adverse effects that I can see. |
| |
| I'm using Stefan's RFC virtio transport patches, I'm unsure of the impact |
| on the vmci transport. |
| |
| Signed-off-by: Ian Campbell <ian.campbell@docker.com> |
| Cc: "David S. Miller" <davem@davemloft.net> |
| Cc: Stefan Hajnoczi <stefanha@redhat.com> |
| Cc: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> |
| Cc: Andy King <acking@vmware.com> |
| Cc: Dmitry Torokhov <dtor@vmware.com> |
| Cc: Jorgen Hansen <jhansen@vmware.com> |
| Cc: Adit Ranadive <aditr@vmware.com> |
| Cc: netdev@vger.kernel.org |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/vmw_vsock/af_vsock.c | 21 +-------------------- |
| 1 file changed, 1 insertion(+), 20 deletions(-) |
| |
| --- a/net/vmw_vsock/af_vsock.c |
| +++ b/net/vmw_vsock/af_vsock.c |
| @@ -1789,27 +1789,8 @@ vsock_stream_recvmsg(struct socket *sock |
| else if (sk->sk_shutdown & RCV_SHUTDOWN) |
| err = 0; |
| |
| - if (copied > 0) { |
| - /* We only do these additional bookkeeping/notification steps |
| - * if we actually copied something out of the queue pair |
| - * instead of just peeking ahead. |
| - */ |
| - |
| - if (!(flags & MSG_PEEK)) { |
| - /* If the other side has shutdown for sending and there |
| - * is nothing more to read, then modify the socket |
| - * state. |
| - */ |
| - if (vsk->peer_shutdown & SEND_SHUTDOWN) { |
| - if (vsock_stream_has_data(vsk) <= 0) { |
| - sk->sk_state = SS_UNCONNECTED; |
| - sock_set_flag(sk, SOCK_DONE); |
| - sk->sk_state_change(sk); |
| - } |
| - } |
| - } |
| + if (copied > 0) |
| err = copied; |
| - } |
| |
| out: |
| release_sock(sk); |