]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net/smc: check for pending termination
authorKarsten Graul <kgraul@linux.ibm.com>
Tue, 15 May 2018 15:05:03 +0000 (17:05 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 May 2018 15:49:20 +0000 (11:49 -0400)
Avoid to run the processing in smc_lgr_terminate() more than once,
remember when the link group termination is triggered.

Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/smc/smc_clc.c
net/smc/smc_core.c
net/smc/smc_core.h

index 3a988c22f627fe4180b6720de677e183ff06253b..236cb3f12c71f1b07816797631735acbdc002e8f 100644 (file)
@@ -316,7 +316,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
        if (clcm->type == SMC_CLC_DECLINE) {
                reason_code = SMC_CLC_DECL_REPLY;
                if (((struct smc_clc_msg_decline *)buf)->hdr.flag) {
-                       smc->conn.lgr->sync_err = true;
+                       smc->conn.lgr->sync_err = 1;
                        smc_lgr_terminate(smc->conn.lgr);
                }
        }
index a48ee00b65ff7d3e81df6f74ea2c1387a06c0bfb..08c05cd0bbae86207e34fdceed1330b7b9d9d4dc 100644 (file)
@@ -172,7 +172,7 @@ static int smc_lgr_create(struct smc_sock *smc,
                goto out;
        }
        lgr->role = smc->listen_smc ? SMC_SERV : SMC_CLNT;
-       lgr->sync_err = false;
+       lgr->sync_err = 0;
        memcpy(lgr->peer_systemid, peer_systemid, SMC_SYSTEMID_LEN);
        lgr->vlan_id = vlan_id;
        rwlock_init(&lgr->sndbufs_lock);
@@ -352,6 +352,9 @@ void smc_lgr_terminate(struct smc_link_group *lgr)
        struct smc_sock *smc;
        struct rb_node *node;
 
+       if (lgr->terminating)
+               return; /* lgr already terminating */
+       lgr->terminating = 1;
        smc_lgr_forget(lgr);
        smc_llc_link_inactive(&lgr->lnk[SMC_SINGLE_LINK]);
 
index d1753850684bc8ff5dee9ded62c8d3873e817238..845dc073de137c0c43188db2a4e24788b4c644bb 100644 (file)
@@ -166,7 +166,8 @@ struct smc_link_group {
 
        u8                      id[SMC_LGR_ID_SIZE];    /* unique lgr id */
        struct delayed_work     free_work;      /* delayed freeing of an lgr */
-       bool                    sync_err;       /* lgr no longer fits to peer */
+       u8                      sync_err : 1;   /* lgr no longer fits to peer */
+       u8                      terminating : 1;/* lgr is terminating */
 };
 
 /* Find the connection associated with the given alert token in the link group.