+ /* The conns of canceled active dgrams need to be put in purgatory so
+ * we don't reuse the mailbox */
+ if (unlikely(dgram->gndg_state == GNILND_DGRAM_CANCELED)) {
+ kgn_peer_t *peer;
+ kgn_conn_t *conn = dgram->gndg_conn;
+ lnet_nid_t nid = dgram->gndg_conn_out.gncr_dstnid;
+
+ dgram->gndg_state = GNILND_DGRAM_DONE;
+
+ /* During shutdown we've already removed the peer so we don't
+ * need to add a peer. During stack reset we don't care about
+ * MDDs since they are all released. */
+ if (!shutdown) {
+ write_lock(&kgnilnd_data.kgn_peer_conn_lock);
+ peer = kgnilnd_find_peer_locked(nid);
+
+ if (peer != NULL) {
+ CDEBUG(D_NET, "adding peer's conn with nid %s "
+ "to purgatory\n", libcfs_nid2str(nid));
+ kgnilnd_conn_addref(conn);
+ conn->gnc_peer = peer;
+ kgnilnd_peer_addref(peer);
+ kgnilnd_admin_addref(conn->gnc_peer->gnp_dirty_eps);
+ conn->gnc_state = GNILND_CONN_CLOSED;
+ list_add_tail(&conn->gnc_list,
+ &peer->gnp_conns);
+ kgnilnd_add_purgatory_locked(conn,
+ conn->gnc_peer);
+ kgnilnd_schedule_conn(conn);
+ }
+ write_unlock(&kgnilnd_data.kgn_peer_conn_lock);
+ }
+ }
+