@@ -953,8 +953,7 @@ 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_add_peer_ni(struct lnet_nid *key_nid, struct lnet_nid *nid, bool mr,
- bool temp);
+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_get_peer_info(struct lnet_ioctl_peer_cfg *cfg, void __user *bulk);
int lnet_get_peer_ni_info(u32 peer_index, u64 *nid,
@@ -4239,7 +4239,7 @@ 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_add_peer_ni(&prim_nid, &nid, cfg->prcfg_mr, false);
+ rc = lnet_user_add_peer_ni(&prim_nid, &nid, cfg->prcfg_mr);
mutex_unlock(&the_lnet.ln_api_mutex);
return rc;
}
@@ -42,6 +42,8 @@
#define LNET_REDISCOVER_PEER (1)
static int lnet_peer_queue_for_discovery(struct lnet_peer *lp);
+static int lnet_add_peer_ni(struct lnet_nid *prim_nid, struct lnet_nid *nid, bool mr,
+ unsigned int flags);
static void
lnet_peer_remove_from_remote_list(struct lnet_peer_ni *lpni)
@@ -1366,7 +1368,8 @@ struct lnet_peer_ni *
lnet_nid4_to_nid(nids[i], &nid);
if (LNET_NID_IS_ANY(&pnid)) {
lnet_nid4_to_nid(nids[i], &pnid);
- rc = lnet_add_peer_ni(&pnid, &LNET_ANY_NID, mr, true);
+ rc = lnet_add_peer_ni(&pnid, &LNET_ANY_NID, mr,
+ LNET_PEER_LOCK_PRIMARY);
if (rc == -EALREADY) {
struct lnet_peer *lp;
@@ -1382,10 +1385,12 @@ struct lnet_peer_ni *
}
} else if (lnet_peer_discovery_disabled) {
lnet_nid4_to_nid(nids[i], &nid);
- rc = lnet_add_peer_ni(&nid, &LNET_ANY_NID, mr, true);
+ rc = lnet_add_peer_ni(&nid, &LNET_ANY_NID, mr,
+ LNET_PEER_LOCK_PRIMARY);
} else {
lnet_nid4_to_nid(nids[i], &nid);
- rc = lnet_add_peer_ni(&pnid, &nid, mr, true);
+ rc = lnet_add_peer_ni(&pnid, &nid, mr,
+ LNET_PEER_LOCK_PRIMARY);
}
if (rc && rc != -EEXIST)
@@ -1918,22 +1923,18 @@ struct lnet_peer_net *
* The caller must hold ln_api_mutex. This prevents the peer from
* being created/modified/deleted by a different thread.
*/
-int
+static int
lnet_add_peer_ni(struct lnet_nid *prim_nid, struct lnet_nid *nid, bool mr,
- bool temp)
+ unsigned int flags)
__must_hold(&the_lnet.ln_api_mutex)
{
struct lnet_peer *lp = NULL;
struct lnet_peer_ni *lpni;
- unsigned int flags = 0;
/* The prim_nid must always be specified */
if (LNET_NID_IS_ANY(prim_nid))
return -EINVAL;
- if (!temp)
- flags = LNET_PEER_CONFIGURED;
-
if (mr)
flags |= LNET_PEER_MULTI_RAIL;
@@ -1951,13 +1952,6 @@ struct lnet_peer_net *
lnet_peer_ni_decref_locked(lpni);
lp = lpni->lpni_peer_net->lpn_peer;
- /* Peer must have been configured. */
- if (!temp && !(lp->lp_state & LNET_PEER_CONFIGURED)) {
- CDEBUG(D_NET, "peer %s was not configured\n",
- libcfs_nidstr(prim_nid));
- return -ENOENT;
- }
-
/* Primary NID must match */
if (!nid_same(&lp->lp_primary_nid, prim_nid)) {
CDEBUG(D_NET, "prim_nid %s is not primary for peer %s\n",
@@ -1973,7 +1967,8 @@ struct lnet_peer_net *
return -EPERM;
}
- if (temp && lnet_peer_is_uptodate(lp)) {
+ if ((flags & LNET_PEER_LOCK_PRIMARY) &&
+ (lnet_peer_is_uptodate(lp) && (lp->lp_state & LNET_PEER_LOCK_PRIMARY))) {
CDEBUG(D_NET,
"Don't add temporary peer NI for uptodate peer %s\n",
libcfs_nidstr(&lp->lp_primary_nid));
@@ -1983,6 +1978,11 @@ 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)
+{
+ return lnet_add_peer_ni(prim_nid, nid, mr, LNET_PEER_CONFIGURED);
+}
+
/*
* Implementation of IOC_LIBCFS_DEL_PEER_NI.
*