From: Amir Shehata Date: Thu, 6 May 2021 06:02:22 +0000 (-0700) Subject: LU-14668 lnet: don't delete peer created by Lustre X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=40e3dc586e316b2e8caff44d6dab2fd38b1ebc4c;p=fs%2Flustre-release.git LU-14668 lnet: don't delete peer created by Lustre Peers created by Lustre have their primary NIDs locked. If that peer is deleted, it'll confuse lustre. So when manually deleting a peer using: lnetctl peer del --prim_nid ... We must continue to preserve the primary NID. Therefore we delete all the constituent NIDs, but keep the primary NID. We then flag the peer for rediscovery. Lustre-change: https://review.whamcloud.com/43565 Lustre-commit: TBD (83f66616e303039974e7ed6ec07140dcc17f0cea) Signed-off-by: Amir Shehata Change-Id: I34eef9b0049435a01fde87dc8263dd50f631c551 Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/50117 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Cyril Bordage Reviewed-by: Frank Sehr Reviewed-by: Andreas Dilger --- diff --git a/lnet/lnet/peer.c b/lnet/lnet/peer.c index 0b28060..4ed553c 100644 --- a/lnet/lnet/peer.c +++ b/lnet/lnet/peer.c @@ -1836,6 +1836,40 @@ int lnet_user_add_peer_ni(lnet_nid_t prim_nid, lnet_nid_t nid, bool mr) return lnet_add_peer_ni(prim_nid, nid, mr, LNET_PEER_CONFIGURED); } +static int +lnet_reset_peer(struct lnet_peer *lp) +{ + struct lnet_peer_net *lpn, *lpntmp; + struct lnet_peer_ni *lpni, *lpnitmp; + unsigned int flags; + int rc; + + lnet_peer_cancel_discovery(lp); + + flags = LNET_PEER_CONFIGURED; + if (lp->lp_state & LNET_PEER_MULTI_RAIL) + flags |= LNET_PEER_MULTI_RAIL; + + list_for_each_entry_safe(lpn, lpntmp, &lp->lp_peer_nets, lpn_peer_nets) { + list_for_each_entry_safe(lpni, lpnitmp, &lpn->lpn_peer_nis, + lpni_peer_nis) { + if (lpni->lpni_nid == lp->lp_primary_nid) + continue; + + rc = lnet_peer_del_nid(lp, lpni->lpni_nid, flags); + if (rc) { + CERROR("Failed to delete %s from peer %s\n", + libcfs_nid2str(lpni->lpni_nid), + libcfs_nid2str(lp->lp_primary_nid)); + } + } + } + + /* mark it for discovery the next time we use it */ + lp->lp_state &= ~LNET_PEER_NIDS_UPTODATE; + return 0; +} + /* * Implementation of IOC_LIBCFS_DEL_PEER_NI. * @@ -1879,8 +1913,15 @@ lnet_del_peer_ni(lnet_nid_t prim_nid, lnet_nid_t nid) } lnet_net_unlock(LNET_LOCK_EX); - if (nid == LNET_NID_ANY || nid == lp->lp_primary_nid) - return lnet_peer_del(lp); + if (nid == LNET_NID_ANY || nid == lp->lp_primary_nid) { + if (lp->lp_state & LNET_PEER_LOCK_PRIMARY) { + CERROR("peer %s created by Lustre. Must preserve primary NID, but will remove other NIDs\n", + libcfs_nid2str(lp->lp_primary_nid)); + return lnet_reset_peer(lp); + } else { + return lnet_peer_del(lp); + } + } flags = LNET_PEER_CONFIGURED; if (lp->lp_state & LNET_PEER_MULTI_RAIL)