+ INIT_LIST_HEAD(&peer->lp_on_lnet_peer_list);
+ INIT_LIST_HEAD(&peer->lp_peer_nets);
+ INIT_LIST_HEAD(&peer_net->lpn_on_peer_list);
+ INIT_LIST_HEAD(&peer_net->lpn_peer_nis);
+
+ /* build the hierarchy */
+ peer_net->lpn_net_id = lpni_net;
+ peer_net->lpn_peer = peer;
+ lpni->lpni_peer_net = peer_net;
+ peer->lp_primary_nid = lpni->lpni_nid;
+ list_add_tail(&peer_net->lpn_on_peer_list, &peer->lp_peer_nets);
+ list_add_tail(&lpni->lpni_on_peer_net_list, &peer_net->lpn_peer_nis);
+ list_add_tail(&peer->lp_on_lnet_peer_list, &the_lnet.ln_peers);
+
+ return 0;
+}
+
+void
+lnet_destroy_peer_ni_locked(struct lnet_peer_ni *lpni)
+{
+ struct lnet_peer_table *ptable;
+
+ LASSERT(atomic_read(&lpni->lpni_refcount) == 0);
+ LASSERT(lpni->lpni_rtr_refcount == 0);
+ LASSERT(list_empty(&lpni->lpni_txq));
+ LASSERT(list_empty(&lpni->lpni_hashlist));
+ LASSERT(lpni->lpni_txqnob == 0);
+ LASSERT(lpni->lpni_peer_net != NULL);
+ LASSERT(lpni->lpni_peer_net->lpn_peer != NULL);
+
+ ptable = the_lnet.ln_peer_tables[lpni->lpni_cpt];
+ LASSERT(ptable->pt_number > 0);
+ ptable->pt_number--;
+
+ lpni->lpni_net = NULL;
+
+ lnet_try_destroy_peer_hierarchy_locked(lpni);
+
+ LIBCFS_FREE(lpni, sizeof(*lpni));
+
+ LASSERT(ptable->pt_zombies > 0);
+ ptable->pt_zombies--;