- }
-
- write_lock_irqsave(&kranal_data.kra_global_lock, flags);
-
- peer2 = kranal_find_peer_locked(peer_nid);
- if (peer2 == NULL) {
- /* peer table takes my initial ref on peer */
- list_add_tail(&peer->rap_list,
- kranal_nid2peerlist(peer_nid));
- } else {
- /* peer_nid already in the peer table */
- kranal_peer_decref(peer);
- peer = peer2;
- }
- /* NB I may now have a non-persistent peer in the peer
- * table with no connections: I can't drop the global lock
- * until I've given it a connection or removed it, and when
- * I do 'peer' can disappear under me. */
- }
-
- LASSERT (kranal_peer_active(peer)); /* peer is in the peer table */
-
- /* Refuse to duplicate an existing connection (both sides might try
- * to connect at once). NB we return success! We _do_ have a
- * connection (so we don't need to remove the peer from the peer
- * table) and we _don't_ have any blocked txs to complete */
+ }
+
+ write_lock_irqsave(&kranal_data.kra_global_lock, flags);
+
+ peer2 = kranal_find_peer_locked(peer_nid);
+ if (peer2 == NULL) {
+ new_peer = 1;
+ } else {
+ /* peer_nid already in the peer table */
+ kranal_peer_decref(peer);
+ peer = peer2;
+ }
+ }
+
+ LASSERT ((!new_peer) != (!kranal_peer_active(peer)));
+
+ /* Refuse connection if peer thinks we are a different NID. We check
+ * this while holding the global lock, to synch with connection
+ * destruction on NID change. */
+ if (dst_nid != kranal_lib.libnal_ni.ni_pid.nid) {
+ write_unlock_irqrestore(&kranal_data.kra_global_lock, flags);
+
+ CERROR("Stale/bad connection with "LPX64
+ ": dst_nid "LPX64", expected "LPX64"\n",
+ peer_nid, dst_nid, kranal_lib.libnal_ni.ni_pid.nid);
+ rc = -ESTALE;
+ goto failed;
+ }
+
+ /* Refuse to duplicate an existing connection (both sides might try to
+ * connect at once). NB we return success! We _are_ connected so we
+ * _don't_ have any blocked txs to complete with failure. */