net/smc: put slot when connection is killed
authorKarsten Graul <kgraul@linux.ibm.com>
Mon, 20 Jul 2020 14:24:28 +0000 (16:24 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 21 Jul 2020 00:52:25 +0000 (17:52 -0700)
To get a send slot smc_wr_tx_get_free_slot() is called, which might
wait for a free slot. When smc_wr_tx_get_free_slot() returns there is a
check if the connection was killed in the meantime. In that case don't
only return an error, but also put back the free slot.

Fixes: b290098092e4 ("net/smc: cancel send and receive for terminated socket")
Reviewed-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/smc/smc_cdc.c

index a47e885..ce468ff 100644 (file)
@@ -66,9 +66,13 @@ int smc_cdc_get_free_slot(struct smc_connection *conn,
        rc = smc_wr_tx_get_free_slot(link, smc_cdc_tx_handler, wr_buf,
                                     wr_rdma_buf,
                                     (struct smc_wr_tx_pend_priv **)pend);
-       if (conn->killed)
+       if (conn->killed) {
                /* abnormal termination */
+               if (!rc)
+                       smc_wr_tx_put_slot(link,
+                                          (struct smc_wr_tx_pend_priv *)pend);
                rc = -EPIPE;
+       }
        return rc;
 }