All of lore.kernel.org
 help / color / mirror / Atom feed
From: James Simmons <jsimmons@infradead.org>
To: lustre-devel@lists.lustre.org
Subject: [lustre-devel] [PATCH 075/622] lnet: refactor lnet_select_pathway()
Date: Thu, 27 Feb 2020 16:09:03 -0500	[thread overview]
Message-ID: <1582838290-17243-76-git-send-email-jsimmons@infradead.org> (raw)
In-Reply-To: <1582838290-17243-1-git-send-email-jsimmons@infradead.org>

From: Amir Shehata <ashehata@whamcloud.com>

lnet_select_pathway() is a complex monolithic function which handles
many send cases. Broke down lnet_select_pathway() to multiple
functions. Each function handles a different send case. This will
make it easier to add the handling of the different health cases in
future patches.

WC-bug-id: https://jira.whamcloud.com/browse/LU-9120
Lustre-commit: 4e48761a5719 ("LU-9120 lnet: refactor lnet_select_pathway()")
Signed-off-by: Amir Shehata <ashehata@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/32760
Reviewed-by: Sonia Sharma <sharmaso@whamcloud.com>
Reviewed-by: Olaf Weber <olaf.weber@hpe.com>
Reviewed-by: Chris Horn <hornc@cray.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
---
 include/linux/lnet/lib-lnet.h |   13 +
 net/lnet/lnet/lib-move.c      | 1398 ++++++++++++++++++++++++++---------------
 2 files changed, 911 insertions(+), 500 deletions(-)

diff --git a/include/linux/lnet/lib-lnet.h b/include/linux/lnet/lib-lnet.h
index 22c6152..20b4660 100644
--- a/include/linux/lnet/lib-lnet.h
+++ b/include/linux/lnet/lib-lnet.h
@@ -827,6 +827,19 @@ int lnet_get_peer_ni_info(u32 peer_index, u64 *nid,
 	return false;
 }
 
+static inline struct lnet_peer_net *
+lnet_find_peer_net_locked(struct lnet_peer *peer, u32 net_id)
+{
+	struct lnet_peer_net *peer_net;
+
+	list_for_each_entry(peer_net, &peer->lp_peer_nets, lpn_peer_nets) {
+		if (peer_net->lpn_net_id == net_id)
+			return peer_net;
+	}
+
+	return NULL;
+}
+
 static inline void
 lnet_peer_set_alive(struct lnet_peer_ni *lp)
 {
diff --git a/net/lnet/lnet/lib-move.c b/net/lnet/lnet/lib-move.c
index cab830a..10aa753 100644
--- a/net/lnet/lnet/lib-move.c
+++ b/net/lnet/lnet/lib-move.c
@@ -45,6 +45,23 @@
 module_param(local_nid_dist_zero, int, 0444);
 MODULE_PARM_DESC(local_nid_dist_zero, "Reserved");
 
+struct lnet_send_data {
+	struct lnet_ni		*sd_best_ni;
+	struct lnet_peer_ni	*sd_best_lpni;
+	struct lnet_peer_ni	*sd_final_dst_lpni;
+	struct lnet_peer	*sd_peer;
+	struct lnet_peer	*sd_gw_peer;
+	struct lnet_peer_ni	*sd_gw_lpni;
+	struct lnet_peer_net	*sd_peer_net;
+	struct lnet_msg		*sd_msg;
+	lnet_nid_t		sd_dst_nid;
+	lnet_nid_t		sd_src_nid;
+	lnet_nid_t		sd_rtr_nid;
+	int			sd_cpt;
+	int			sd_md_cpt;
+	u32			sd_send_case;
+};
+
 static inline struct lnet_comm_count *
 get_stats_counts(struct lnet_element_stats *stats,
 		 enum lnet_stats_type stats_type)
@@ -1188,7 +1205,7 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 }
 
 static struct lnet_peer_ni *
