@@ -953,8 +953,10 @@ bool lnet_peer_is_pref_rtr_locked(struct lnet_peer_ni *lpni,
int lnet_peer_add_pref_rtr(struct lnet_peer_ni *lpni, struct lnet_nid *nid);
int lnet_peer_ni_set_non_mr_pref_nid(struct lnet_peer_ni *lpni,
struct lnet_nid *nid);
-int lnet_user_add_peer_ni(struct lnet_nid *key_nid, struct lnet_nid *nid, bool mr);
-int lnet_del_peer_ni(struct lnet_nid *key_nid, struct lnet_nid *nid);
+int lnet_user_add_peer_ni(struct lnet_nid *key_nid, struct lnet_nid *nid,
+ bool mr, bool lock_prim);
+int lnet_del_peer_ni(struct lnet_nid *key_nid, struct lnet_nid *nid,
+ int force);
int lnet_get_peer_info(struct lnet_ioctl_peer_cfg *cfg, void __user *bulk);
int lnet_get_peer_ni_info(u32 peer_index, u64 *nid,
char alivness[LNET_MAX_STR_LEN],
@@ -298,7 +298,9 @@ struct lnet_ioctl_peer_cfg {
struct libcfs_ioctl_hdr prcfg_hdr;
lnet_nid_t prcfg_prim_nid;
lnet_nid_t prcfg_cfg_nid;
- __u32 prcfg_count;
+ __u32 prcfg_count; /* ADD_PEER_NI: used for 'lock_prim' option
+ * DEL_PEER_NI: used for 'force' option
+ */
__u32 prcfg_mr;
__u32 prcfg_state;
__u32 prcfg_size;
@@ -4239,7 +4239,8 @@ u32 lnet_get_dlc_seq_locked(void)
mutex_lock(&the_lnet.ln_api_mutex);
lnet_nid4_to_nid(cfg->prcfg_prim_nid, &prim_nid);
lnet_nid4_to_nid(cfg->prcfg_cfg_nid, &nid);
- rc = lnet_user_add_peer_ni(&prim_nid, &nid, cfg->prcfg_mr);
+ rc = lnet_user_add_peer_ni(&prim_nid, &nid, cfg->prcfg_mr,
+ cfg->prcfg_count == 1);
mutex_unlock(&the_lnet.ln_api_mutex);
return rc;
}
@@ -4255,7 +4256,8 @@ u32 lnet_get_dlc_seq_locked(void)
lnet_nid4_to_nid(cfg->prcfg_prim_nid, &prim_nid);
lnet_nid4_to_nid(cfg->prcfg_cfg_nid, &nid);
rc = lnet_del_peer_ni(&prim_nid,
- &nid);
+ &nid,
+ cfg->prcfg_count);
mutex_unlock(&the_lnet.ln_api_mutex);
return rc;
}
@@ -1978,9 +1978,12 @@ struct lnet_peer_net *
return lnet_peer_add_nid(lp, nid, flags);
}
-int lnet_user_add_peer_ni(struct lnet_nid *prim_nid, struct lnet_nid *nid, bool mr)
+int lnet_user_add_peer_ni(struct lnet_nid *prim_nid, struct lnet_nid *nid,
+ bool mr, bool lock_prim)
{
- return lnet_add_peer_ni(prim_nid, nid, mr, LNET_PEER_CONFIGURED);
+ int fl = LNET_PEER_CONFIGURED | (LNET_PEER_LOCK_PRIMARY * lock_prim);
+
+ return lnet_add_peer_ni(prim_nid, nid, mr, fl);
}
static int
@@ -2029,7 +2032,8 @@ int lnet_user_add_peer_ni(struct lnet_nid *prim_nid, struct lnet_nid *nid, bool
* being modified/deleted by a different thread.
*/
int
-lnet_del_peer_ni(struct lnet_nid *prim_nid, struct lnet_nid *nid)
+lnet_del_peer_ni(struct lnet_nid *prim_nid, struct lnet_nid *nid,
+ int force)
{
struct lnet_peer *lp;
struct lnet_peer_ni *lpni;
@@ -2061,7 +2065,7 @@ int lnet_user_add_peer_ni(struct lnet_nid *prim_nid, struct lnet_nid *nid, bool
lnet_net_unlock(LNET_LOCK_EX);
if (LNET_NID_IS_ANY(nid) || nid_same(nid, &lp->lp_primary_nid)) {
- if (lp->lp_state & LNET_PEER_LOCK_PRIMARY) {
+ if (!force && lp->lp_state & LNET_PEER_LOCK_PRIMARY) {
CERROR("peer %s created by Lustre. Must preserve primary NID, but will remove other NIDs\n",
libcfs_nidstr(&lp->lp_primary_nid));
return lnet_reset_peer(lp);