]> exis.tech > repos - linux.git/blobdiff - net/smc/smc_cdc.c
Merge tag 'hwmon-for-v7.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/groec...
[linux.git] / net / smc / smc_cdc.c
index 619b3bab38248b3ed65f5fc0a8fb625fd310781c..32d6d03df321459f44d3a5284f61e138a7194348 100644 (file)
@@ -470,9 +470,9 @@ static void smc_cdc_rx_handler(struct ib_wc *wc, void *buf)
 {
        struct smc_link *link = (struct smc_link *)wc->qp->qp_context;
        struct smc_cdc_msg *cdc = buf;
+       struct smc_sock *smc = NULL;
        struct smc_connection *conn;
        struct smc_link_group *lgr;
-       struct smc_sock *smc;
 
        if (wc->byte_len < offsetof(struct smc_cdc_msg, reserved))
                return; /* short message */
@@ -483,21 +483,26 @@ static void smc_cdc_rx_handler(struct ib_wc *wc, void *buf)
        lgr = smc_get_lgr(link);
        read_lock_bh(&lgr->conns_lock);
        conn = smc_lgr_find_conn(ntohl(cdc->token), lgr);
-       read_unlock_bh(&lgr->conns_lock);
-       if (!conn || conn->out_of_sync)
+       if (!conn || conn->out_of_sync) {
+               read_unlock_bh(&lgr->conns_lock);
                return;
+       }
        smc = container_of(conn, struct smc_sock, conn);
+       sock_hold(&smc->sk);
+       read_unlock_bh(&lgr->conns_lock);
 
        if (cdc->prod_flags.failover_validation) {
                smc_cdc_msg_validate(smc, cdc, link);
-               return;
+               goto out;
        }
        if (smc_cdc_before(ntohs(cdc->seqno),
                           conn->local_rx_ctrl.seqno))
                /* received seqno is old */
-               return;
+               goto out;
 
        smc_cdc_msg_recv(smc, cdc);
+out:
+       sock_put(&smc->sk);
 }
 
 static struct smc_wr_rx_handler smc_cdc_rx_handlers[] = {