-lnet_find_route_locked(struct lnet_net *net, lnet_nid_t target,
+lnet_find_route_locked(struct lnet_net *net, u32 remote_net,
 		       lnet_nid_t rtr_nid)
 {
 	struct lnet_remotenet *rnet;
@@ -1203,7 +1220,7 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 	 * If @rtr_nid is not LNET_NID_ANY, return the gateway with
 	 * rtr_nid nid, otherwise find the best gateway I can use
 	 */
-	rnet = lnet_find_rnet_locked(LNET_NIDNET(target));
+	rnet = lnet_find_rnet_locked(remote_net);
 	if (!rnet)
 		return NULL;
 
@@ -1252,13 +1269,20 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 }
 
 static struct lnet_ni *
-lnet_get_best_ni(struct lnet_net *local_net, struct lnet_ni *cur_ni,
+lnet_get_best_ni(struct lnet_net *local_net, struct lnet_ni *best_ni,
+		 struct lnet_peer *peer, struct lnet_peer_net *peer_net,
 		 int md_cpt)
 {
-	struct lnet_ni *ni = NULL, *best_ni = cur_ni;
+	struct lnet_ni *ni = NULL;
 	unsigned int shortest_distance;
 	int best_credits;
 
+	/* If there is no peer_ni that we can send to on this network,
+	 * then there is no point in looking for a new best_ni here.
+	 */
+	if (!lnet_get_next_peer_ni_locked(peer, peer_net, NULL))
+		return best_ni;
+
 	if (!best_ni) {
 		shortest_distance = UINT_MAX;
 		best_credits = INT_MIN;
@@ -1286,6 +1310,13 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 					    md_cpt,
 					    ni->ni_dev_cpt);
 
+		CDEBUG(D_NET,
+		       "compare ni %s [c:%d, d:%d, s:%d] with best_ni %s [c:%d, d:%d, s:%d]\n",
+		       libcfs_nid2str(ni->ni_nid), ni_credits, distance,
+		       ni->ni_seq, (best_ni) ? libcfs_nid2str(best_ni->ni_nid)
+			: "not seleced", best_credits, shortest_distance,
+			(best_ni) ? best_ni->ni_seq : 0);
+
 		/*
 		 * All distances smaller than the NUMA range
 		 * are treated equally.
@@ -1311,6 +1342,9 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 		best_credits = ni_credits;
 	}
 
+	CDEBUG(D_NET, "selected best_ni %s\n",
+	       (best_ni) ? libcfs_nid2str(best_ni->ni_nid) : "no selection");
+
 	return best_ni;
 }
 
@@ -1335,421 +1369,140 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 	return false;
 }
 
+#define SRC_SPEC	0x0001
+#define SRC_ANY		0x0002
+#define LOCAL_DST	0x0004
+#define REMOTE_DST	0x0008
+#define MR_DST		0x0010
+#define NMR_DST		0x0020
+#define SND_RESP	0x0040
+
+/* The following to defines are used for return codes */
+#define REPEAT_SEND	0x1000
+#define PASS_THROUGH	0x2000
+
+/* The different cases lnet_select pathway needs to handle */
+#define SRC_SPEC_LOCAL_MR_DST	(SRC_SPEC | LOCAL_DST | MR_DST)
+#define SRC_SPEC_ROUTER_MR_DST	(SRC_SPEC | REMOTE_DST | MR_DST)
+#define SRC_SPEC_LOCAL_NMR_DST	(SRC_SPEC | LOCAL_DST | NMR_DST)
+#define SRC_SPEC_ROUTER_NMR_DST	(SRC_SPEC | REMOTE_DST | NMR_DST)
+#define SRC_ANY_LOCAL_MR_DST	(SRC_ANY | LOCAL_DST | MR_DST)
+#define SRC_ANY_ROUTER_MR_DST	(SRC_ANY | REMOTE_DST | MR_DST)
+#define SRC_ANY_LOCAL_NMR_DST	(SRC_ANY | LOCAL_DST | NMR_DST)
+#define SRC_ANY_ROUTER_NMR_DST	(SRC_ANY | REMOTE_DST | NMR_DST)
+
 static int
-lnet_select_pathway(lnet_nid_t src_nid, lnet_nid_t dst_nid,
-		    struct lnet_msg *msg, lnet_nid_t rtr_nid)
+lnet_handle_send(struct lnet_send_data *sd)
 {
-	struct lnet_ni *best_ni = NULL;
-	struct lnet_peer_ni *best_lpni = NULL;
-	struct lnet_peer_ni *best_gw = NULL;
-	struct lnet_peer_ni *lpni;
-	struct lnet_peer_ni *final_dst;
-	struct lnet_peer *peer;
-	struct lnet_peer_net *peer_net;
-	struct lnet_net *local_net;
-	int cpt, cpt2, rc;
-	bool routing;
-	bool routing2;
-	bool ni_is_pref;
-	bool preferred;
-	bool local_found;
-	int best_lpni_credits;
-	int md_cpt;
-
-	/*
-	 * get an initial CPT to use for locking. The idea here is not to
-	 * serialize the calls to select_pathway, so that as many
-	 * operations can run concurrently as possible. To do that we use
-	 * the CPT where this call is being executed. Later on when we
-	 * determine the CPT to use in lnet_message_commit, we switch the
-	 * lock and check if there was any configuration change.  If none,
-	 * then we proceed, if there is, then we restart the operation.
-	 */
-	cpt = lnet_net_lock_current();
-
-	md_cpt = lnet_cpt_of_md(msg->msg_md, msg->msg_offset);
-	if (md_cpt == CFS_CPT_ANY)
-		md_cpt = cpt;
-
-again:
-	best_ni = NULL;
-	best_lpni = NULL;
-	best_gw = NULL;
-	final_dst = NULL;
-	local_net = NULL;
-	routing = false;
-	routing2 = false;
-	local_found = false;
-
-	/*
-	 * lnet_nid2peerni_locked() is the path that will find an
-	 * existing peer_ni, or create one and mark it as having been
-	 * created due to network traffic.
-	 */
-	lpni = lnet_nid2peerni_locked(dst_nid, LNET_NID_ANY, cpt);
-	if (IS_ERR(lpni)) {
-		lnet_net_unlock(cpt);
-		return PTR_ERR(lpni);
-	}
+	struct lnet_ni *best_ni = sd->sd_best_ni;
+	struct lnet_peer_ni *best_lpni = sd->sd_best_lpni;
+	struct lnet_peer_ni *final_dst_lpni = sd->sd_final_dst_lpni;
+	struct lnet_msg *msg = sd->sd_msg;
+	int cpt2;
+	u32 send_case = sd->sd_send_case;
+	int rc;
+	u32 routing = send_case & REMOTE_DST;
 
-	/* If we're being asked to send to the loopback interface, there
-	 * is no need to go through any selection. We can just shortcut
-	 * the entire process and send over lolnd
+	/* Increment sequence number of the selected peer so that we
+	 * pick the next one in Round Robin.
 	 */
-	if (LNET_NETTYP(LNET_NIDNET(dst_nid)) == LOLND) {
-		lnet_peer_ni_decref_locked(lpni);
-		best_ni = the_lnet.ln_loni;
-		goto send;
-	}
+	best_lpni->lpni_seq++;
 
-	/*
-	 * Now that we have a peer_ni, check if we want to discover
-	 * the peer. Traffic to the LNET_RESERVED_PORTAL should not
-	 * trigger discovery.
+	/* grab a reference on the peer_ni so it sticks around even if
+	 * we need to drop and relock the lnet_net_lock below.
 	 */
-	peer = lpni->lpni_peer_net->lpn_peer;
-	if (lnet_msg_discovery(msg) && !lnet_peer_is_uptodate(peer)) {
-		rc = lnet_discover_peer_locked(lpni, cpt, false);
-		if (rc) {
-			lnet_peer_ni_decref_locked(lpni);
-			lnet_net_unlock(cpt);
-			return rc;
-		}
-		/* The peer may have changed. */
-		peer = lpni->lpni_peer_net->lpn_peer;
-		/* queue message and return */
-		msg->msg_src_nid_param = src_nid;
-		msg->msg_rtr_nid_param = rtr_nid;
-		msg->msg_sending = 0;
-		list_add_tail(&msg->msg_list, &peer->lp_dc_pendq);
-		CDEBUG(D_NET, "%s pending discovery\n",
-		       libcfs_nid2str(peer->lp_primary_nid));
-		lnet_peer_ni_decref_locked(lpni);
-		lnet_net_unlock(cpt);
-
-		return LNET_DC_WAIT;
-	}
-	lnet_peer_ni_decref_locked(lpni);
-
-	/* If peer is not healthy then can not send anything to it */
-	if (!lnet_is_peer_healthy_locked(peer)) {
-		lnet_net_unlock(cpt);
-		return -EHOSTUNREACH;
-	}
+	lnet_peer_ni_addref_locked(best_lpni);
 
-	/*
-	 * STEP 1: first jab at determining best_ni
-	 * if src_nid is explicitly specified, then best_ni is already
-	 * pre-determiend for us. Otherwise we need to select the best
-	 * one to use later on
+	/* Use lnet_cpt_of_nid() to determine the CPT used to commit the
+	 * message. This ensures that we get a CPT that is correct for
+	 * the NI when the NI has been restricted to a subset of all CPTs.
+	 * If the selected CPT differs from the one currently locked, we
+	 * must unlock and relock the lnet_net_lock(), and then check whether
+	 * the configuration has changed. We don't have a hold on the best_ni
+	 * yet, and it may have vanished.
 	 */
-	if (src_nid != LNET_NID_ANY) {
-		best_ni = lnet_nid2ni_locked(src_nid, cpt);
-		if (!best_ni) {
-			lnet_net_unlock(cpt);
-			LCONSOLE_WARN("Can't send to %s: src %s is not a local nid\n",
-				      libcfs_nid2str(dst_nid),
-				      libcfs_nid2str(src_nid));
-			return -EINVAL;
-		}
-	}
+	cpt2 = lnet_cpt_of_nid_locked(best_lpni->lpni_nid, best_ni);
+	if (sd->sd_cpt != cpt2) {
+		u32 seq = lnet_get_dlc_seq_locked();
 
-	if (msg->msg_type == LNET_MSG_REPLY ||
-	    msg->msg_type == LNET_MSG_ACK ||
-	    !lnet_peer_is_multi_rail(peer) ||
-	    best_ni) {
-		/*
-		 * for replies we want to respond on the same peer_ni we
-		 * received the message on if possible. If not, then pick
-		 * a peer_ni to send to
-		 *
-		 * if the peer is non-multi-rail then you want to send to
-		 * the dst_nid provided as well.
-		 *
-		 * If the best_ni has already been determined, IE the
-		 * src_nid has been specified, then use the
-		 * destination_nid provided as well, since we're
-		 * continuing a series of related messages for the same
-		 * RPC.
-		 *
-		 * It is expected to find the lpni using dst_nid, since we
-		 * created it earlier.
-		 */
-		best_lpni = lnet_find_peer_ni_locked(dst_nid);
-		if (best_lpni)
+		lnet_net_unlock(sd->sd_cpt);
+		sd->sd_cpt = cpt2;
+		lnet_net_lock(sd->sd_cpt);
+		if (seq != lnet_get_dlc_seq_locked()) {
 			lnet_peer_ni_decref_locked(best_lpni);
-
-		if (best_lpni && !lnet_get_net_locked(LNET_NIDNET(dst_nid))) {
-			/*
-			 * this lpni is not on a local network so we need
-			 * to route this reply.
-			 */
-			best_gw = lnet_find_route_locked(NULL,
-							 best_lpni->lpni_nid,
-							 rtr_nid);
-			if (best_gw) {
-				/*
-				 * RULE: Each node considers only the next-hop
-				 *
-				 * We're going to route the message,
-				 * so change the peer to the router.
-				 */
-				LASSERT(best_gw->lpni_peer_net);
-				LASSERT(best_gw->lpni_peer_net->lpn_peer);
-				peer = best_gw->lpni_peer_net->lpn_peer;
-
-				/*
-				 * if the router is not multi-rail
-				 * then use the best_gw found to send
-				 * the message to
-				 */
-				if (!lnet_peer_is_multi_rail(peer))
-					best_lpni = best_gw;
-				else
-					best_lpni = NULL;
-
-				routing = true;
-			} else {
-				best_lpni = NULL;
-			}
-		} else if (!best_lpni) {
-			lnet_net_unlock(cpt);
-			CERROR("unable to send msg_type %d to originating %s. Destination NID not in DB\n",
-			       msg->msg_type, libcfs_nid2str(dst_nid));
-			return -EINVAL;
-		}
-	}
-
-	/*
-	 * We must use a consistent source address when sending to a
-	 * non-MR peer. However, a non-MR peer can have multiple NIDs
-	 * on multiple networks, and we may even need to talk to this
-	 * peer on multiple networks -- certain types of
-	 * load-balancing configuration do this.
-	 *
-	 * So we need to pick the NI the peer prefers for this
-	 * particular network.
-	 */
-	if (!lnet_peer_is_multi_rail(peer)) {
-		if (!best_lpni) {
-			lnet_net_unlock(cpt);
-			CERROR("no route to %s\n",
-			       libcfs_nid2str(dst_nid));
-			return -EHOSTUNREACH;
-		}
-
-		/* best ni is already set if src_nid was provided */
-		if (!best_ni) {
-			/* Get the target peer_ni */
-			peer_net = lnet_peer_get_net_locked(
-				peer, LNET_NIDNET(best_lpni->lpni_nid));
-			list_for_each_entry(lpni, &peer_net->lpn_peer_nis,
-					    lpni_peer_nis) {
-				if (lpni->lpni_pref_nnids == 0)
-					continue;
-				LASSERT(lpni->lpni_pref_nnids == 1);
-				best_ni = lnet_nid2ni_locked(
-					lpni->lpni_pref.nid, cpt);
-				break;
-			}
+			return REPEAT_SEND;
 		}
-		/* if best_ni is still not set just pick one */
-		if (!best_ni) {
-			best_ni = lnet_net2ni_locked(
-				best_lpni->lpni_net->net_id, cpt);
-			/* If there is no best_ni we don't have a route */
-			if (!best_ni) {
-				CERROR("no path to %s from net %s\n",
-				       libcfs_nid2str(best_lpni->lpni_nid),
-				       libcfs_net2str(best_lpni->lpni_net->net_id));
-				lnet_net_unlock(cpt);
-				return -EHOSTUNREACH;
-			}
-			lpni = list_first_entry(&peer_net->lpn_peer_nis,
-						struct lnet_peer_ni,
-					  lpni_peer_nis);
-		}
-		/* Set preferred NI if necessary. */
-		if (lpni->lpni_pref_nnids == 0)
-			lnet_peer_ni_set_non_mr_pref_nid(lpni, best_ni->ni_nid);
 	}
 
-	/*
-	 * if we already found a best_ni because src_nid is specified and
-	 * best_lpni because we are replying to a message then just send
-	 * the message
+	/* store the best_lpni in the message right away to avoid having
+	 * to do the same operation under different conditions
 	 */
-	if (best_ni && best_lpni)
-		goto send;
+	msg->msg_txpeer = best_lpni;
+	msg->msg_txni = best_ni;
 
-	/*
-	 * If we already found a best_ni because src_nid is specified then
-	 * pick the peer then send the message
+	/* grab a reference for the best_ni since now it's in use in this
+	 * send. The reference will be dropped in lnet_finalize()
 	 */
-	if (best_ni)
-		goto pick_peer;
+	lnet_ni_addref_locked(msg->msg_txni, sd->sd_cpt);
 
-	/*
-	 * pick the best_ni by going through all the possible networks of
-	 * that peer and see which local NI is best suited to talk to that
-	 * peer.
-	 *
-	 * Locally connected networks will always be preferred over
-	 * a routed network. If there are only routed paths to the peer,
-	 * then the best route is chosen. If all routes are equal then
-	 * they are used in round robin.
+	/* Always set the target.nid to the best peer picked. Either the
+	 * NID will be one of the peer NIDs selected, or the same NID as
+	 * what was originally set in the target or it will be the NID of
+	 * a router if this message should be routed
 	 */
-	list_for_each_entry(peer_net, &peer->lp_peer_nets, lpn_peer_nets) {
-		if (!lnet_is_peer_net_healthy_locked(peer_net))
-			continue;
-
-		local_net = lnet_get_net_locked(peer_net->lpn_net_id);
-		if (!local_net && !routing && !local_found) {
-			struct lnet_peer_ni *net_gw;
-
-			lpni = list_first_entry(&peer_net->lpn_peer_nis,
-						struct lnet_peer_ni,
-						lpni_peer_nis);
-
-			net_gw = lnet_find_route_locked(NULL,
-							lpni->lpni_nid,
-							rtr_nid);
-			if (!net_gw)
-				continue;
-
-			if (best_gw) {
-				/*
-				 * lnet_find_route_locked() call
-				 * will return the best_Gw on the
-				 * lpni->lpni_nid network.
-				 * However, best_gw and net_gw can
-				 * be on different networks.
-				 * Therefore need to compare them
-				 * to pick the better of either.
-				 */
-				if (lnet_compare_peers(best_gw, net_gw) > 0)
-					continue;
-				if (best_gw->lpni_gw_seq <= net_gw->lpni_gw_seq)
-					continue;
-			}
-			best_gw = net_gw;
-			final_dst = lpni;
-
-			routing2 = true;
-		} else {
-			best_gw = NULL;
-			final_dst = NULL;
-			routing2 = false;
-			local_found = true;
-		}
-
-		/*
-		 * a gw on this network is found, but there could be
-		 * other better gateways on other networks. So don't pick
-		 * the best_ni until we determine the best_gw.
-		 */
-		if (best_gw)
-			continue;
-
-		/* if no local_net found continue */
-		if (!local_net)
-			continue;
-
-		/*
-		 * Iterate through the NIs in this local Net and select
-		 * the NI to send from. The selection is determined by
-		 * these 3 criterion in the following priority:
-		 *	1. NUMA
-		 *	2. NI available credits
-		 *	3. Round Robin
-		 */
-		best_ni = lnet_get_best_ni(local_net, best_ni, md_cpt);
-	}
-
-	if (!best_ni && !best_gw) {
-		lnet_net_unlock(cpt);
-		LCONSOLE_WARN("No local ni found to send from to %s\n",
-			      libcfs_nid2str(dst_nid));
-		return -EINVAL;
-	}
-
-	if (!best_ni) {
-		best_ni = lnet_get_best_ni(best_gw->lpni_net, best_ni, md_cpt);
-		LASSERT(best_gw && best_ni);
-
-		/*
-		 * We're going to route the message, so change the peer to
-		 * the router.
-		 */
-		LASSERT(best_gw->lpni_peer_net);
-		LASSERT(best_gw->lpni_peer_net->lpn_peer);
-		best_gw->lpni_gw_seq++;
-		peer = best_gw->lpni_peer_net->lpn_peer;
-	}
+	msg->msg_target.nid = msg->msg_txpeer->lpni_nid;
 
-	/*
-	 * Now that we selected the NI to use increment its sequence
-	 * number so the Round Robin algorithm will detect that it has
-	 * been used and pick the next NI.
+	/* lnet_msg_commit assigns the correct cpt to the message, which
+	 * is used to decrement the correct refcount on the ni when it's
+	 * time to return the credits
 	 */
-	best_ni->ni_seq++;
+	lnet_msg_commit(msg, sd->sd_cpt);
 
-pick_peer:
-	/*
-	 * At this point the best_ni is on a local network on which
-	 * the peer has a peer_ni as well
-	 */
-	peer_net = lnet_peer_get_net_locked(peer,
-					    best_ni->ni_net->net_id);
-	/*
-	 * peer_net is not available or the src_nid is explicitly defined
-	 * and the peer_net for that src_nid is unhealthy. find a route to
-	 * the destination nid.
+	/* If we are routing the message then we keep the src_nid that was
+	 * set by the originator. If we are not routing then we are the
+	 * originator and set it here.
 	 */
-	if (!peer_net ||
-	    (src_nid != LNET_NID_ANY &&
-	     !lnet_is_peer_net_healthy_locked(peer_net))) {
-		best_gw = lnet_find_route_locked(best_ni->ni_net,
-						 dst_nid,
-						 rtr_nid);
-		/*
-		 * if no route is found for that network then
-		 * move onto the next peer_ni in the peer
-		 */
-		if (!best_gw) {
-			LCONSOLE_WARN("No route to peer from %s\n",
-				      libcfs_nid2str(best_ni->ni_nid));
-			lnet_net_unlock(cpt);
-			return -EHOSTUNREACH;
-		}
-
-		CDEBUG(D_NET, "Best route to %s via %s for %s %d\n",
-			libcfs_nid2str(dst_nid),
-			libcfs_nid2str(best_gw->lpni_nid),
-			lnet_msgtyp2str(msg->msg_type), msg->msg_len);
+	if (!msg->msg_routing)
+		msg->msg_hdr.src_nid = cpu_to_le64(msg->msg_txni->ni_nid);
 
-		routing2 = true;
-		/*
-		 * RULE: Each node considers only the next-hop
+	if (routing) {
+		msg->msg_target_is_router = 1;
+		msg->msg_target.pid = LNET_PID_LUSTRE;
+		/* since we're routing we want to ensure that the
+		 * msg_hdr.dest_nid is set to the final destination. When
+		 * the router receives this message it knows how to route
+		 * it.
 		 *
-		 * We're going to route the message, so change the peer to
-		 * the router.
+		 * final_dst_lpni is set at the beginning of the
+		 * lnet_select_pathway() function and is never changed.
+		 * It's safe to use it here.
 		 */
-		LASSERT(best_gw->lpni_peer_net);
-		LASSERT(best_gw->lpni_peer_net->lpn_peer);
-		peer = best_gw->lpni_peer_net->lpn_peer;
-	} else if (!lnet_is_peer_net_healthy_locked(peer_net)) {
-		/*
-		 * this peer_net is unhealthy but we still have an opportunity
-		 * to find another peer_net that we can use
+		msg->msg_hdr.dest_nid = cpu_to_le64(final_dst_lpni->lpni_nid);
+	} else {
+		/* if we're not routing set the dest_nid to the best peer
+		 * ni NID that we picked earlier in the algorithm.
 		 */
-		u32 net_id = peer_net->lpn_net_id;
-
-		LCONSOLE_WARN("peer net %s unhealthy\n",
-			      libcfs_net2str(net_id));
-		goto again;
+		msg->msg_hdr.dest_nid = cpu_to_le64(msg->msg_txpeer->lpni_nid);
 	}
 
+	rc = lnet_post_send_locked(msg, 0);
+	if (!rc)
+		CDEBUG(D_NET, "TRACE: %s(%s:%s) -> %s(%s:%s) : %s\n",
+		       libcfs_nid2str(msg->msg_hdr.src_nid),
+		       libcfs_nid2str(msg->msg_txni->ni_nid),
+		       libcfs_nid2str(sd->sd_src_nid),
+		       libcfs_nid2str(msg->msg_hdr.dest_nid),
+		       libcfs_nid2str(sd->sd_dst_nid),
+		       libcfs_nid2str(msg->msg_txpeer->lpni_nid),
+		       lnet_msgtyp2str(msg->msg_type));
+
+	return rc;
+}
+
+static struct lnet_peer_ni *
+lnet_select_peer_ni(struct lnet_send_data *sd, struct lnet_peer *peer,
+		    struct lnet_peer_net *peer_net)
+{
 	/*
 	 * Look at the peer NIs for the destination peer that connect
 	 * to the chosen net. If a peer_ni is preferred when using the
@@ -1758,20 +1511,30 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 	 * the available transmit credits are used. If the transmit
 	 * credits are equal, we round-robin over the peer_ni.
 	 */
-	lpni = NULL;
-	best_lpni_credits = INT_MIN;
-	preferred = false;
-	best_lpni = NULL;
+	struct lnet_peer_ni *lpni = NULL;
+	struct lnet_peer_ni *best_lpni = NULL;
+	struct lnet_ni *best_ni = sd->sd_best_ni;
+	lnet_nid_t dst_nid = sd->sd_dst_nid;
+	int best_lpni_credits = INT_MIN;
+	bool preferred = false;
+	bool ni_is_pref;
+
 	while ((lpni = lnet_get_next_peer_ni_locked(peer, peer_net, lpni))) {
-		/*
-		 * if this peer ni is not healthy just skip it, no point in
-		 * examining it further
+		/* if the best_ni we've chosen aleady has this lpni
+		 * preferred, then let's use it
 		 */
-		if (!lnet_is_peer_ni_healthy_locked(lpni))
-			continue;
 		ni_is_pref = lnet_peer_is_pref_nid_locked(lpni,
 							  best_ni->ni_nid);
 
+		CDEBUG(D_NET, "%s ni_is_pref = %d\n",
+		       libcfs_nid2str(best_ni->ni_nid), ni_is_pref);
+
+		if (best_lpni)
+			CDEBUG(D_NET, "%s c:[%d, %d], s:[%d, %d]\n",
+			       libcfs_nid2str(lpni->lpni_nid),
+			       lpni->lpni_txcredits, best_lpni_credits,
+			       lpni->lpni_seq, best_lpni->lpni_seq);
+
 		/* if this is a preferred peer use it */
 		if (!preferred && ni_is_pref) {
 			preferred = true;
@@ -1810,131 +1573,766 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 		u32 net_id = peer_net ? peer_net->lpn_net_id :
 					LNET_NIDNET(dst_nid);
 
-		lnet_net_unlock(cpt);
-		LCONSOLE_WARN("no peer_ni found on peer net %s\n",
-			      libcfs_net2str(net_id));
-		return -EHOSTUNREACH;
+		CDEBUG(D_NET, "no peer_ni found on peer net %s\n",
+		       libcfs_net2str(net_id));
+		return NULL;
 	}
 
-send:
-	/* Shortcut for loopback. */
-	if (best_ni == the_lnet.ln_loni) {
-		/* No send credit hassles with LOLND */
-		lnet_ni_addref_locked(best_ni, cpt);
-		msg->msg_hdr.dest_nid = cpu_to_le64(best_ni->ni_nid);
-		if (!msg->msg_routing)
-			msg->msg_hdr.src_nid = cpu_to_le64(best_ni->ni_nid);
-		msg->msg_target.nid = best_ni->ni_nid;
-		lnet_msg_commit(msg, cpt);
-		msg->msg_txni = best_ni;
-		lnet_net_unlock(cpt);
-
-		return LNET_CREDIT_OK;
-	}
+	CDEBUG(D_NET, "sd_best_lpni = %s\n",
+	       libcfs_nid2str(best_lpni->lpni_nid));
 
-	routing = routing || routing2;
+	return best_lpni;
+}
 
-	/*
-	 * Increment sequence number of the peer selected so that we
-	 * pick the next one in Round Robin.
-	 */
-	best_lpni->lpni_seq++;
+/* Prerequisite: the best_ni should already be set in the sd
+ */
+static inline struct lnet_peer_ni *
+lnet_find_best_lpni_on_net(struct lnet_send_data *sd, struct lnet_peer *peer,
+			   u32 net_id)
+{
+	struct lnet_peer_net *peer_net;
 
-	/*
-	 * grab a reference on the peer_ni so it sticks around even if
-	 * we need to drop and relock the lnet_net_lock below.
+	/* The gateway is Multi-Rail capable so now we must select the
+	 * proper peer_ni
 	 */
-	lnet_peer_ni_addref_locked(best_lpni);
+	peer_net = lnet_peer_get_net_locked(peer, net_id);
 
-	/*
-	 * Use lnet_cpt_of_nid() to determine the CPT used to commit the
-	 * message. This ensures that we get a CPT that is correct for
-	 * the NI when the NI has been restricted to a subset of all CPTs.
-	 * If the selected CPT differs from the one currently locked, we
-	 * must unlock and relock the lnet_net_lock(), and then check whether
-	 * the configuration has changed. We don't have a hold on the best_ni
-	 * yet, and it may have vanished.
+	if (!peer_net) {
+		CERROR("gateway peer %s has no NI on net %s\n",
+		       libcfs_nid2str(peer->lp_primary_nid),
+		       libcfs_net2str(net_id));
+		return NULL;
+	}
+
+	return lnet_select_peer_ni(sd, peer, peer_net);
+}
+
+static inline void
+lnet_set_non_mr_pref_nid(struct lnet_send_data *sd)
+{
+	if (sd->sd_send_case & NMR_DST &&
+	    sd->sd_msg->msg_type != LNET_MSG_REPLY &&
+	    sd->sd_msg->msg_type != LNET_MSG_ACK &&
+	    sd->sd_best_lpni->lpni_pref_nnids == 0) {
+		CDEBUG(D_NET, "Setting preferred local NID %s on NMR peer %s\n",
+		       libcfs_nid2str(sd->sd_best_ni->ni_nid),
+		       libcfs_nid2str(sd->sd_best_lpni->lpni_nid));
+		lnet_peer_ni_set_non_mr_pref_nid(sd->sd_best_lpni,
+						 sd->sd_best_ni->ni_nid);
+	}
+}
+
+/* Source Specified
+ * Local Destination
+ * non-mr peer
+ *
+ * use the source and destination NIDs as the pathway
+ */
+static int
+lnet_handle_spec_local_nmr_dst(struct lnet_send_data *sd)
+{
+	/* the destination lpni is set before we get here. */
+
+	/* find local NI */
+	sd->sd_best_ni = lnet_nid2ni_locked(sd->sd_src_nid, sd->sd_cpt);
+	if (!sd->sd_best_ni) {
+		CERROR("Can't send to %s: src %s is not a local nid\n",
+		       libcfs_nid2str(sd->sd_dst_nid),
+		       libcfs_nid2str(sd->sd_src_nid));
+		return -EINVAL;
+	}
+
+	/* the preferred NID will only be set for NMR peers
 	 */
-	cpt2 = lnet_cpt_of_nid_locked(best_lpni->lpni_nid, best_ni);
-	if (cpt != cpt2) {
-		u32 seq = lnet_get_dlc_seq_locked();
-		lnet_net_unlock(cpt);
-		cpt = cpt2;
-		lnet_net_lock(cpt);
-		if (seq != lnet_get_dlc_seq_locked()) {
-			lnet_peer_ni_decref_locked(best_lpni);
-			goto again;
-		}
+	lnet_set_non_mr_pref_nid(sd);
+
+	return lnet_handle_send(sd);
+}
+
+/* Source Specified
+ * Local Destination
+ * MR Peer
+ *
+ * Run the selection algorithm on the peer NIs unless we're sending
+ * a response, in this case just send to the destination
+ */
+static int
+lnet_handle_spec_local_mr_dst(struct lnet_send_data *sd)
+{
+	sd->sd_best_ni = lnet_nid2ni_locked(sd->sd_src_nid, sd->sd_cpt);
+	if (!sd->sd_best_ni) {
+		CERROR("Can't send to %s: src %s is not a local nid\n",
+		       libcfs_nid2str(sd->sd_dst_nid),
+		       libcfs_nid2str(sd->sd_src_nid));
+		return -EINVAL;
 	}
 
-	/*
-	 * store the best_lpni in the message right away to avoid having
-	 * to do the same operation under different conditions
+	/* only run the selection algorithm to pick the peer_ni if we're
+	 * sending a GET or a PUT. Responses are sent to the same
+	 * destination NID provided.
 	 */
-	msg->msg_txpeer = best_lpni;
-	msg->msg_txni = best_ni;
+	if (!(sd->sd_send_case & SND_RESP)) {
+		sd->sd_best_lpni =
+		  lnet_find_best_lpni_on_net(sd, sd->sd_peer,
+					     sd->sd_best_ni->ni_net->net_id);
+	}
 
-	/*
-	 * grab a reference for the best_ni since now it's in use in this
-	 * send. the reference will need to be dropped when the message is
-	 * finished in lnet_finalize()
+	if (sd->sd_best_lpni)
+		return lnet_handle_send(sd);
+
+	CERROR("can't send to %s. no NI on %s\n",
+	       libcfs_nid2str(sd->sd_dst_nid),
+	       libcfs_net2str(sd->sd_best_ni->ni_net->net_id));
+
+	return -EHOSTUNREACH;
+}
+
+struct lnet_ni *
+lnet_find_best_ni_on_spec_net(struct lnet_ni *cur_best_ni,
+			      struct lnet_peer *peer,
+			      struct lnet_peer_net *peer_net,
+			      int cpt,
+			      bool incr_seq)
+{
+	struct lnet_net *local_net;
+	struct lnet_ni *best_ni;
+
+	local_net = lnet_get_net_locked(peer_net->lpn_net_id);
+	if (!local_net)
+		return NULL;
+
+	/* Iterate through the NIs in this local Net and select
+	 * the NI to send from. The selection is determined by
+	 * these 3 criterion in the following priority:
+	 *	1. NUMA
+	 *	2. NI available credits
+	 *	3. Round Robin
 	 */
-	lnet_ni_addref_locked(msg->msg_txni, cpt);
+	best_ni = lnet_get_best_ni(local_net, cur_best_ni,
+				   peer, peer_net, cpt);
 
-	/*
-	 * Always set the target.nid to the best peer picked. Either the
-	 * nid will be one of the preconfigured NIDs, or the same NID as
-	 * what was originally set in the target or it will be the NID of
-	 * a router if this message should be routed
+	if (incr_seq && best_ni)
+		best_ni->ni_seq++;
+
+	return best_ni;
+}
+
+static int
+lnet_handle_find_routed_path(struct lnet_send_data *sd,
+			     lnet_nid_t dst_nid,
+			     struct lnet_peer_ni **gw_lpni,
+			     struct lnet_peer **gw_peer)
+{
+	struct lnet_peer_ni *gw;
+	lnet_nid_t src_nid = sd->sd_src_nid;
+
+	gw = lnet_find_route_locked(NULL, LNET_NIDNET(dst_nid),
+				    sd->sd_rtr_nid);
+	if (!gw) {
+		CERROR("no route to %s from %s\n",
+		       libcfs_nid2str(dst_nid), libcfs_nid2str(src_nid));
+		return -EHOSTUNREACH;
+	}
+
+	/* get the peer of the gw_ni */
+	LASSERT(gw->lpni_peer_net);
+	LASSERT(gw->lpni_peer_net->lpn_peer);
+
+	*gw_peer = gw->lpni_peer_net->lpn_peer;
+
+	if (!sd->sd_best_ni)
+		sd->sd_best_ni =
+			lnet_find_best_ni_on_spec_net(NULL, *gw_peer,
+						      gw->lpni_peer_net,
+						      sd->sd_md_cpt,
+						      true);
+
+	if (!sd->sd_best_ni) {
+		CERROR("Internal Error. Expected local ni on %s but non found :%s\n",
+		       libcfs_net2str(gw->lpni_peer_net->lpn_net_id),
+		       libcfs_nid2str(sd->sd_src_nid));
+		return -EFAULT;
+	}
+
+	/* if gw is MR let's find its best peer_ni
 	 */
-	msg->msg_target.nid = msg->msg_txpeer->lpni_nid;
+	if (lnet_peer_is_multi_rail(*gw_peer)) {
+		gw = lnet_find_best_lpni_on_net(sd, *gw_peer,
+						sd->sd_best_ni->ni_net->net_id);
+		/* We've already verified that the gw has an NI on that
+		 * desired net, but we're not finding it. Something is
+		 * wrong.
+		 */
+		if (!gw) {
+			CERROR("Internal Error. Route expected to %s from %s\n",
+			       libcfs_nid2str(dst_nid),
+			       libcfs_nid2str(src_nid));
+			return -EFAULT;
+		}
+	}
 
-	/*
-	 * lnet_msg_commit assigns the correct cpt to the message, which
-	 * is used to decrement the correct refcount on the ni when it's
-	 * time to return the credits
+	*gw_lpni = gw;
+
+	return 0;
+}
+
+/* Handle two cases:
+ *
+ * Case 1:
+ *  Source specified
+ *  Remote destination
+ *  Non-MR destination
+ *
+ * Case 2:
+ *  Source specified
+ *  Remote destination
+ *  MR destination
+ *
+ * The handling of these two cases is similar. Even though the destination
+ * can be MR or non-MR, we'll deal directly with the router.
+ */
+static int
+lnet_handle_spec_router_dst(struct lnet_send_data *sd)
+{
+	int rc;
+	struct lnet_peer_ni *gw_lpni = NULL;
+	struct lnet_peer *gw_peer = NULL;
+
+	/* find local NI */
+	sd->sd_best_ni = lnet_nid2ni_locked(sd->sd_src_nid, sd->sd_cpt);
+	if (!sd->sd_best_ni) {
+		CERROR("Can't send to %s: src %s is not a local nid\n",
+		       libcfs_nid2str(sd->sd_dst_nid),
+		       libcfs_nid2str(sd->sd_src_nid));
+		return -EINVAL;
+	}
+
+	rc = lnet_handle_find_routed_path(sd, sd->sd_dst_nid, &gw_lpni,
+					  &gw_peer);
+	if (rc < 0)
+		return rc;
+
+	if (sd->sd_send_case & NMR_DST)
+		/* since the final destination is non-MR let's set its preferred
+		 * NID before we send
+		 */
+		lnet_set_non_mr_pref_nid(sd);
+
+	/* We're going to send to the gw found so let's set its
+	 * info
 	 */
-	lnet_msg_commit(msg, cpt);
+	sd->sd_peer = gw_peer;
+	sd->sd_best_lpni = gw_lpni;
 
-	/*
-	 * If we are routing the message then we don't need to overwrite
-	 * the src_nid since it would've been set at the origin. Otherwise
-	 * we are the originator so we need to set it.
+	return lnet_handle_send(sd);
+}
+
+struct lnet_ni *
+lnet_find_best_ni_on_local_net(struct lnet_peer *peer, int md_cpt)
+{
+	struct lnet_peer_net *peer_net = NULL;
+	struct lnet_ni *best_ni = NULL;
+
+	/* The peer can have multiple interfaces, some of them can be on
+	 * the local network and others on a routed network. We should
+	 * prefer the local network. However if the local network is not
+	 * available then we need to try the routed network
 	 */
-	if (!msg->msg_routing)
-		msg->msg_hdr.src_nid = cpu_to_le64(msg->msg_txni->ni_nid);
 
-	if (routing) {
-		msg->msg_target_is_router = 1;
-		msg->msg_target.pid = LNET_PID_LUSTRE;
-		/*
-		 * since we're routing we want to ensure that the
-		 * msg_hdr.dest_nid is set to the final destination. When
-		 * the router receives this message it knows how to route
-		 * it.
-		 */
-		msg->msg_hdr.dest_nid =
-			cpu_to_le64(final_dst ? final_dst->lpni_nid : dst_nid);
-	} else {
-		/*
-		 * if we're not routing set the dest_nid to the best peer
-		 * ni that we picked earlier in the algorithm.
+	/* go through all the peer nets and find the best_ni */
+	list_for_each_entry(peer_net, &peer->lp_peer_nets, lpn_peer_nets) {
+		/* The peer's list of nets can contain non-local nets. We
+		 * want to only examine the local ones.
 		 */
-		msg->msg_hdr.dest_nid = cpu_to_le64(msg->msg_txpeer->lpni_nid);
+		if (!lnet_get_net_locked(peer_net->lpn_net_id))
+			continue;
+		best_ni = lnet_find_best_ni_on_spec_net(best_ni, peer,
+							peer_net, md_cpt,
+							false);
 	}
 
-	rc = lnet_post_send_locked(msg, 0);
+	if (best_ni)
+		/* increment sequence number so we can round robin */
+		best_ni->ni_seq++;
+
+	return best_ni;
+}
+
+static struct lnet_ni *
+lnet_find_existing_preferred_best_ni(struct lnet_send_data *sd)
+{
+	struct lnet_ni *best_ni = NULL;
+	struct lnet_peer_net *peer_net;
+	struct lnet_peer *peer = sd->sd_peer;
+	struct lnet_peer_ni *best_lpni = sd->sd_best_lpni;
+	struct lnet_peer_ni *lpni;
+	int cpt = sd->sd_cpt;
+
+	/* We must use a consistent source address when sending to a
+	 * non-MR peer. However, a non-MR peer can have multiple NIDs
+	 * on multiple networks, and we may even need to talk to this
+	 * peer on multiple networks -- certain types of
+	 * load-balancing configuration do this.
+	 *
+	 * So we need to pick the NI the peer prefers for this
+	 * particular network.
+	 */
+
+	/* Get the target peer_ni */
+	peer_net = lnet_peer_get_net_locked(peer,
+					    LNET_NIDNET(best_lpni->lpni_nid));
+	LASSERT(peer_net);
+	list_for_each_entry(lpni, &peer_net->lpn_peer_nis,
+			    lpni_peer_nis) {
+		if (lpni->lpni_pref_nnids == 0)
+			continue;
+		LASSERT(lpni->lpni_pref_nnids == 1);
+		best_ni = lnet_nid2ni_locked(lpni->lpni_pref.nid, cpt);
+		break;
+	}
+
+	return best_ni;
+}
+
+/* Prerequisite: sd->sd_peer and sd->sd_best_lpni should be set */
+static int
+lnet_select_preferred_best_ni(struct lnet_send_data *sd)
+{
+	struct lnet_ni *best_ni = NULL;
+	struct lnet_peer_ni *best_lpni = sd->sd_best_lpni;
+
+	/* We must use a consistent source address when sending to a
+	 * non-MR peer. However, a non-MR peer can have multiple NIDs
+	 * on multiple networks, and we may even need to talk to this
+	 * peer on multiple networks -- certain types of
+	 * load-balancing configuration do this.
+	 *
+	 * So we need to pick the NI the peer prefers for this
+	 * particular network.
+	 */
+
+	best_ni = lnet_find_existing_preferred_best_ni(sd);
+
+	/* if best_ni is still not set just pick one */
+	if (!best_ni) {
+		best_ni =
+			lnet_find_best_ni_on_spec_net(NULL, sd->sd_peer,
+						      sd->sd_best_lpni->lpni_peer_net,
+						      sd->sd_md_cpt, true);
+		/* If there is no best_ni we don't have a route */
+		if (!best_ni) {
+			CERROR("no path to %s from net %s\n",
+			       libcfs_nid2str(best_lpni->lpni_nid),
+			       libcfs_net2str(best_lpni->lpni_net->net_id));
+			return -EHOSTUNREACH;
+		}
+	}
+
+	sd->sd_best_ni = best_ni;
+
+	/* Set preferred NI if necessary. */
+	lnet_set_non_mr_pref_nid(sd);
+
+	return 0;
+}
+
+/* Source not specified
+ * Local destination
+ * Non-MR Peer
+ *
+ * always use the same source NID for NMR peers
+ * If we've talked to that peer before then we already have a preferred
+ * source NI associated with it. Otherwise, we select a preferred local NI
+ * and store it in the peer
+ */
+static int
+lnet_handle_any_local_nmr_dst(struct lnet_send_data *sd)
+{
+	int rc;
+
+	/* sd->sd_best_lpni is already set to the final destination */
+
+	/* At this point we should've created the peer ni and peer. If we
+	 * can't find it, then something went wrong. Instead of assert
+	 * output a relevant message and fail the send
+	 */
+	if (!sd->sd_best_lpni) {
+		CERROR("Internal fault. Unable to send msg %s to %s. NID not known\n",
+		       lnet_msgtyp2str(sd->sd_msg->msg_type),
+		       libcfs_nid2str(sd->sd_dst_nid));
+		return -EFAULT;
+	}
+
+	rc = lnet_select_preferred_best_ni(sd);
 	if (!rc)
-		CDEBUG(D_NET, "TRACE: %s(%s:%s) -> %s(%s:%s) : %s\n",
-		       libcfs_nid2str(msg->msg_hdr.src_nid),
-		       libcfs_nid2str(msg->msg_txni->ni_nid),
-		       libcfs_nid2str(src_nid),
-		       libcfs_nid2str(msg->msg_hdr.dest_nid),
-		       libcfs_nid2str(dst_nid),
-		       libcfs_nid2str(msg->msg_txpeer->lpni_nid),
-		       lnet_msgtyp2str(msg->msg_type));
+		rc = lnet_handle_send(sd);
 
-	lnet_net_unlock(cpt);
+	return rc;
+}
+
+static int
+lnet_handle_any_mr_dsta(struct lnet_send_data *sd)
+{
+	/* NOTE we've already handled the remote peer case. So we only
+	 * need to worry about the local case here.
+	 *
+	 * if we're sending a response, ACK or reply, we need to send it
+	 * to the destination NID given to us. At this point we already
+	 * have the peer_ni we're suppose to send to, so just find the
+	 * best_ni on the peer net and use that. Since we're sending to an
+	 * MR peer then we can just run the selection algorithm on our
+	 * local NIs and pick the best one.
+	 */
+	if (sd->sd_send_case & SND_RESP) {
+		sd->sd_best_ni =
+		  lnet_find_best_ni_on_spec_net(NULL, sd->sd_peer,
+						sd->sd_best_lpni->lpni_peer_net,
+						sd->sd_md_cpt, true);
+
+		if (!sd->sd_best_ni) {
+			/* We're not going to deal with not able to send
+			 * a response to the provided final destination
+			 */
+			CERROR("Can't send response to %s. No local NI available\n",
+			       libcfs_nid2str(sd->sd_dst_nid));
+			return -EHOSTUNREACH;
+		}
+
+		return lnet_handle_send(sd);
+	}
+
+	/* If we get here that means we're sending a fresh request, PUT or
+	 * GET, so we need to run our standard selection algorithm.
+	 * First find the best local interface that's on any of the peer's
+	 * networks.
+	 */
+	sd->sd_best_ni = lnet_find_best_ni_on_local_net(sd->sd_peer,
+							sd->sd_md_cpt);
+	if (sd->sd_best_ni) {
+		sd->sd_best_lpni =
+		  lnet_find_best_lpni_on_net(sd, sd->sd_peer,
+					     sd->sd_best_ni->ni_net->net_id);
+
+		/* if we're successful in selecting a peer_ni on the local
+		 * network, then send to it. Otherwise fall through and
+		 * try and see if we can reach it over another routed
+		 * network
+		 */
+		if (sd->sd_best_lpni) {
+			/* in case we initially started with a routed
+			 * destination, let's reset to local
+			 */
+			sd->sd_send_case &= ~REMOTE_DST;
+			sd->sd_send_case |= LOCAL_DST;
+			return lnet_handle_send(sd);
+		}
+
+		CERROR("Internal Error. Expected to have a best_lpni: %s -> %s\n",
+		       libcfs_nid2str(sd->sd_src_nid),
+		       libcfs_nid2str(sd->sd_dst_nid));
+
+		return -EFAULT;
+	}
+
+	/* Peer doesn't have a local network. Let's see if there is
+	 * a remote network we can reach it on.
+	 */
+	return PASS_THROUGH;
+}
+
+/* Case 1:
+ *	Source NID not specified
+ *	Local destination
+ *	MR peer
+ *
+ * Case 2:
+ *	Source NID not speified
+ *	Remote destination
+ *	MR peer
+ *
+ * In both of these cases if we're sending a response, ACK or REPLY, then
+ * we need to send to the destination NID provided.
+ *
+ * In the remote case let's deal with MR routers.
+ *
+ */
+static int
+lnet_handle_any_mr_dst(struct lnet_send_data *sd)
+{
+	int rc = 0;
+	struct lnet_peer *gw_peer = NULL;
+	struct lnet_peer_ni *gw_lpni = NULL;
+
+	/* handle sending a response to a remote peer here so we don't
+	 * have to worry about it if we hit lnet_handle_any_mr_dsta()
+	 */
+	if (sd->sd_send_case & REMOTE_DST &&
+	    sd->sd_send_case & SND_RESP) {
+		struct lnet_peer_ni *gw;
+		struct lnet_peer *gw_peer;
+
+		rc = lnet_handle_find_routed_path(sd, sd->sd_dst_nid, &gw,
+						  &gw_peer);
+		if (rc < 0) {
+			CERROR("Can't send response to %s. No route available\n",
+			       libcfs_nid2str(sd->sd_dst_nid));
+			return -EHOSTUNREACH;
+		}
+
+		sd->sd_best_lpni = gw;
+		sd->sd_peer = gw_peer;
+
+		return lnet_handle_send(sd);
+	}
+
+	/* Even though the NID for the peer might not be on a local network,
+	 * since the peer is MR there could be other interfaces on the
+	 * local network. In that case we'd still like to prefer the local
+	 * network over the routed network. If we're unable to do that
+	 * then we select the best router among the different routed networks,
+	 * and if the router is MR then we can deal with it as such.
+	 */
+	rc = lnet_handle_any_mr_dsta(sd);
+	if (rc != PASS_THROUGH)
+		return rc;
+
+	/* TODO; One possible enhancement is to run the selection
+	 * algorithm on the peer. However for remote peers the credits are
+	 * not decremented, so we'll be basically going over the peer NIs
+	 * in round robin. An MR router will run the selection algorithm
+	 * on the next-hop interfaces.
+	 */
+	rc = lnet_handle_find_routed_path(sd, sd->sd_dst_nid, &gw_lpni,
+					  &gw_peer);
+	if (rc < 0)
+		return rc;
+
+	sd->sd_send_case &= ~LOCAL_DST;
+	sd->sd_send_case |= REMOTE_DST;
+
+	sd->sd_peer = gw_peer;
+	sd->sd_best_lpni = gw_lpni;
+
+	return lnet_handle_send(sd);
+}
+
+/* Source not specified
+ * Remote destination
+ * Non-MR peer
+ *
+ * Must send to the specified peer NID using the same source NID that
+ * we've used before. If it's the first time to talk to that peer then
+ * find the source NI and assign it as preferred to that peer
+ */
+static int
+lnet_handle_any_router_nmr_dst(struct lnet_send_data *sd)
+{
+	int rc;
+	struct lnet_peer_ni *gw_lpni = NULL;
+	struct lnet_peer *gw_peer = NULL;
+
+	/* Let's set if we have a preferred NI to talk to this NMR peer
+	 */
+	sd->sd_best_ni = lnet_find_existing_preferred_best_ni(sd);
+
+	/* find the router and that'll find the best NI if we didn't find
+	 * it already.
+	 */
+	rc = lnet_handle_find_routed_path(sd, sd->sd_dst_nid, &gw_lpni,
+					  &gw_peer);
+	if (rc < 0)
+		return rc;
+
+	/* set the best_ni we've chosen as the preferred one for
+	 * this peer
+	 */
+	lnet_set_non_mr_pref_nid(sd);
+
+	/* we'll be sending to the gw */
+	sd->sd_best_lpni = gw_lpni;
+	sd->sd_peer = gw_peer;
+
+	return lnet_handle_send(sd);
+}
+
+static int
+lnet_handle_send_case_locked(struct lnet_send_data *sd)
+{
+	/* Turn off the SND_RESP bit.
+	 * It will be checked in the case handling
+	 */
+	u32 send_case = sd->sd_send_case &= ~SND_RESP;
+
+	CDEBUG(D_NET, "Source %s%s to %s %s %s destination\n",
+	       (send_case & SRC_SPEC) ? "Specified: " : "ANY",
+	       (send_case & SRC_SPEC) ? libcfs_nid2str(sd->sd_src_nid) : "",
+	       (send_case & MR_DST) ? "MR: " : "NMR: ",
+	       libcfs_nid2str(sd->sd_dst_nid),
+	       (send_case & LOCAL_DST) ? "local" : "routed");
+
+	switch (send_case) {
+	/* For all cases where the source is specified, we should always
+	 * use the destination NID, whether it's an MR destination or not,
+	 * since we're continuing a series of related messages for the
+	 * same RPC
+	 */
+	case SRC_SPEC_LOCAL_NMR_DST:
+		return lnet_handle_spec_local_nmr_dst(sd);
+	case SRC_SPEC_LOCAL_MR_DST:
+		return lnet_handle_spec_local_mr_dst(sd);
+	case SRC_SPEC_ROUTER_NMR_DST:
+	case SRC_SPEC_ROUTER_MR_DST:
+		return lnet_handle_spec_router_dst(sd);
+	case SRC_ANY_LOCAL_NMR_DST:
+		return lnet_handle_any_local_nmr_dst(sd);
+	case SRC_ANY_LOCAL_MR_DST:
+	case SRC_ANY_ROUTER_MR_DST:
+		return lnet_handle_any_mr_dst(sd);
+	case SRC_ANY_ROUTER_NMR_DST:
+		return lnet_handle_any_router_nmr_dst(sd);
+	default:
+		CERROR("Unknown send case\n");
+		return -1;
+	}
+}
+
+static int
+lnet_select_pathway(lnet_nid_t src_nid, lnet_nid_t dst_nid,
+		    struct lnet_msg *msg, lnet_nid_t rtr_nid)
+{
+	struct lnet_peer_ni *lpni;
+	struct lnet_peer *peer;
+	struct lnet_send_data send_data;
+	int cpt, rc;
+	int md_cpt;
+	u32 send_case = 0;
+
+	memset(&send_data, 0, sizeof(send_data));
+
+	/* get an initial CPT to use for locking. The idea here is not to
+	 * serialize the calls to select_pathway, so that as many
+	 * operations can run concurrently as possible. To do that we use
+	 * the CPT where this call is being executed. Later on when we
+	 * determine the CPT to use in lnet_message_commit, we switch the
+	 * lock and check if there was any configuration change.  If none,
+	 * then we proceed, if there is, then we restart the operation.
+	 */
+	cpt = lnet_net_lock_current();
+
+	md_cpt = lnet_cpt_of_md(msg->msg_md, msg->msg_offset);
+	if (md_cpt == CFS_CPT_ANY)
+		md_cpt = cpt;
+
+again:
+	/* If we're being asked to send to the loopback interface, there
+	 * is no need to go through any selection. We can just shortcut
+	 * the entire process and send over lolnd
+	 */
+	if (LNET_NETTYP(LNET_NIDNET(dst_nid)) == LOLND) {
+		/* No send credit hassles with LOLND */
+		lnet_ni_addref_locked(the_lnet.ln_loni, cpt);
+		msg->msg_hdr.dest_nid = cpu_to_le64(the_lnet.ln_loni->ni_nid);
+		if (!msg->msg_routing)
+			msg->msg_hdr.src_nid =
+				cpu_to_le64(the_lnet.ln_loni->ni_nid);
+		msg->msg_target.nid = the_lnet.ln_loni->ni_nid;
+		lnet_msg_commit(msg, cpt);
+		msg->msg_txni = the_lnet.ln_loni;
+		lnet_net_unlock(cpt);
+
+		return LNET_CREDIT_OK;
+	}
+
+	/* find an existing peer_ni, or create one and mark it as having been
+	 * created due to network traffic. This call will create the
+	 * peer->peer_net->peer_ni tree.
+	 */
+	lpni = lnet_nid2peerni_locked(dst_nid, LNET_NID_ANY, cpt);
+	if (IS_ERR(lpni)) {
+		lnet_net_unlock(cpt);
+		return PTR_ERR(lpni);
+	}
+
+	/* Now that we have a peer_ni, check if we want to discover
+	 * the peer. Traffic to the LNET_RESERVED_PORTAL should not
+	 * trigger discovery.
+	 */
+	peer = lpni->lpni_peer_net->lpn_peer;
+	if (lnet_msg_discovery(msg) && !lnet_peer_is_uptodate(peer)) {
+		lnet_nid_t primary_nid;
+
+		rc = lnet_discover_peer_locked(lpni, cpt, false);
+		if (rc) {
+			lnet_peer_ni_decref_locked(lpni);
+			lnet_net_unlock(cpt);
+			return rc;
+		}
+		/* The peer may have changed. */
+		peer = lpni->lpni_peer_net->lpn_peer;
+		/* queue message and return */
+		msg->msg_src_nid_param = src_nid;
+		msg->msg_rtr_nid_param = rtr_nid;
+		msg->msg_sending = 0;
+		list_add_tail(&msg->msg_list, &peer->lp_dc_pendq);
+		lnet_peer_ni_decref_locked(lpni);
+		primary_nid = peer->lp_primary_nid;
+		lnet_net_unlock(cpt);
+
+		CDEBUG(D_NET, "%s pending discovery\n",
+		       libcfs_nid2str(primary_nid));
+
+		return LNET_DC_WAIT;
+	}
+	lnet_peer_ni_decref_locked(lpni);
+
+	/* If peer is not healthy then can not send anything to it */
+	if (!lnet_is_peer_healthy_locked(peer)) {
+		lnet_net_unlock(cpt);
+		return -EHOSTUNREACH;
+	}
+
+	/* Identify the different send cases
+	 */
+	if (src_nid == LNET_NID_ANY)
+		send_case |= SRC_ANY;
+	else
+		send_case |= SRC_SPEC;
+
+	if (lnet_get_net_locked(LNET_NIDNET(dst_nid)))
+		send_case |= LOCAL_DST;
+	else
+		send_case |= REMOTE_DST;
+
+	if (!lnet_peer_is_multi_rail(peer))
+		send_case |= NMR_DST;
+	else
+		send_case |= MR_DST;
+
+	if (msg->msg_type == LNET_MSG_REPLY ||
+	    msg->msg_type == LNET_MSG_ACK)
+		send_case |= SND_RESP;
+
+	/* assign parameters to the send_data */
+	send_data.sd_msg = msg;
+	send_data.sd_rtr_nid = rtr_nid;
+	send_data.sd_src_nid = src_nid;
+	send_data.sd_dst_nid = dst_nid;
+	send_data.sd_best_lpni = lpni;
+	/* keep a pointer to the final destination in case we're going to
+	 * route, so we'll need to access it later
+	 */
+	send_data.sd_final_dst_lpni = lpni;
+	send_data.sd_peer = peer;
+	send_data.sd_md_cpt = md_cpt;
+	send_data.sd_cpt = cpt;
+	send_data.sd_send_case = send_case;
+
+	rc = lnet_handle_send_case_locked(&send_data);
+
+	if (rc == REPEAT_SEND)
+		goto again;
+
+	lnet_net_unlock(send_data.sd_cpt);
 
 	return rc;
 }
-- 
1.8.3.1

  parent reply	other threads:[~2020-02-27 21:09 UTC|newest]

Thread overview: 626+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-27 21:07 [lustre-devel] [PATCH 000/622] lustre: sync closely to 2.13.52 James Simmons
2020-02-27 21:07 ` [lustre-devel] [PATCH 001/622] lustre: always enable special debugging, fhandles, and quota support James Simmons
2020-02-27 21:07 ` [lustre-devel] [PATCH 002/622] lustre: osc_cache: remove __might_sleep() James Simmons
2020-02-27 21:07 ` [lustre-devel] [PATCH 003/622] lustre: uapi: remove enum hsm_progress_states James Simmons
2020-02-27 21:07 ` [lustre-devel] [PATCH 004/622] lustre: uapi: sync enum obd_statfs_state James Simmons
2020-02-27 21:07 ` [lustre-devel] [PATCH 005/622] lustre: llite: return compatible fsid for statfs James Simmons
2020-02-27 21:07 ` [lustre-devel] [PATCH 006/622] lustre: ldlm: Make kvzalloc | kvfree use consistent James Simmons
2020-02-27 21:07 ` [lustre-devel] [PATCH 007/622] lustre: llite: limit smallest max_cached_mb value James Simmons
2020-02-27 21:07 ` [lustre-devel] [PATCH 008/622] lustre: obdecho: turn on async flag only for mode 3 James Simmons
2020-02-27 21:07 ` [lustre-devel] [PATCH 009/622] lustre: llite: reorganize variable and data structures James Simmons
2020-02-27 21:07 ` [lustre-devel] [PATCH 010/622] lustre: llite: increase whole-file readahead to RPC size James Simmons
2020-02-27 21:07 ` [lustre-devel] [PATCH 011/622] lustre: llite: handle ORPHAN/DEAD directories James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 012/622] lustre: lov: protected ost pool count updation James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 013/622] lustre: obdclass: fix llog_cat_cleanup() usage on Client James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 014/622] lustre: mdc: fix possible NULL pointer dereference James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 015/622] lustre: obdclass: allow specifying complex jobids James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 016/622] lustre: ldlm: don't disable softirq for exp_rpc_lock James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 017/622] lustre: obdclass: new wrapper to convert NID to string James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 018/622] lustre: ptlrpc: Add QoS for uid and gid in NRS-TBF James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 019/622] lustre: hsm: ignore compound_id James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 020/622] lnet: libcfs: remove unnecessary set_fs(KERNEL_DS) James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 021/622] lustre: ptlrpc: ptlrpc_register_bulk() LBUG on ENOMEM James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 022/622] lustre: llite: yield cpu after call to ll_agl_trigger James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 023/622] lustre: osc: Do not request more than 2GiB grant James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 024/622] lustre: llite: rename FSFILT_IOC_* to system flags James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 025/622] lnet: fix nid range format '*@<net>' support James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 026/622] lustre: ptlrpc: fix test_req_buffer_pressure behavior James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 027/622] lustre: lu_object: improve debug message for lu_object_put() James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 028/622] lustre: idl: remove obsolete directory split flags James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 029/622] lustre: mdc: resend quotactl if needed James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 030/622] lustre: obd: create ping sysfs file James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 031/622] lustre: ldlm: change LDLM_POOL_ADD_VAR macro to inline function James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 032/622] lustre: obdecho: use vmalloc for lnb James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 033/622] lustre: mdc: deny layout swap for DoM file James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 034/622] lustre: mgc: remove obsolete IR swabbing workaround James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 035/622] lustre: ptlrpc: add dir migration connect flag James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 036/622] lustre: mds: remove obsolete MDS_VTX_BYPASS flag James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 037/622] lustre: ldlm: expose dirty age limit for flush-on-glimpse James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 038/622] lustre: ldlm: IBITS lock convert instead of cancel James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 039/622] lustre: ptlrpc: fix return type of boolean functions James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 040/622] lustre: llite: decrease sa_running if fail to start statahead James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 041/622] lustre: lmv: dir page is released while in use James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 042/622] lustre: ldlm: speed up preparation for list of lock cancel James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 043/622] lustre: checksum: enable/disable checksum correctly James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 044/622] lustre: build: armv7 client build fixes James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 045/622] lustre: ldlm: fix l_last_activity usage James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 046/622] lustre: ptlrpc: Add WBC connect flag James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 047/622] lustre: llog: remove obsolete llog handlers James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 048/622] lustre: ldlm: fix for l_lru usage James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 049/622] lustre: lov: Move lov_tgts_kobj init to lov_setup James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 050/622] lustre: osc: add T10PI support for RPC checksum James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 051/622] lustre: ldlm: Reduce debug to console during eviction James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 052/622] lustre: ptlrpc: idle connections can disconnect James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 053/622] lustre: osc: truncate does not update blocks count on client James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 054/622] lustre: ptlrpc: add LOCK_CONVERT connection flag James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 055/622] lustre: ldlm: handle lock converts in cancel handler James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 056/622] lustre: ptlrpc: Serialize procfs access to scp_hist_reqs using mutex James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 057/622] lustre: ldlm: don't add canceling lock back to LRU James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 058/622] lustre: quota: add default quota setting support James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 059/622] lustre: ptlrpc: don't zero request handle James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 060/622] lnet: ko2iblnd: determine gaps correctly James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 061/622] lustre: osc: increase default max_dirty_mb to 2G James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 062/622] lustre: ptlrpc: remove obsolete OBD RPC opcodes James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 063/622] lustre: ptlrpc: assign specific values to MGS opcodes James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 064/622] lustre: ptlrpc: remove obsolete LLOG_ORIGIN_* RPCs James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 065/622] lustre: osc: fix idle_timeout handling James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 066/622] lustre: ptlrpc: ASSERTION(!list_empty(imp->imp_replay_cursor)) James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 067/622] lustre: obd: keep dirty_max_pages a round number of MB James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 068/622] lustre: osc: depart grant shrinking from pinger James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 069/622] lustre: mdt: Lazy size on MDT James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 070/622] lustre: lfsck: layout LFSCK for mirrored file James Simmons
2020-02-27 21:08 ` [lustre-devel] [PATCH 071/622] lustre: mdt: read on open for DoM files James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 072/622] lustre: migrate: pack lmv ea in migrate rpc James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 073/622] lustre: hsm: add OBD_CONNECT2_ARCHIVE_ID_ARRAY to pass archive_id lists in array James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 074/622] lustre: llite: handle zero length xattr values correctly James Simmons
2020-02-27 21:09 ` James Simmons [this message]
2020-02-27 21:09 ` [lustre-devel] [PATCH 076/622] lnet: add health value per ni James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 077/622] lnet: add lnet_health_sensitivity James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 078/622] lnet: add monitor thread James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 079/622] lnet: handle local ni failure James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 080/622] lnet: handle o2iblnd tx failure James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 081/622] lnet: handle socklnd " James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 082/622] lnet: handle remote errors in LNet James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 083/622] lnet: add retry count James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 084/622] lnet: calculate the lnd timeout James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 085/622] lnet: sysfs functions for module params James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 086/622] lnet: timeout delayed REPLYs and ACKs James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 087/622] lnet: remove duplicate timeout mechanism James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 088/622] lnet: handle fatal device error James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 089/622] lnet: reset health value James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 090/622] lnet: add health statistics James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 091/622] lnet: Add ioctl to get health stats James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 092/622] lnet: remove obsolete health functions James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 093/622] lnet: set health value from user space James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 094/622] lnet: add global health statistics James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 095/622] lnet: print recovery queues content James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 096/622] lnet: health error simulation James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 097/622] lustre: ptlrpc: replace simple_strtol with kstrtol James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 098/622] lustre: obd: use correct ip_compute_csum() version James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 099/622] lustre: osc: serialize access to idle_timeout vs cleanup James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 100/622] lustre: mdc: remove obsolete intent opcodes James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 101/622] lustre: llite: fix setstripe for specific osts upon dir James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 102/622] lustre: osc: enable/disable OSC grant shrink James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 103/622] lustre: protocol: MDT as a statfs proxy James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 104/622] lustre: ldlm: correct logic in ldlm_prepare_lru_list() James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 105/622] lustre: llite: check truncate race for DOM pages James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 106/622] lnet: lnd: conditionally set health status James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 107/622] lnet: router handling James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 108/622] lustre: obd: check '-o network' and peer discovery conflict James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 109/622] lnet: update logging James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 110/622] lustre: ldlm: don't cancel DoM locks before replay James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 111/622] lnet: lnd: Clean up logging James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 112/622] lustre: mdt: revoke lease lock for truncate James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 113/622] lustre: ptlrpc: race in AT early reply James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 114/622] lustre: migrate: migrate striped directory James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 115/622] lustre: obdclass: remove unused ll_import_cachep James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 116/622] lustre: ptlrpc: add debugging for idle connections James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 117/622] lustre: obdclass: Add lbug_on_eviction option James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 118/622] lustre: lmv: support accessing migrating directory James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 119/622] lustre: mdc: move RPC semaphore code to lustre/osp James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 120/622] lnet: libcfs: fix wrong check in libcfs_debug_vmsg2() James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 121/622] lustre: ptlrpc: new request vs disconnect race James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 122/622] lustre: misc: name open file handles as such James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 123/622] lustre: ldlm: cleanup LVB handling James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 124/622] lustre: ldlm: pass preallocated env to methods James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 125/622] lustre: osc: move obdo_cache to OSC code James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 126/622] lustre: llite: zero lum for stripeless files James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 127/622] lustre: idl: remove obsolete RPC flags James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 128/622] lustre: flr: add 'nosync' flag for FLR mirrors James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 129/622] lustre: llite: create checksums to replace checksum_pages James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 130/622] lustre: ptlrpc: don't change buffer when signature is ready James Simmons
2020-02-27 21:09 ` [lustre-devel] [PATCH 131/622] lustre: ldlm: update l_blocking_lock under lock James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 132/622] lustre: mgc: don't proccess cld during stopping James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 133/622] lustre: obdclass: make mod rpc slot wait queue FIFO James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 134/622] lustre: mdc: use old statfs format James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 135/622] lnet: Fix selftest backward compatibility post health James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 136/622] lustre: osc: clarify short_io_bytes is maximum value James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 137/622] lustre: ptlrpc: Make CPU binding switchable James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 138/622] lustre: misc: quiet console messages at startup James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 139/622] lustre: ldlm: don't apply ELC to converting and DOM locks James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 140/622] lustre: class: use INIT_LIST_HEAD_RCU instead INIT_LIST_HEAD James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 141/622] lustre: uapi: add new changerec_type James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 142/622] lustre: ldlm: check double grant race after resource change James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 143/622] lustre: mdc: grow lvb buffer to hold layout James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 144/622] lustre: osc: re-check target versus available grant James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 145/622] lnet: unlink md if fail to send recovery James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 146/622] lustre: obd: use correct names for conn_uuid James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 147/622] lustre: idl: use proper ATTR/MDS_ATTR/MDS_OPEN flags James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 148/622] lustre: llite: optimize read on open pages James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 149/622] lnet: set the health status correctly James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 150/622] lustre: lov: add debugging info for statfs James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 151/622] lnet: Decrement health on timeout James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 152/622] lustre: quota: fix setattr project check James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 153/622] lnet: socklnd: dynamically set LND parameters James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 154/622] lustre: flr: add mirror write command James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 155/622] lnet: properly error check sensitivity James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 156/622] lustre: llite: add lock for dir layout data James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 157/622] lnet: configure recovery interval James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 158/622] lustre: osc: Do not walk full extent list James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 159/622] lnet: separate ni state from recovery James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 160/622] lustre: mdc: move empty xattr handling to mdc layer James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 161/622] lustre: obd: remove portals handle from OBD import James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 162/622] lustre: mgc: restore mgc binding for sptlrpc James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 163/622] lnet: peer deletion code may hide error James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 164/622] lustre: hsm: make changelog flag argument an enum James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 165/622] lustre: ldlm: don't skip bl_ast for local lock James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 166/622] lustre: clio: use pagevec_release for many pages James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 167/622] lustre: lmv: allocate fid on parent MDT in migrate James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 168/622] lustre: ptlrpc: Do not map unrecognized ELDLM errnos to EIO James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 169/622] lustre: llite: protect reading inode->i_data.nrpages James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 170/622] lustre: mdt: fix read-on-open for big PAGE_SIZE James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 171/622] lustre: llite: handle -ENODATA in ll_layout_fetch() James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 172/622] lustre: hsm: increase upper limit of maximum HSM backends registered with MDT James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 173/622] lustre: osc: wrong page offset for T10PI checksum James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 174/622] lnet: increase lnet transaction timeout James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 175/622] lnet: handle multi-md usage James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 176/622] lustre: uapi: fix warnings when lustre_user.h included James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 177/622] lustre: obdclass: lu_dirent record length missing '0' James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 178/622] lustre: update version to 2.11.99 James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 179/622] lustre: osc: limit chunk number of write submit James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 180/622] lustre: osc: speed up page cache cleanup during blocking ASTs James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 181/622] lustre: lmv: Fix style issues for lmv_fld.c James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 182/622] lustre: llite: Fix style issues for llite_nfs.c James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 183/622] lustre: llite: Fix style issues for lcommon_misc.c James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 184/622] lustre: llite: Fix style issues for symlink.c James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 185/622] lustre: headers: define pct(a, b) once James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 186/622] lustre: obdclass: report all obd states for OBD_IOC_GETDEVICE James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 187/622] lustre: ldlm: remove trace from ldlm_pool_count() James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 188/622] lustre: ptlrpc: clean up rq_interpret_reply callbacks James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 189/622] lustre: lov: quiet lov_dump_lmm_ console messages James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 190/622] lustre: lov: cl_cache could miss initialize James Simmons
2020-02-27 21:10 ` [lustre-devel] [PATCH 191/622] lnet: socklnd: improve scheduling algorithm James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 192/622] lustre: ldlm: Adjust search_* functions James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 193/622] lustre: sysfs: make ping sysfs file read and writable James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 194/622] lustre: ptlrpc: connect vs import invalidate race James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 195/622] lustre: ptlrpc: always unregister bulk James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 196/622] lustre: sptlrpc: split sptlrpc_process_config() James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 197/622] lustre: cfg: reserve flags for SELinux status checking James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 198/622] lustre: llite: remove cl_file_inode_init() LASSERT James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 199/622] lnet: add fault injection for bulk transfers James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 200/622] lnet: remove .nf_min_max handling James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 201/622] lustre: sec: create new function sptlrpc_get_sepol() James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 202/622] lustre: clio: fix incorrect invariant in cl_io_iter_fini() James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 203/622] lustre: mdc: Improve xattr buffer allocations James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 204/622] lnet: libcfs: allow file/func/line passed to CDEBUG() James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 205/622] lustre: llog: add startcat for wrapped catalog James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 206/622] lustre: llog: add synchronization for the last record James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 207/622] lustre: ptlrpc: improve memory allocation for service RPCs James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 208/622] lustre: llite: enable flock mount option by default James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 209/622] lustre: lmv: avoid gratuitous 64-bit modulus James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 210/622] lustre: Ensure crc-t10pi is enabled James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 211/622] lustre: lov: fix lov_iocontrol for inactive OST case James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 212/622] lustre: llite: Initialize cl_dirty_max_pages James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 213/622] lustre: mdc: don't use ACL at setattr James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 214/622] lnet: o2iblnd: ibc_rxs is created and freed with different size James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 215/622] lustre: osc: reduce atomic ops in osc_enter_cache_try James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 216/622] lustre: llite: ll_fault should fail for insane file offsets James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 217/622] lustre: ptlrpc: reset generation for old requests James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 218/622] lustre: osc: check if opg is in lru list without locking James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 219/622] lnet: use right rtr address James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 220/622] lnet: use right address for routing message James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 221/622] lustre: lov: avoid signed vs. unsigned comparison James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 222/622] lustre: obd: use ldo_process_config for mdc and osc layer James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 223/622] lnet: check for asymmetrical route messages James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 224/622] lustre: llite: Lock inode on tiny write if setuid/setgid set James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 225/622] lustre: llite: make sure name pack atomic James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 226/622] lustre: ptlrpc: handle proper import states for recovery James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 227/622] lustre: ldlm: don't convert wrong resource James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 228/622] lustre: llite: limit statfs ffree if less than OST ffree James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 229/622] lustre: mdc: prevent glimpse lock count grow James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 230/622] lustre: dne: performance improvement for file creation James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 231/622] lustre: mdc: return DOM size on open resend James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 232/622] lustre: llite: optimizations for not granted lock processing James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 233/622] lustre: osc: propagate grant shrink interval immediately James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 234/622] lustre: osc: grant shrink shouldn't account skipped OSC James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 235/622] lustre: quota: protect quota flags at OSC James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 236/622] lustre: osc: pass client page size during reconnect too James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 237/622] lustre: ptlrpc: Change static defines to use macro for sec_gc.c James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 238/622] lnet: libcfs: do not calculate debug_mb if it is set James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 239/622] lustre: ldlm: Lost lease lock on migrate error James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 240/622] lnet: lnd: increase CQ entries James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 241/622] lustre: security: return security context for metadata ops James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 242/622] lustre: grant: prevent overflow of o_undirty James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 243/622] lustre: ptlrpc: manage SELinux policy info at connect time James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 244/622] lustre: ptlrpc: manage SELinux policy info for metadata ops James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 245/622] lustre: obd: make health_check sysfs compliant James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 246/622] lustre: misc: delete OBD_IOC_PING_TARGET ioctl James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 247/622] lustre: misc: remove LIBCFS_IOC_DEBUG_MASK ioctl James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 248/622] lustre: llite: add file heat support James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 249/622] lustre: obdclass: improve llog config record message James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 250/622] lustre: lov: remove KEY_CACHE_SET to simplify the code James Simmons
2020-02-27 21:11 ` [lustre-devel] [PATCH 251/622] lustre: ldlm: Fix style issues for ldlm_lockd.c James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 252/622] lustre: ldlm: Fix style issues for ldlm_request.c James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 253/622] lustre: ptlrpc: Fix style issues for sec_bulk.c James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 254/622] lustre: ldlm: Fix style issues for ptlrpcd.c James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 255/622] lustre: ptlrpc: IR doesn't reconnect after EAGAIN James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 256/622] lustre: llite: ll_fault fixes James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 257/622] lustre: lsom: Add an OBD_CONNECT2_LSOM connect flag James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 258/622] lustre: pcc: Reserve a new connection flag for PCC James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 259/622] lustre: uapi: reserve connect flag for plain layout James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 260/622] lustre: ptlrpc: allow stopping threads above threads_max James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 261/622] lnet: Avoid lnet debugfs read/write if ctl_table does not exist James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 262/622] lnet: lnd: bring back concurrent_sends James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 263/622] lnet: properly cleanup lnet debugfs files James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 264/622] lustre: mdc: reset lmm->lmm_stripe_offset in mdc_save_lovea James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 265/622] lnet: Cleanup lnet_get_rtr_pool_cfg James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 266/622] lustre: quota: make overquota flag for old req James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 267/622] lustre: osd: Set max ea size to XATTR_SIZE_MAX James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 268/622] lustre: lov: Remove unnecessary assert James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 269/622] lnet: o2iblnd: kib_conn leak James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 270/622] lustre: llite: switch to use ll_fsname directly James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 271/622] lustre: llite: improve max_readahead console messages James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 272/622] lustre: llite: fill copied dentry name's ending char properly James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 273/622] lustre: obd: update udev event handling James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 274/622] lustre: ptlrpc: Bulk assertion fails on -ENOMEM James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 275/622] lustre: obd: Add overstriping CONNECT flag James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 276/622] lustre: llite, readahead: fix to call ll_ras_enter() properly James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 277/622] lustre: ptlrpc: ASSERTION (req_transno < next_transno) failed James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 278/622] lustre: lov: new foreign LOV format James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 279/622] lustre: lmv: new foreign LMV format James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 280/622] lustre: obd: replace class_uuid with linux kernel version James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 281/622] lustre: ptlrpc: Fix style issues for sec_null.c James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 282/622] lustre: ptlrpc: Fix style issues for service.c James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 283/622] lustre: uapi: fix file heat support James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 284/622] lnet: libcfs: poll fail_loc in cfs_fail_timeout_set() James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 285/622] lustre: obd: round values to nearest MiB for *_mb syfs files James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 286/622] lustre: osc: don't check capability for every page James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 287/622] lustre: statahead: sa_handle_callback get lli_sa_lock earlier James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 288/622] lnet: use number of wrs to calculate CQEs James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 289/622] lustre: ldlm: Fix style issues for ldlm_resource.c James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 290/622] lustre: ptlrpc: Fix style issues for sec_gc.c James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 291/622] lustre: ptlrpc: Fix style issues for llog_client.c James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 292/622] lustre: dne: allow access to striped dir with broken layout James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 293/622] lustre: ptlrpc: ocd_connect_flags are wrong during reconnect James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 294/622] lnet: libcfs: fix panic for too large cpu partitions James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 295/622] lustre: obdclass: put all service's env on the list James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 296/622] lustre: mdt: fix mdt_dom_discard_data() timeouts James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 297/622] lustre: lov: Add overstriping support James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 298/622] lustre: rpc: support maximum 64MB I/O RPC James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 299/622] lustre: dom: per-resource ELC for WRITE lock enqueue James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 300/622] lustre: dom: mdc_lock_flush() improvement James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 301/622] lnet: Fix NI status in debugfs for loopback ni James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 302/622] lustre: ptlrpc: Add more flags to DEBUG_REQ_FLAGS macro James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 303/622] lustre: llite: Revalidate dentries in ll_intent_file_open James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 304/622] lustre: llite: hash just created files if lock allows James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 305/622] lnet: adds checking msg len James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 306/622] lustre: dne: add new dir hash type "space" James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 307/622] lustre: uapi: Add nonrotational flag to statfs James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 308/622] lnet: libcfs: crashes with certain cpu part numbers James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 309/622] lustre: lov: fix wrong calculated length for fiemap James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 310/622] lustre: obdclass: remove unprotected access to lu_object James Simmons
2020-02-27 21:12 ` [lustre-devel] [PATCH 311/622] lustre: push rcu_barrier() before destroying slab James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 312/622] lustre: ptlrpc: intent_getattr fetches default LMV James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 313/622] lustre: mdc: add async statfs James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 314/622] lustre: lmv: mkdir with balanced space usage James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 315/622] lustre: llite: check correct size in ll_dom_finish_open() James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 316/622] lnet: recovery event handling broken James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 317/622] lnet: clean mt_eqh properly James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 318/622] lnet: handle remote health error James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 319/622] lnet: setup health timeout defaults James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 320/622] lnet: fix cpt locking James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 321/622] lnet: detach response tracker James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 322/622] lnet: invalidate recovery ping mdh James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 323/622] lnet: fix list corruption James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 324/622] lnet: correct discovery LNetEQFree() James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 325/622] lnet: Protect lp_dc_pendq manipulation with lp_lock James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 326/622] lnet: Ensure md is detached when msg is not committed James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 327/622] lnet: verify msg is commited for send/recv James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 328/622] lnet: select LO interface for sending James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 329/622] lnet: remove route add restriction James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 330/622] lnet: Discover routers on first use James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 331/622] lnet: use peer for gateway James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 332/622] lnet: lnet_add/del_route() James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 333/622] lnet: Do not allow deleting of router nis James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 334/622] lnet: router sensitivity James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 335/622] lnet: cache ni status James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 336/622] lnet: Cache the routing feature James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 337/622] lnet: peer aliveness James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 338/622] lnet: router aliveness James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 339/622] lnet: simplify lnet_handle_local_failure() James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 340/622] lnet: Cleanup rcd James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 341/622] lnet: modify lnd notification mechanism James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 342/622] lnet: use discovery for routing James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 343/622] lnet: MR aware gateway selection James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 344/622] lnet: consider alive_router_check_interval James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 345/622] lnet: allow deleting router primary_nid James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 346/622] lnet: transfer routers James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 347/622] lnet: handle health for incoming messages James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 348/622] lnet: misleading discovery seqno James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 349/622] lnet: drop all rule James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 350/622] lnet: handle discovery off James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 351/622] lnet: handle router health off James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 352/622] lnet: push router interface updates James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 353/622] lnet: net aliveness James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 354/622] lnet: discover each gateway Net James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 355/622] lnet: look up MR peers routes James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 356/622] lnet: check peer timeout on a router James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 357/622] lustre: lmv: reuse object alloc QoS code from LOD James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 358/622] lustre: llite: Add persistent cache on client James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 359/622] lustre: pcc: Non-blocking PCC caching James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 360/622] lustre: pcc: security and permission for non-root user access James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 361/622] lustre: llite: Rule based auto PCC caching when create files James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 362/622] lustre: pcc: auto attach during open for valid cache James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 363/622] lustre: pcc: change detach behavior and add keep option James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 364/622] lustre: lov: return error if cl_env_get fails James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 365/622] lustre: ptlrpc: Add more flags to DEBUG_REQ_FLAGS macro James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 366/622] lustre: ldlm: layout lock fixes James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 367/622] lnet: Do not allow gateways on remote nets James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 368/622] lustre: osc: reduce lock contention in osc_unreserve_grant James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 369/622] lnet: Change static defines to use macro for module.c James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 370/622] lustre: llite, readahead: don't always use max RPC size James Simmons
2020-02-27 21:13 ` [lustre-devel] [PATCH 371/622] lustre: llite: improve single-thread read performance James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 372/622] lustre: obdclass: allow per-session jobids James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 373/622] lustre: llite: fix deadloop with tiny write James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 374/622] lnet: prevent loop in LNetPrimaryNID() James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 375/622] lustre: ldlm: Fix style issues for ldlm_lib.c James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 376/622] lustre: obdclass: protect imp_sec using rwlock_t James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 377/622] lustre: llite: console message for disabled flock call James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 378/622] lustre: ptlrpc: Add increasing XIDs CONNECT2 flag James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 379/622] lustre: ptlrpc: don't reset lru_resize on idle reconnect James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 380/622] lnet: use after free in lnet_discover_peer_locked() James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 381/622] lustre: obdclass: generate random u64 max correctly James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 382/622] lnet: fix peer ref counting James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 383/622] lustre: llite: collect debug info for ll_fsync James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 384/622] lustre: obdclass: use RCU to release lu_env_item James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 385/622] lustre: mdt: improve IBITS lock definitions James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 386/622] lustre: uapi: change "space" hash type to hash flag James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 387/622] lustre: osc: cancel osc_lock list traversal once found the lock is being used James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 388/622] lustre: obdclass: add comment for rcu handling in lu_env_remove James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 389/622] lnet: honor discovery setting James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 390/622] lustre: obdclass: don't send multiple statfs RPCs James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 391/622] lustre: lov: Correct bounds checking James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 392/622] lustre: lu_object: Add missed qos_rr_init James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 393/622] lustre: fld: let's caller to retry FLD_QUERY James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 394/622] lustre: llite: make sure readahead cover current read James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 395/622] lustre: ptlrpc: Add jobid to rpctrace debug messages James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 396/622] lnet: libcfs: Reduce memory frag due to HA debug msg James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 397/622] lustre: ptlrpc: change IMPORT_SET_* macros into real functions James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 398/622] lustre: uapi: add unused enum obd_statfs_state James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 399/622] lustre: llite: create obd_device with usercopy whitelist James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 400/622] lnet: warn if discovery is off James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 401/622] lustre: ldlm: always cancel aged locks regardless enabling or disabling lru resize James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 402/622] lustre: llite: cleanup stats of LPROC_LL_* James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 403/622] lustre: osc: Do not assert for first extent James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 404/622] lustre: llite: MS_* flags and SB_* flags split James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 405/622] lustre: llite: improve ll_dom_lock_cancel James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 406/622] lustre: llite: swab LOV EA user data James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 407/622] lustre: clio: support custom csi_end_io handler James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 408/622] lustre: llite: release active extent on sync write commit James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 409/622] lustre: obd: harden debugfs handling James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 410/622] lustre: obd: add rmfid support James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 411/622] lnet: Convert noisy timeout error to cdebug James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 412/622] lnet: Misleading error from lnet_is_health_check James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 413/622] lustre: llite: do not cache write open lock for exec file James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 414/622] lustre: mdc: polling mode for changelog reader James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 415/622] lnet: Sync the start of discovery and monitor threads James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 416/622] lustre: llite: don't check vmpage refcount in ll_releasepage() James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 417/622] lnet: Deprecate live and dead router check params James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 418/622] lnet: Detach rspt when md_threshold is infinite James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 419/622] lnet: Return EHOSTUNREACH for unreachable gateway James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 420/622] lustre: ptlrpc: Don't get jobid in body_v2 James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 421/622] lnet: Defer rspt cleanup when MD queued for unlink James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 422/622] lustre: lov: Correct write_intent end for trunc James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 423/622] lustre: mdc: hold lock while walking changelog dev list James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 424/622] lustre: import: fix race between imp_state & imp_invalid James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 425/622] lnet: support non-default network namespace James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 426/622] lustre: obdclass: 0-nlink race in lu_object_find_at() James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 427/622] lustre: osc: reserve lru pages for read in batch James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 428/622] lustre: uapi: Make lustre_user.h c++-legal James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 429/622] lnet: create existing net returns EEXIST James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 430/622] lustre: obdecho: reuse an cl env cache for obdecho survey James Simmons
2020-02-27 21:14 ` [lustre-devel] [PATCH 431/622] lustre: mdc: dir page ldp_hash_end mistakenly adjusted James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 432/622] lnet: handle unlink before send completes James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 433/622] lustre: osc: layout and chunkbits alignment mismatch James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 434/622] lnet: handle recursion in resend James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 435/622] lustre: llite: forget cached ACLs properly James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 436/622] lustre: osc: Fix dom handling in weight_ast James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 437/622] lustre: llite: Fix extents_stats James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 438/622] lustre: llite: don't miss every first stride page James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 439/622] lustre: llite: swab LOV EA data in ll_getxattr_lov() James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 440/622] lustre: llite: Mark lustre_inode_cache as reclaimable James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 441/622] lustre: osc: add preferred checksum type support James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 442/622] lustre: ptlrpc: Stop sending ptlrpc_body_v2 James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 443/622] lnet: Fix style issues for selftest/rpc.c James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 444/622] lnet: Fix style issues for module.c conctl.c James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 445/622] lustre: ptlrpc: check lm_bufcount and lm_buflen James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 446/622] lustre: uapi: Remove unused CONNECT flag James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 447/622] lustre: lmv: disable remote file statahead James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 448/622] lustre: llite: Fix page count for unaligned reads James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 449/622] lnet: discovery off route state update James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 450/622] lustre: llite: prevent mulitple group locks James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 451/622] lustre: ptlrpc: make DEBUG_REQ messages consistent James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 452/622] lustre: ptlrpc: check buffer length in lustre_msg_string() James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 453/622] lustre: uapi: fix building fail against Power9 little endian James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 454/622] lustre: ptlrpc: fix reply buffers shrinking and growing James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 455/622] lustre: dom: manual OST-to-DOM migration via mirroring James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 456/622] lustre: fld: remove fci_no_shrink field James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 457/622] lustre: lustre: remove ldt_obd_type field of lu_device_type James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 458/622] lustre: lustre: remove imp_no_timeout field James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 459/622] lustre: llog: remove olg_cat_processing field James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 460/622] lustre: ptlrpc: remove struct ptlrpc_bulk_page James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 461/622] lustre: ptlrpc: remove bd_import_generation field James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 462/622] lustre: ptlrpc: remove srv_threads from struct ptlrpc_service James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 463/622] lustre: ptlrpc: remove scp_nthrs_stopping field James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 464/622] lustre: ldlm: remove unused ldlm_server_conn James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 465/622] lustre: llite: remove lli_readdir_mutex James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 466/622] lustre: llite: remove ll_umounting field James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 467/622] lustre: llite: align field names in ll_sb_info James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 468/622] lustre: llite: remove lti_iter field James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 469/622] lustre: llite: remove ft_mtime field James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 470/622] lustre: llite: remove sub_reenter field James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 471/622] lustre: osc: remove oti_descr oti_handle oti_plist James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 472/622] lustre: osc: remove oe_next_page James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 473/622] lnet: o2iblnd: remove some unused fields James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 474/622] lnet: socklnd: remove ksnp_sharecount James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 475/622] lustre: llite: extend readahead locks for striped file James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 476/622] lustre: llite: Improve readahead RPC issuance James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 477/622] lustre: lov: Move page index to top level James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 478/622] lustre: readahead: convert stride page index to byte James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 479/622] lustre: osc: prevent use after free James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 480/622] lustre: mdc: hold obd while processing changelog James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 481/622] lnet: change ln_mt_waitq to a completion James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 482/622] lustre: obdclass: align to T10 sector size when generating guard James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 483/622] lustre: ptlrpc: Hold imp lock for idle reconnect James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 484/622] lustre: osc: glimpse - search for active lock James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 485/622] lustre: lmv: use lu_tgt_descs to manage tgts James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 486/622] lustre: lmv: share object alloc QoS code with LMV James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 487/622] lustre: import: Fix missing spin_unlock() James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 488/622] lnet: o2iblnd: Make credits hiw connection aware James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 489/622] lustre: obdecho: avoid panic with partially object init James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 490/622] lnet: o2iblnd: cache max_qp_wr James Simmons
2020-02-27 21:15 ` [lustre-devel] [PATCH 491/622] lustre: som: integrate LSOM with lfs find James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 492/622] lustre: llite: error handling of ll_och_fill() James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 493/622] lnet: Don't queue msg when discovery has completed James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 494/622] lnet: Use alternate ping processing for non-mr peers James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 495/622] lustre: obdclass: qos penalties miscalculated James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 496/622] lustre: osc: wrong cache of LVB attrs James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 497/622] lustre: osc: wrong cache of LVB attrs, part2 James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 498/622] lustre: vvp: dirty pages with pagevec James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 499/622] lustre: ptlrpc: resend may corrupt the data James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 500/622] lnet: eliminate uninitialized warning James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 501/622] lnet: o2ib: Record rc in debug log on startup failure James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 502/622] lnet: o2ib: Reintroduce kiblnd_dev_search James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 503/622] lustre: ptlrpc: fix watchdog ratelimit logic James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 504/622] lustre: flr: avoid reading unhealthy mirror James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 505/622] lustre: obdclass: lu_tgt_descs cleanup James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 506/622] lustre: ptlrpc: Properly swab ll_fiemap_info_key James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 507/622] lustre: llite: clear flock when using localflock James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 508/622] lustre: sec: reserve flags for client side encryption James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 509/622] lustre: llite: limit max xattr size by kernel value James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 510/622] lustre: ptlrpc: return proper error code James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 511/622] lnet: fix peer_ni selection James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 512/622] lustre: pcc: Auto attach for PCC during IO James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 513/622] lustre: lmv: alloc dir stripes by QoS James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 514/622] lustre: llite: Don't clear d_fsdata in ll_release() James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 515/622] lustre: llite: move agl_thread cleanup out of thread James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 516/622] lustre/lnet: remove unnecessary use of msecs_to_jiffies() James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 517/622] lnet: net_fault: don't pass struct member to do_div() James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 518/622] lustre: obd: discard unused enum James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 519/622] lustre: update version to 2.13.50 James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 520/622] lustre: llite: report latency for filesystem ops James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 521/622] lustre: osc: don't re-enable grant shrink on reconnect James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 522/622] lustre: llite: statfs to use NODELAY with MDS James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 523/622] lustre: ptlrpc: grammar fix James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 524/622] lustre: lov: check all entries in lov_flush_composite James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 525/622] lustre: pcc: Incorrect size after re-attach James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 526/622] lustre: pcc: auto attach not work after client cache clear James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 527/622] lustre: pcc: Init saved dataset flags properly James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 528/622] lustre: use simple sleep in some cases James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 529/622] lustre: lov: use wait_event() in lov_subobject_kill() James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 530/622] lustre: llite: use wait_event in cl_object_put_last() James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 531/622] lustre: modules: Use LIST_HEAD for declaring list_heads James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 532/622] lustre: handle: move refcount into the lustre_handle James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 533/622] lustre: llite: support page unaligned stride readahead James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 534/622] lustre: ptlrpc: ptlrpc_register_bulk LBUG on ENOMEM James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 535/622] lustre: osc: allow increasing osc.*.short_io_bytes James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 536/622] lnet: remove pt_number from lnet_peer_table James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 537/622] lnet: Optimize check for routing feature flag James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 538/622] lustre: llite: file write pos mimatch James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 539/622] lustre: ldlm: FLOCK request can be processed twice James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 540/622] lnet: timers: correctly offset mod_timer James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 541/622] lustre: ptlrpc: update wiretest for new values James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 542/622] lustre: ptlrpc: do lu_env_refill for any new request James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 543/622] lustre: obd: perform proper division James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 544/622] lustre: uapi: introduce OBD_CONNECT2_CRUSH James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 545/622] lnet: Wait for single discovery attempt of routers James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 546/622] lustre: mgc: config lock leak James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 547/622] lnet: check if current->nsproxy is NULL before using James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 548/622] lustre: ptlrpc: always reset generation for idle reconnect James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 549/622] lustre: obdclass: Allow read-ahead for write requests James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 550/622] lustre: ldlm: separate buckets from ldlm hash table James Simmons
2020-02-27 21:16 ` [lustre-devel] [PATCH 551/622] lustre: llite: don't cache MDS_OPEN_LOCK for volatile files James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 552/622] lnet: discard lnd_refcount James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 553/622] lnet: socklnd: rename struct ksock_peer to struct ksock_peer_ni James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 554/622] lnet: change ksocknal_create_peer() to return pointer James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 555/622] lnet: discard ksnn_lock James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 556/622] lnet: discard LNetMEInsert James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 557/622] lustre: lmv: fix to return correct MDT count James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 558/622] lustre: obdclass: remove assertion for imp_refcount James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 559/622] lnet: Prefer route specified by rtr_nid James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 560/622] lustre: all: prefer sizeof(*var) for alloc James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 561/622] lustre: handle: discard OBD_FREE_RCU James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 562/622] lnet: use list_move where appropriate James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 563/622] lnet: libcfs: provide an scnprintf and start using it James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 564/622] lustre: llite: fetch default layout for a directory James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 565/622] lnet: fix rspt counter James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 566/622] lustre: ldlm: add a counter to the per-namespace data James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 567/622] lnet: Add peer level aliveness information James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 568/622] lnet: always check return of try_module_get() James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 569/622] lustre: obdclass: don't skip records for wrapped catalog James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 570/622] lnet: Refactor lnet_find_best_lpni_on_net James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 571/622] lnet: Avoid comparing route to itself James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 572/622] lustre: sysfs: use string helper like functions for sysfs James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 573/622] lustre: rename ops to owner James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 574/622] lustre: ldlm: simplify ldlm_ns_hash_defs[] James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 575/622] lnet: prepare to make lnet_lnd const James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 576/622] lnet: discard struct ksock_peer James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 577/622] lnet: Avoid extra lnet_remotenet lookup James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 578/622] lnet: Remove unused vars in lnet_find_route_locked James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 579/622] lnet: Refactor lnet_compare_routes James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 580/622] lustre: u_object: factor out extra per-bucket data James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 581/622] lustre: llite: replace lli_trunc_sem James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 582/622] lnet: Fix source specified route selection James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 583/622] lustre: uapi: turn struct lustre_nfs_fid to userland fhandle James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 584/622] lustre: uapi: LU-12521 llapi: add separate fsname and instance API James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 585/622] lnet: socklnd: initialize the_ksocklnd at compile-time James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 586/622] lnet: remove locking protection ln_testprotocompat James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 587/622] lustre: ptlrpc: suppress connection restored message James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 588/622] lustre: llite: fix deadlock in ll_update_lsm_md() James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 589/622] lustre: ldlm: fix lock convert races James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 590/622] lustre: ldlm: signal vs CP callback race James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 591/622] lustre: uapi: properly pack data structures James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 592/622] lnet: peer lookup handle shutdown James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 593/622] lnet: lnet response entries leak James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 594/622] lustre: lmv: disable statahead for remote objects James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 595/622] lustre: llite: eviction during ll_open_cleanup() James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 596/622] lustre: ptlrpc: show target name in req_history James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 597/622] lustre: dom: check read-on-open buffer presents in reply James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 598/622] lustre: llite: proper names/types for offset/pages James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 599/622] lustre: llite: Accept EBUSY for page unaligned read James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 600/622] lustre: handle: remove locking from class_handle2object() James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 601/622] lustre: handle: use hlist for hash lists James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 602/622] lustre: obdclass: convert waiting in cl_sync_io_wait() James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 603/622] lnet: modules: use list_move were appropriate James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 604/622] lnet: fix small race in unloading klnd modules James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 605/622] lnet: me: discard struct lnet_handle_me James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 606/622] lnet: avoid extra memory consumption James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 607/622] lustre: uapi: remove unused LUSTRE_DIRECTIO_FL James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 608/622] lustre: lustre: Reserve OST_FALLOCATE(fallocate) opcode James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 609/622] lnet: libcfs: Cleanup use of bare printk James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 610/622] lnet: Do not assume peers are MR capable James Simmons
2020-02-27 21:17 ` [lustre-devel] [PATCH 611/622] lnet: socklnd: convert peers hash table to hashtable.h James Simmons
2020-02-27 21:18 ` [lustre-devel] [PATCH 612/622] lustre: llite: Update mdc and lite stats on open|creat James Simmons
2020-02-27 21:18 ` [lustre-devel] [PATCH 613/622] lustre: osc: glimpse and lock cancel race James Simmons
2020-02-27 21:18 ` [lustre-devel] [PATCH 614/622] lustre: llog: keep llog handle alive until last reference James Simmons
2020-02-27 21:18 ` [lustre-devel] [PATCH 615/622] lnet: handling device failure by IB event handler James Simmons
2020-02-27 21:18 ` [lustre-devel] [PATCH 616/622] lustre: ptlrpc: simplify wait_event handling in unregister functions James Simmons
2020-02-27 21:18 ` [lustre-devel] [PATCH 617/622] lustre: ptlrpc: use l_wait_event_abortable in ptlrpcd_add_reg() James Simmons
2020-02-27 21:18 ` [lustre-devel] [PATCH 618/622] lnet: use LIST_HEAD() for local lists James Simmons
2020-02-27 21:18 ` [lustre-devel] [PATCH 619/622] lustre: lustre: " James Simmons
2020-02-27 21:18 ` [lustre-devel] [PATCH 620/622] lustre: handle: discard h_lock James Simmons
2020-02-27 21:18 ` [lustre-devel] [PATCH 621/622] lnet: remove lnd_query interface James Simmons
2020-02-27 21:18 ` [lustre-devel] [PATCH 622/622] lnet: use conservative health timeouts James Simmons
2020-04-24  6:01 ` [lustre-devel] [PATCH 000/622] lustre: sync closely to 2.13.52 NeilBrown
2020-04-28  1:04   ` James Simmons
2020-04-29  3:32     ` NeilBrown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1582838290-17243-76-git-send-email-jsimmons@infradead.org \
    --to=jsimmons@infradead.org \
    --cc=lustre-devel@lists.lustre.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.