+ kiblnd_peer_connect_failed(peer_ni, 1, rc);
+}
+
+bool
+kiblnd_reconnect_peer(struct kib_peer_ni *peer_ni)
+{
+ rwlock_t *glock = &kiblnd_data.kib_global_lock;
+ char *reason = NULL;
+ LIST_HEAD(txs);
+ unsigned long flags;
+
+ write_lock_irqsave(glock, flags);
+ if (peer_ni->ibp_reconnecting == 0) {
+ if (peer_ni->ibp_accepting)
+ reason = "accepting";
+ else if (peer_ni->ibp_connecting)
+ reason = "connecting";
+ else if (!list_empty(&peer_ni->ibp_conns))
+ reason = "connected";
+ else /* connected then closed */
+ reason = "closed";
+
+ goto no_reconnect;
+ }
+
+ if (peer_ni->ibp_accepting)
+ CNETERR("Detecting race between accepting and reconnecting\n");
+ peer_ni->ibp_reconnecting--;
+
+ if (!kiblnd_peer_active(peer_ni)) {
+ list_splice_init(&peer_ni->ibp_tx_queue, &txs);
+ reason = "unlinked";
+ goto no_reconnect;
+ }
+
+ peer_ni->ibp_connecting++;
+ peer_ni->ibp_reconnected++;
+
+ write_unlock_irqrestore(glock, flags);
+
+ kiblnd_connect_peer(peer_ni);
+ return true;
+
+ no_reconnect:
+ write_unlock_irqrestore(glock, flags);
+
+ CWARN("Abort reconnection of %s: %s\n",
+ libcfs_nid2str(peer_ni->ibp_nid), reason);
+ kiblnd_txlist_done(&txs, -ECONNABORTED,
+ LNET_MSG_STATUS_LOCAL_ABORTED);
+ return false;