af_iucv: avoid path quiesce of severed path in shutdown()
authorUrsula Braun <ursula.braun@de.ibm.com>
Mon, 21 Jul 2014 10:54:44 +0000 (12:54 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 22 Jul 2014 03:21:40 +0000 (20:21 -0700)
An af_iucv stress test showed -EPIPE results for sendmsg()
calls. They are caused by quiescing a path even though it has
been already severed by peer. For IUCV transport shutdown()
consists of 2 steps:
(1) sending the shutdown message to peer
(2) quiescing the iucv path
If the iucv path between these 2 steps is severed due to peer
closing the path, the quiesce step is no longer needed.

Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <blaschka@linux.vnet.ibm.com>
Reported-by: Philipp Hachtmann <phacht@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/iucv/af_iucv.c

index d79f5fb695b851d5be97cb16f81510eb223fce0c..a089b6b91650b9c17e786e1045cbeac537612dd1 100644 (file)
@@ -1542,7 +1542,8 @@ static int iucv_sock_shutdown(struct socket *sock, int how)
 
        sk->sk_shutdown |= how;
        if (how == RCV_SHUTDOWN || how == SHUTDOWN_MASK) {
-               if (iucv->transport == AF_IUCV_TRANS_IUCV) {
+               if ((iucv->transport == AF_IUCV_TRANS_IUCV) &&
+                   iucv->path) {
                        err = pr_iucv->path_quiesce(iucv->path, NULL);
                        if (err)
                                err = -ENOTCONN;