Whamcloud - gitweb
LU-15885 o2iblnd: fix handling of RDMA_CM_EVENT_UNREACHABLE 92/48492/2
authorSerguei Smirnov <ssmirnov@whamcloud.com>
Thu, 8 Sep 2022 22:27:12 +0000 (15:27 -0700)
committerOleg Drokin <green@whamcloud.com>
Mon, 10 Oct 2022 05:37:42 +0000 (05:37 +0000)
RDMA_CM_EVENT_UNREACHABLE may be received not only when connection
is being connected, but also when it is being closed. Fix handing
of this event accordingly.

Test-Parameters: trivial
Signed-off-by: Serguei Smirnov <ssmirnov@whamcloud.com>
Change-Id: I79428188c159b2d80d36326589b2977db065d4a7
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/48492
Reviewed-by: Frank Sehr <fsehr@whamcloud.com>
Reviewed-by: Chris Horn <chris.horn@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lnet/klnds/o2iblnd/o2iblnd_cb.c

index 1030bba..9c2b574 100644 (file)
@@ -3265,12 +3265,17 @@ kiblnd_cm_callback(struct rdma_cm_id *cmid, struct rdma_cm_event *event)
 
        case RDMA_CM_EVENT_UNREACHABLE:
                conn = cmid->context;
-                LASSERT(conn->ibc_state == IBLND_CONN_ACTIVE_CONNECT ||
-                        conn->ibc_state == IBLND_CONN_PASSIVE_WAIT);
-                CNETERR("%s: UNREACHABLE %d\n",
-                       libcfs_nid2str(conn->ibc_peer->ibp_nid), event->status);
-                kiblnd_connreq_done(conn, -ENETDOWN);
-                kiblnd_conn_decref(conn);
+               CNETERR("%s: UNREACHABLE %d, ibc_state: %d\n",
+                       libcfs_nid2str(conn->ibc_peer->ibp_nid),
+                       event->status,
+                       conn->ibc_state);
+               LASSERT(conn->ibc_state != IBLND_CONN_ESTABLISHED &&
+                       conn->ibc_state != IBLND_CONN_INIT);
+               if (conn->ibc_state == IBLND_CONN_ACTIVE_CONNECT ||
+                   conn->ibc_state == IBLND_CONN_PASSIVE_WAIT) {
+                       kiblnd_connreq_done(conn, -ENETDOWN);
+                       kiblnd_conn_decref(conn);
+               }
                 return 0;
 
        case RDMA_CM_EVENT_CONNECT_ERROR: