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 331/622] lnet: use peer for gateway
Date: Thu, 27 Feb 2020 16:13:19 -0500	[thread overview]
Message-ID: <1582838290-17243-332-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>

The routing code uses peer_ni for a gateway. However with Mulit-Rail
a gateway could have multiple interfaces on several different
networks. Instead of using a single peer_ni as the gateway we should
be using the peer and let the MR selection code select the best
peer_ni to send to.

This patch moves the gateway from peer to peer_ni. Much of the
code needs to be rewritten in the following patches to account
for that change. This patch disables the routing features by
disabling the code to add/delete routes.

The asymmetric routing detection feature is also modified to
use the MR routing

WC-bug-id: https://jira.whamcloud.com/browse/LU-11298
Lustre-commit: 53f7b8b7a228 ("LU-11298 lnet: use peer for gateway")
Signed-off-by: Amir Shehata <ashehata@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/33183
Reviewed-by: Chris Horn <hornc@cray.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
---
 include/linux/lnet/lib-lnet.h  |  19 +-
 include/linux/lnet/lib-types.h |  46 +--
 net/lnet/lnet/lib-move.c       | 215 +++++++-----
 net/lnet/lnet/peer.c           |  17 +-
 net/lnet/lnet/router.c         | 720 ++---------------------------------------
 net/lnet/lnet/router_proc.c    |  31 +-
 6 files changed, 230 insertions(+), 818 deletions(-)

diff --git a/include/linux/lnet/lib-lnet.h b/include/linux/lnet/lib-lnet.h
index 534be2a..80f6f8c 100644
--- a/include/linux/lnet/lib-lnet.h
+++ b/include/linux/lnet/lib-lnet.h
@@ -92,15 +92,12 @@
 
 static inline int lnet_is_route_alive(struct lnet_route *route)
 {
-	/* gateway is down */
-	if (!route->lr_gateway->lpni_alive)
-		return 0;
-	/* no NI status, assume it's alive */
-	if ((route->lr_gateway->lpni_ping_feats &
-	     LNET_PING_FEAT_NI_STATUS) == 0)
-		return 1;
-	/* has NI status, check # down NIs */
-	return route->lr_downis == 0;
+	/* TODO re-implement gateway alive indication */
+	CDEBUG(D_NET, "TODO: reimplement routing. gateway = %s\n",
+	       route->lr_gateway ?
+		libcfs_nid2str(route->lr_gateway->lp_primary_nid) :
+		"undefined");
+	return 1;
 }
 
 static inline int lnet_is_wire_handle_none(struct lnet_handle_wire *wh)
@@ -402,9 +399,9 @@ void lnet_res_lh_initialize(struct lnet_res_container *rec,
 }
 
 static inline int
-lnet_isrouter(struct lnet_peer_ni *lp)
+lnet_isrouter(struct lnet_peer_ni *lpni)
 {
-	return lp->lpni_rtr_refcount ? 1 : 0;
+	return lpni->lpni_peer_net->lpn_peer->lp_rtr_refcount ? 1 : 0;
 }
 
 static inline void
diff --git a/include/linux/lnet/lib-types.h b/include/linux/lnet/lib-types.h
index b1a6f6a..31fe22a 100644
--- a/include/linux/lnet/lib-types.h
+++ b/include/linux/lnet/lib-types.h
@@ -534,20 +534,21 @@ struct lnet_peer_ni {
 	struct list_head	 lpni_hashlist;
 	/* messages blocking for tx credits */
 	struct list_head	 lpni_txq;
-	/* messages blocking for router credits */
-	struct list_head	 lpni_rtrq;
-	/* chain on router list */
-	struct list_head	 lpni_rtr_list;
+	/* pointer to peer net I'm part of */
+	struct lnet_peer_net	*lpni_peer_net;
 	/* statistics kept on each peer NI */
 	struct lnet_element_stats lpni_stats;
 	struct lnet_health_remote_stats lpni_hstats;
-	/* spin lock protecting credits and lpni_txq / lpni_rtrq */
+	/* spin lock protecting credits and lpni_txq */
 	spinlock_t		 lpni_lock;
 	/* # tx credits available */
 	int			 lpni_txcredits;
-	struct lnet_peer_net	*lpni_peer_net;
 	/* low water mark */
 	int			 lpni_mintxcredits;
+	/*
+	 * Each peer_ni in a gateway maintains its own credits. This
+	 * allows more traffic to gateways that have multiple interfaces.
+	 */
 	/* # router credits */
 	int			 lpni_rtrcredits;
 	/* low water mark */
@@ -560,18 +561,12 @@ struct lnet_peer_ni {
 	bool			 lpni_notifylnd;
 	/* some thread is handling notification */
 	bool			 lpni_notifying;
-	/* SEND event outstanding from ping */
-	unsigned int		 lpni_ping_notsent;
 	/* # times router went dead<->alive */
 	int			 lpni_alive_count;
 	/* ytes queued for sending */
 	long			 lpni_txqnob;
 	/* time of last aliveness news */
 	time64_t		 lpni_timestamp;
-	/* time of last ping attempt */
-	time64_t		 lpni_ping_timestamp;
-	/* != 0 if ping reply expected */
-	time64_t		 lpni_ping_deadline;
 	/* when I was last alive */
 	time64_t		 lpni_last_alive;
 	/* when lpni_ni was queried last time */
@@ -590,18 +585,12 @@ struct lnet_peer_ni {
 	int			 lpni_cpt;
 	/* state flags -- protected by lpni_lock */
 	unsigned int		 lpni_state;
-	/* # refs from lnet_route::lr_gateway */
-	int			 lpni_rtr_refcount;
 	/* sequence number used to round robin over peer nis within a net */
 	u32			 lpni_seq;
 	/* sequence number used to round robin over gateways */
 	u32			 lpni_gw_seq;
-	/* health flag */
-	bool			 lpni_healthy;
 	/* returned RC ping features. Protected with lpni_lock */
 	unsigned int		 lpni_ping_feats;
-	/* routers on this peer */
-	struct list_head	 lpni_routes;
 	/* preferred local nids: if only one, use lpni_pref.nid */
 	union lpni_pref {
 		lnet_nid_t	 nid;
@@ -632,6 +621,9 @@ struct lnet_peer {
 	/* list of messages pending discovery*/
 	struct list_head	lp_dc_pendq;
 
+	/* chain on router list */
+	struct list_head	lp_rtr_list;
+
 	/* primary NID of the peer */
 	lnet_nid_t		lp_primary_nid;
 
@@ -641,10 +633,22 @@ struct lnet_peer {
 	/* number of NIDs on this peer */
 	int			lp_nnis;
 
+	/* # refs from lnet_route_t::lr_gateway */
+	int			lp_rtr_refcount;
+
+	/* messages blocking for router credits */
+	struct list_head	lp_rtrq;
+
+	/* routes on this peer */
+	struct list_head	lp_routes;
+
+	/* time of last router check attempt */
+	time64_t		lp_rtrcheck_timestamp;
+
 	/* reference count */
 	atomic_t		lp_refcount;
 
-	/* lock protecting peer state flags */
+	/* lock protecting peer state flags and lpni_rtrq */
 	spinlock_t		lp_lock;
 
 	/* peer state flags */
@@ -808,9 +812,11 @@ struct lnet_route {
 	/* chain on gateway */
 	struct list_head	lr_gwlist;
 	/* router node */
-	struct lnet_peer_ni    *lr_gateway;
+	struct lnet_peer       *lr_gateway;
 	/* remote network number */
 	u32			lr_net;
+	/* local network number */
+	u32			lr_lnet;
 	/* sequence for round-robin */
 	int			lr_seq;
 	/* number of down NIs */
diff --git a/net/lnet/lnet/lib-move.c b/net/lnet/lnet/lib-move.c
index e080580..99ff882 100644
--- a/net/lnet/lnet/lib-move.c
+++ b/net/lnet/lnet/lib-move.c
@@ -877,7 +877,8 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 	 * I return LNET_CREDIT_WAIT if msg blocked and LNET_CREDIT_OK if
 	 * received or OK to receive
 	 */
-	struct lnet_peer_ni *lp = msg->msg_rxpeer;
+	struct lnet_peer_ni *lpni = msg->msg_rxpeer;
+	struct lnet_peer *lp;
 	struct lnet_rtrbufpool *rbp;
 	struct lnet_rtrbuf *rb;
 
@@ -887,29 +888,36 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 	LASSERT(msg->msg_routing);
 	LASSERT(msg->msg_receiving);
 	LASSERT(!msg->msg_sending);
+	LASSERT(lpni->lpni_peer_net);
+	LASSERT(lpni->lpni_peer_net->lpn_peer);
+
+	lp = lpni->lpni_peer_net->lpn_peer;
 
 	/* non-lnet_parse callers only receive delayed messages */
 	LASSERT(!do_recv || msg->msg_rx_delayed);
 
 	if (!msg->msg_peerrtrcredit) {
-		spin_lock(&lp->lpni_lock);
-		LASSERT((lp->lpni_rtrcredits < 0) ==
-			!list_empty(&lp->lpni_rtrq));
+		/* lpni_lock protects the credit manipulation */
+		spin_lock(&lpni->lpni_lock);
+		/* lp_lock protects the lp_rtrq */
+		spin_lock(&lp->lp_lock);
 
 		msg->msg_peerrtrcredit = 1;
-		lp->lpni_rtrcredits--;
-		if (lp->lpni_rtrcredits < lp->lpni_minrtrcredits)
-			lp->lpni_minrtrcredits = lp->lpni_rtrcredits;
+		lpni->lpni_rtrcredits--;
+		if (lpni->lpni_rtrcredits < lpni->lpni_minrtrcredits)
+			lpni->lpni_minrtrcredits = lpni->lpni_rtrcredits;
 
-		if (lp->lpni_rtrcredits < 0) {
+		if (lpni->lpni_rtrcredits < 0) {
 			/* must have checked eager_recv before here */
 			LASSERT(msg->msg_rx_ready_delay);
 			msg->msg_rx_delayed = 1;
-			list_add_tail(&msg->msg_list, &lp->lpni_rtrq);
-			spin_unlock(&lp->lpni_lock);
+			list_add_tail(&msg->msg_list, &lp->lp_rtrq);
+			spin_unlock(&lp->lp_lock);
+			spin_unlock(&lpni->lpni_lock);
 			return LNET_CREDIT_WAIT;
 		}
-		spin_unlock(&lp->lpni_lock);
+		spin_unlock(&lp->lp_lock);
+		spin_unlock(&lpni->lpni_lock);
 	}
 
 	rbp = lnet_msg2bufpool(msg);
@@ -1080,7 +1088,8 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 void
 lnet_return_rx_credits_locked(struct lnet_msg *msg)
 {
-	struct lnet_peer_ni *rxpeer = msg->msg_rxpeer;
+	struct lnet_peer_ni *rxpeerni = msg->msg_rxpeer;
+	struct lnet_peer *lp;
 	struct lnet_ni *rxni = msg->msg_rxni;
 	struct lnet_msg *msg2;
 
@@ -1135,44 +1144,69 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 
 routing_off:
 	if (msg->msg_peerrtrcredit) {
+		LASSERT(rxpeerni);
+		LASSERT(rxpeerni->lpni_peer_net);
+		LASSERT(rxpeerni->lpni_peer_net->lpn_peer);
+
+		lp = rxpeerni->lpni_peer_net->lpn_peer;
+
 		/* give back peer router credits */
 		msg->msg_peerrtrcredit = 0;
 
-		spin_lock(&rxpeer->lpni_lock);
-		LASSERT((rxpeer->lpni_rtrcredits < 0) ==
-			!list_empty(&rxpeer->lpni_rtrq));
+		spin_lock(&rxpeerni->lpni_lock);
+		spin_lock(&lp->lp_lock);
 
-		rxpeer->lpni_rtrcredits++;
-		/*
-		 * drop all messages which are queued to be routed on that
+		rxpeerni->lpni_rtrcredits++;
+
+		/* drop all messages which are queued to be routed on that
 		 * peer.
 		 */
 		if (!the_lnet.ln_routing) {
 			LIST_HEAD(drop);
 
-			list_splice_init(&rxpeer->lpni_rtrq, &drop);
-			spin_unlock(&rxpeer->lpni_lock);
+			list_splice_init(&lp->lp_rtrq, &drop);
+			spin_unlock(&lp->lp_lock);
+			spin_unlock(&rxpeerni->lpni_lock);
 			lnet_drop_routed_msgs_locked(&drop, msg->msg_rx_cpt);
-		} else if (rxpeer->lpni_rtrcredits <= 0) {
-			msg2 = list_first_entry(&rxpeer->lpni_rtrq,
+		} else if (!list_empty(&lp->lp_rtrq)) {
+			int msg2_cpt;
+
+			msg2 = list_first_entry(&lp->lp_rtrq,
 						struct lnet_msg, msg_list);
 			list_del(&msg2->msg_list);
-			spin_unlock(&rxpeer->lpni_lock);
+			msg2_cpt = msg2->msg_rx_cpt;
+			spin_unlock(&lp->lp_lock);
+			spin_unlock(&rxpeerni->lpni_lock);
+			/* messages on the lp_rtrq can be from any NID in
+			 * the peer, which means they might have different
+			 * cpts. We need to make sure we lock the right
+			 * one.
+			 */
+			if (msg2_cpt != msg->msg_rx_cpt) {
+				lnet_net_unlock(msg->msg_rx_cpt);
+				lnet_net_lock(msg2_cpt);
+			}
 			(void)lnet_post_routed_recv_locked(msg2, 1);
+			if (msg2_cpt != msg->msg_rx_cpt) {
+				lnet_net_unlock(msg2_cpt);
+				lnet_net_lock(msg->msg_rx_cpt);
+			}
 		} else {
-			spin_unlock(&rxpeer->lpni_lock);
+			spin_unlock(&lp->lp_lock);
+			spin_unlock(&rxpeerni->lpni_lock);
 		}
 	}
 	if (rxni) {
 		msg->msg_rxni = NULL;
 		lnet_ni_decref_locked(rxni, msg->msg_rx_cpt);
 	}
-	if (rxpeer) {
+	if (rxpeerni) {
 		msg->msg_rxpeer = NULL;
-		lnet_peer_ni_decref_locked(rxpeer);
+		lnet_peer_ni_decref_locked(rxpeerni);
 	}
 }
 
+#if 0
 static int
 lnet_compare_peers(struct lnet_peer_ni *p1, struct lnet_peer_ni *p2)
 {
@@ -1190,15 +1224,18 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 
 	return 0;
 }
+#endif
 
 static int
 lnet_compare_routes(struct lnet_route *r1, struct lnet_route *r2)
 {
+	/* TODO re-implement gateway comparison
 	struct lnet_peer_ni *p1 = r1->lr_gateway;
 	struct lnet_peer_ni *p2 = r2->lr_gateway;
+	*/
 	int r1_hops = (r1->lr_hops == LNET_UNDEFINED_HOPS) ? 1 : r1->lr_hops;
 	int r2_hops = (r2->lr_hops == LNET_UNDEFINED_HOPS) ? 1 : r2->lr_hops;
-	int rc;
+	/*int rc;*/
 
 	if (r1->lr_priority < r2->lr_priority)
 		return 1;
@@ -1212,9 +1249,11 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 	if (r1_hops > r2_hops)
 		return -1;
 
+	/*
 	rc = lnet_compare_peers(p1, p2);
 	if (rc)
 		return rc;
+	*/
 
 	if (r1->lr_seq - r2->lr_seq <= 0)
 		return 1;
@@ -1222,17 +1261,17 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 	return -1;
 }
 
-static struct lnet_peer_ni *
+/* TODO: lnet_find_route_locked() needs to be reimplemented */
+static struct lnet_route *
 lnet_find_route_locked(struct lnet_net *net, u32 remote_net,
-		       lnet_nid_t rtr_nid, struct lnet_route **use_route,
-		       struct lnet_route **prev_route)
+		       lnet_nid_t rtr_nid, struct lnet_route **prev_route)
 {
 	struct lnet_remotenet *rnet;
 	struct lnet_route *route;
 	struct lnet_route *best_route;
 	struct lnet_route *last_route;
-	struct lnet_peer_ni *lpni_best;
-	struct lnet_peer_ni *lp;
+	struct lnet_peer *lp_best;
+	struct lnet_peer *lp;
 	int rc;
 
 	/*
@@ -1243,7 +1282,7 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 	if (!rnet)
 		return NULL;
 
-	lpni_best = NULL;
+	lp_best = NULL;
 	best_route = NULL;
 	last_route = NULL;
 	list_for_each_entry(route, &rnet->lrn_routes, lr_list) {
@@ -1252,16 +1291,10 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 		if (!lnet_is_route_alive(route))
 			continue;
 
-		if (net && lp->lpni_net != net)
-			continue;
-
-		if (lp->lpni_nid == rtr_nid) /* it's pre-determined router */
-			return lp;
-
-		if (!lpni_best) {
+		if (!lp_best) {
 			best_route = route;
 			last_route = route;
-			lpni_best = lp;
+			lp_best = lp;
 			continue;
 		}
 
@@ -1274,14 +1307,12 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 			continue;
 
 		best_route = route;
-		lpni_best = lp;
+		lp_best = lp;
 	}
 
-	if (best_route) {
-		*use_route = best_route;
-		*prev_route = last_route;
-	}
-	return lpni_best;
+	*prev_route = last_route;
+
+	return best_route;
 }
 
 static struct lnet_ni *
@@ -1835,60 +1866,80 @@ struct lnet_ni *
 			     struct lnet_peer_ni **gw_lpni,
 			     struct lnet_peer **gw_peer)
 {
-	struct lnet_route *best_route = NULL;
-	struct lnet_route *last_route = NULL;
-	struct lnet_peer_ni *gw;
+	struct lnet_peer *gw;
+	struct lnet_route *best_route;
+	struct lnet_route *last_route;
+	struct lnet_peer_ni *lpni = NULL;
 	lnet_nid_t src_nid = sd->sd_src_nid;
 
-	gw = lnet_find_route_locked(NULL, LNET_NIDNET(dst_nid),
-				    sd->sd_rtr_nid, &best_route, &last_route);
-	if (!gw) {
+	best_route = lnet_find_route_locked(NULL, LNET_NIDNET(dst_nid),
+					    sd->sd_rtr_nid, &last_route);
+	if (!best_route) {
 		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;
+	gw = best_route->lr_gateway;
+	*gw_peer = gw;
 
 	/* Discover this gateway if it hasn't already been discovered.
 	 * This means we might delay the message until discovery has
 	 * completed
 	 */
+#if 0
+	/* TODO: disable discovey for now */
 	if (lnet_msg_discovery(sd->sd_msg) &&
 	    !lnet_peer_is_uptodate(*gw_peer)) {
 		sd->sd_msg->msg_src_nid_param = sd->sd_src_nid;
 		return lnet_initiate_peer_discovery(gw, sd->sd_msg,
 						    sd->sd_rtr_nid, sd->sd_cpt);
 	}
+#endif
 
-	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) {
+		struct lnet_peer_net *lpeer;
 
+		lpeer = lnet_peer_get_net_locked(gw, best_route->lr_lnet);
+		sd->sd_best_ni = lnet_find_best_ni_on_spec_net(NULL, gw, lpeer,
+							       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_net2str(best_route->lr_lnet),
 		       libcfs_nid2str(sd->sd_src_nid));
 		return -EFAULT;
 	}
 
 	/* if gw is MR let's find its best peer_ni
 	 */
-	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);
+	if (lnet_peer_is_multi_rail(gw)) {
+		lpni = lnet_find_best_lpni_on_net(sd, gw,
+						  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) {
+		if (!lpni) {
+			CERROR("Internal Error. Route expected to %s from %s\n",
+			       libcfs_nid2str(dst_nid),
+			       libcfs_nid2str(src_nid));
+			return -EFAULT;
+		}
+	} else {
+		struct lnet_peer_net *lpn;
+
+		lpn = lnet_peer_get_net_locked(gw, best_route->lr_lnet);
+		if (!lpn) {
+			CERROR("Internal Error. Route expected to %s from %s\n",
+			       libcfs_nid2str(dst_nid),
+			       libcfs_nid2str(src_nid));
+			return -EFAULT;
+		}
+		lpni = list_entry(lpn->lpn_peer_nis.next, struct lnet_peer_ni,
+				  lpni_peer_nis);
+		if (!lpni) {
 			CERROR("Internal Error. Route expected to %s from %s\n",
 			       libcfs_nid2str(dst_nid),
 			       libcfs_nid2str(src_nid));
@@ -1896,7 +1947,7 @@ struct lnet_ni *
 		}
 	}
 
-	*gw_lpni = gw;
+	*gw_lpni = lpni;
 
 	/* increment the route sequence number since now we're sure we're
 	 * going to use it
@@ -4046,17 +4097,23 @@ void lnet_monitor_thr_stop(void)
 
 		rnet = lnet_find_rnet_locked(LNET_NIDNET(src_nid));
 		if (rnet) {
-			struct lnet_peer_ni *gw = NULL;
+			struct lnet_peer *gw = NULL;
+			struct lnet_peer_ni *lpni = NULL;
 			struct lnet_route *route;
 
 			list_for_each_entry(route, &rnet->lrn_routes, lr_list) {
 				found = false;
 				gw = route->lr_gateway;
-				if (gw->lpni_net != net)
+				if (route->lr_lnet != net->net_id)
 					continue;
-				if (gw->lpni_nid == from_nid) {
-					found = true;
-					break;
+				/* if the nid is one of the gateway's NIDs
+				 * then this is a valid gateway
+				 */
+				while ((lpni = lnet_get_next_peer_ni_locked(gw, NULL, lpni)) != NULL) {
+					if (lpni->lpni_nid == from_nid) {
+						found = true;
+						break;
+					}
 				}
 			}
 		}
@@ -4773,9 +4830,11 @@ struct lnet_msg *
 			LASSERT(shortest);
 			hops = shortest_hops;
 			if (srcnidp) {
-				ni = lnet_get_next_ni_locked(
-					shortest->lr_gateway->lpni_net,
-					NULL);
+				struct lnet_net *net;
+
+				net = lnet_get_net_locked(shortest->lr_lnet);
+				LASSERT(net);
+				ni = lnet_get_next_ni_locked(net, NULL);
 				*srcnidp = ni->ni_nid;
 			}
 			if (orderp)
diff --git a/net/lnet/lnet/peer.c b/net/lnet/lnet/peer.c
index 0d2d356..faaf94a 100644
--- a/net/lnet/lnet/peer.c
+++ b/net/lnet/lnet/peer.c
@@ -120,8 +120,6 @@
 		return NULL;
 
 	INIT_LIST_HEAD(&lpni->lpni_txq);
-	INIT_LIST_HEAD(&lpni->lpni_rtrq);
-	INIT_LIST_HEAD(&lpni->lpni_routes);
 	INIT_LIST_HEAD(&lpni->lpni_hashlist);
 	INIT_LIST_HEAD(&lpni->lpni_peer_nis);
 	INIT_LIST_HEAD(&lpni->lpni_recovery);
@@ -206,10 +204,13 @@
 	if (!lp)
 		return NULL;
 
+	INIT_LIST_HEAD(&lp->lp_rtrq);
+	INIT_LIST_HEAD(&lp->lp_routes);
 	INIT_LIST_HEAD(&lp->lp_peer_list);
 	INIT_LIST_HEAD(&lp->lp_peer_nets);
 	INIT_LIST_HEAD(&lp->lp_dc_list);
 	INIT_LIST_HEAD(&lp->lp_dc_pendq);
+	INIT_LIST_HEAD(&lp->lp_rtr_list);
 	init_waitqueue_head(&lp->lp_dc_waitq);
 	spin_lock_init(&lp->lp_lock);
 	lp->lp_primary_nid = nid;
@@ -235,6 +236,7 @@
 	CDEBUG(D_NET, "%p nid %s\n", lp, libcfs_nid2str(lp->lp_primary_nid));
 
 	LASSERT(atomic_read(&lp->lp_refcount) == 0);
+	LASSERT(lp->lp_rtr_refcount == 0);
 	LASSERT(list_empty(&lp->lp_peer_nets));
 	LASSERT(list_empty(&lp->lp_peer_list));
 	LASSERT(list_empty(&lp->lp_dc_list));
@@ -324,7 +326,7 @@
 	struct lnet_peer_table *ptable = NULL;
 
 	/* don't remove a peer_ni if it's also a gateway */
-	if (lpni->lpni_rtr_refcount > 0) {
+	if (lnet_isrouter(lpni)) {
 		CERROR("Peer NI %s is a gateway. Can not delete it\n",
 		       libcfs_nid2str(lpni->lpni_nid));
 		return -EBUSY;
@@ -570,7 +572,7 @@ void lnet_peer_uninit(void)
 {
 	struct lnet_peer_ni *lp;
 	struct lnet_peer_ni *tmp;
-	lnet_nid_t lpni_nid;
+	lnet_nid_t gw_nid;
 	int i;
 
 	for (i = 0; i < LNET_PEER_HASH_SIZE; i++) {
@@ -579,13 +581,13 @@ void lnet_peer_uninit(void)
 			if (net != lp->lpni_net)
 				continue;
 
-			if (!lp->lpni_rtr_refcount)
+			if (!lnet_isrouter(lp))
 				continue;
 
-			lpni_nid = lp->lpni_nid;
+			gw_nid = lp->lpni_peer_net->lpn_peer->lp_primary_nid;
 
 			lnet_net_unlock(LNET_LOCK_EX);
-			lnet_del_route(LNET_NIDNET(LNET_NID_ANY), lpni_nid);
+			lnet_del_route(LNET_NIDNET(LNET_NID_ANY), gw_nid);
 			lnet_net_lock(LNET_LOCK_EX);
 		}
 	}
@@ -1567,7 +1569,6 @@ struct lnet_peer_net *
 	CDEBUG(D_NET, "%p nid %s\n", lpni, libcfs_nid2str(lpni->lpni_nid));
 
 	LASSERT(atomic_read(&lpni->lpni_refcount) == 0);
-	LASSERT(lpni->lpni_rtr_refcount == 0);
 	LASSERT(list_empty(&lpni->lpni_txq));
 	LASSERT(lpni->lpni_txqnob == 0);
 	LASSERT(list_empty(&lpni->lpni_peer_nis));
diff --git a/net/lnet/lnet/router.c b/net/lnet/lnet/router.c
index c00b9251..4e79c21 100644
--- a/net/lnet/lnet/router.c
+++ b/net/lnet/lnet/router.c
@@ -114,7 +114,6 @@
 	spin_lock(&lp->lpni_lock);
 
 	lp->lpni_timestamp = when;		/* update timestamp */
-	lp->lpni_ping_deadline = 0;		/* disable ping timeout */
 
 	if (lp->lpni_alive_count &&		/* got old news */
 	    (!lp->lpni_alive) == (!alive)) {	/* new date for old news */
@@ -191,58 +190,6 @@
 	spin_unlock(&lp->lpni_lock);
 }
 
-static void
-lnet_rtr_addref_locked(struct lnet_peer_ni *lp)
-{
-	LASSERT(atomic_read(&lp->lpni_refcount) > 0);
-	LASSERT(lp->lpni_rtr_refcount >= 0);
-
-	/* lnet_net_lock must be exclusively locked */
-	lp->lpni_rtr_refcount++;
-	if (lp->lpni_rtr_refcount == 1) {
-		struct list_head *pos;
-
-		/* a simple insertion sort */
-		list_for_each_prev(pos, &the_lnet.ln_routers) {
-			struct lnet_peer_ni *rtr;
-
-			rtr = list_entry(pos, struct lnet_peer_ni,
-					 lpni_rtr_list);
-			if (rtr->lpni_nid < lp->lpni_nid)
-				break;
-		}
-
-		list_add(&lp->lpni_rtr_list, pos);
-		/* addref for the_lnet.ln_routers */
-		lnet_peer_ni_addref_locked(lp);
-		the_lnet.ln_routers_version++;
-	}
-}
-
-static void
-lnet_rtr_decref_locked(struct lnet_peer_ni *lp)
-{
-	LASSERT(atomic_read(&lp->lpni_refcount) > 0);
-	LASSERT(lp->lpni_rtr_refcount > 0);
-
-	/* lnet_net_lock must be exclusively locked */
-	lp->lpni_rtr_refcount--;
-	if (!lp->lpni_rtr_refcount) {
-		LASSERT(list_empty(&lp->lpni_routes));
-
-		if (lp->lpni_rcd) {
-			list_add(&lp->lpni_rcd->rcd_list,
-				 &the_lnet.ln_rcd_deathrow);
-			lp->lpni_rcd = NULL;
-		}
-
-		list_del(&lp->lpni_rtr_list);
-		/* decref for the_lnet.ln_routers */
-		lnet_peer_ni_decref_locked(lp);
-		the_lnet.ln_routers_version++;
-	}
-}
-
 struct lnet_remotenet *
 lnet_find_rnet_locked(u32 net)
 {
@@ -259,239 +206,24 @@ struct lnet_remotenet *
 	return NULL;
 }
 
-static void lnet_shuffle_seed(void)
-{
-	static int seeded;
-	struct lnet_ni *ni = NULL;
-
-	if (seeded)
-		return;
-
-	/* Nodes with small feet have little entropy
-	 * the NID for this node gives the most entropy in the low bits */
-	while ((ni = lnet_get_next_ni_locked(NULL, ni))) {
-		u32 lnd_type, seed;
-
-		lnd_type = LNET_NETTYP(LNET_NIDNET(ni->ni_nid));
-		if (lnd_type != LOLND) {
-			seed = (LNET_NIDADDR(ni->ni_nid) | lnd_type);
-			add_device_randomness(&seed, sizeof(seed));
-		}
-	}
-
-	seeded = 1;
-}
-
-/* NB expects LNET_LOCK held */
-static void
-lnet_add_route_to_rnet(struct lnet_remotenet *rnet, struct lnet_route *route)
-{
-	unsigned int len = 0;
-	unsigned int offset = 0;
-	struct list_head *e;
-
-	lnet_shuffle_seed();
-
-	list_for_each(e, &rnet->lrn_routes) {
-		len++;
-	}
-
-	/* len+1 positions to add a new entry */
-	offset = prandom_u32_max(len + 1);
-	list_for_each(e, &rnet->lrn_routes) {
-		if (!offset)
-			break;
-		offset--;
-	}
-	list_add(&route->lr_list, e);
-	list_add(&route->lr_gwlist, &route->lr_gateway->lpni_routes);
-
-	the_lnet.ln_remote_nets_version++;
-	lnet_rtr_addref_locked(route->lr_gateway);
-}
-
 int
 lnet_add_route(u32 net, u32 hops, lnet_nid_t gateway,
 	       unsigned int priority)
 {
-	struct lnet_remotenet *rnet;
-	struct lnet_remotenet *rnet2;
-	struct lnet_route *route;
-	struct lnet_route *route2;
-	struct lnet_ni *ni;
-	struct lnet_peer_ni *lpni;
-	int add_route;
-	int rc;
-
-	CDEBUG(D_NET, "Add route: net %s hops %d priority %u gw %s\n",
-	       libcfs_net2str(net), hops, priority, libcfs_nid2str(gateway));
-
-	if (gateway == LNET_NID_ANY ||
-	    LNET_NETTYP(LNET_NIDNET(gateway)) == LOLND ||
-	    net == LNET_NIDNET(LNET_NID_ANY) ||
-	    LNET_NETTYP(net) == LOLND ||
-	    LNET_NIDNET(gateway) == net ||
-	    (hops != LNET_UNDEFINED_HOPS && (hops < 1 || hops > 255)))
-		return -EINVAL;
-
-	if (lnet_islocalnet(net))	/* it's a local network */
-		return -EEXIST;
-
-	/* Assume net, route, all new */
-	route = kzalloc(sizeof(*route), GFP_NOFS);
-	rnet = kzalloc(sizeof(*rnet), GFP_NOFS);
-	if (!route || !rnet) {
-		CERROR("Out of memory creating route %s %d %s\n",
-		       libcfs_net2str(net), hops, libcfs_nid2str(gateway));
-		kfree(route);
-		kfree(rnet);
-		return -ENOMEM;
-	}
-
-	INIT_LIST_HEAD(&rnet->lrn_routes);
-	rnet->lrn_net = net;
-	route->lr_hops = hops;
-	route->lr_net = net;
-	route->lr_priority = priority;
-
-	lnet_net_lock(LNET_LOCK_EX);
-
-	lpni = lnet_nid2peerni_ex(gateway, LNET_LOCK_EX);
-	if (IS_ERR(lpni)) {
-		lnet_net_unlock(LNET_LOCK_EX);
-
-		kfree(route);
-		kfree(rnet);
-
-		rc = PTR_ERR(lpni);
-		if (rc == -EHOSTUNREACH) /* gateway is not on a local net */
-			return rc;	/* ignore the route entry */
-		CERROR("Error %d creating route %s %d %s\n", rc,
-		       libcfs_net2str(net), hops,
-		       libcfs_nid2str(gateway));
-		return rc;
-	}
-	route->lr_gateway = lpni;
-	LASSERT(the_lnet.ln_state == LNET_STATE_RUNNING);
-
-	rnet2 = lnet_find_rnet_locked(net);
-	if (!rnet2) {
-		/* new network */
-		list_add_tail(&rnet->lrn_list, lnet_net2rnethash(net));
-		rnet2 = rnet;
-	}
-
-	/* Search for a duplicate route (it's a NOOP if it is) */
-	add_route = 1;
-	list_for_each_entry(route2, &rnet2->lrn_routes, lr_list) {
-		if (route2->lr_gateway == route->lr_gateway) {
-			add_route = 0;
-			break;
-		}
-
-		/* our lookups must be true */
-		LASSERT(route2->lr_gateway->lpni_nid != gateway);
-	}
-
-	if (add_route) {
-		lnet_peer_ni_addref_locked(route->lr_gateway); /* +1 for notify */
-		lnet_add_route_to_rnet(rnet2, route);
-
-		ni = lnet_get_next_ni_locked(route->lr_gateway->lpni_net, NULL);
-		lnet_net_unlock(LNET_LOCK_EX);
-
-		/* XXX Assume alive */
-		if (ni->ni_net->net_lnd->lnd_notify)
-			ni->ni_net->net_lnd->lnd_notify(ni, gateway, 1);
-
-		lnet_net_lock(LNET_LOCK_EX);
-	}
-
-	/* -1 for notify or !add_route */
-	lnet_peer_ni_decref_locked(route->lr_gateway);
-	lnet_net_unlock(LNET_LOCK_EX);
-	rc = 0;
-
-	if (!add_route) {
-		rc = -EEXIST;
-		kfree(route);
-	}
-
-	if (rnet != rnet2)
-		kfree(rnet);
-
-	/* kick start the monitor thread to handle the added route */
-	wake_up(&the_lnet.ln_mt_waitq);
-
-	return rc;
+	net = net;
+	hops = hops;
+	gateway = gateway;
+	priority = priority;
+	return -EINVAL;
 }
 
+/* TODO: reimplement lnet_check_routes() */
 int
 lnet_del_route(u32 net, lnet_nid_t gw_nid)
 {
-	struct lnet_peer_ni *gateway;
-	struct lnet_remotenet *rnet;
-	struct lnet_route *route;
-	int rc = -ENOENT;
-	struct list_head *rn_list;
-	int idx = 0;
-
-	CDEBUG(D_NET, "Del route: net %s : gw %s\n",
-	       libcfs_net2str(net), libcfs_nid2str(gw_nid));
-
-	/*
-	 * NB Caller may specify either all routes via the given gateway
-	 * or a specific route entry actual NIDs)
-	 */
-	lnet_net_lock(LNET_LOCK_EX);
-	if (net == LNET_NIDNET(LNET_NID_ANY))
-		rn_list = &the_lnet.ln_remote_nets_hash[0];
-	else
-		rn_list = lnet_net2rnethash(net);
-
-again:
-	list_for_each_entry(rnet, rn_list, lrn_list) {
-		if (!(net == LNET_NIDNET(LNET_NID_ANY) ||
-		      net == rnet->lrn_net))
-			continue;
-
-		list_for_each_entry(route, &rnet->lrn_routes, lr_list) {
-			gateway = route->lr_gateway;
-			if (!(gw_nid == LNET_NID_ANY ||
-			      gw_nid == gateway->lpni_nid))
-				continue;
-
-			list_del(&route->lr_list);
-			list_del(&route->lr_gwlist);
-			the_lnet.ln_remote_nets_version++;
-
-			if (list_empty(&rnet->lrn_routes))
-				list_del(&rnet->lrn_list);
-			else
-				rnet = NULL;
-
-			lnet_rtr_decref_locked(gateway);
-			lnet_peer_ni_decref_locked(gateway);
-
-			lnet_net_unlock(LNET_LOCK_EX);
-
-			kfree(route);
-			kfree(rnet);
-
-			rc = 0;
-			lnet_net_lock(LNET_LOCK_EX);
-			goto again;
-		}
-	}
-
-	if (net == LNET_NIDNET(LNET_NID_ANY) &&
-	    ++idx < LNET_REMOTE_NETS_HASH_SIZE) {
-		rn_list = &the_lnet.ln_remote_nets_hash[idx];
-		goto again;
-	}
-	lnet_net_unlock(LNET_LOCK_EX);
-
-	return rc;
+	net = net;
+	gw_nid = gw_nid;
+	return -EINVAL;
 }
 
 void
@@ -553,7 +285,8 @@ int lnet_get_rtr_pool_cfg(int cpt, struct lnet_ioctl_pool_cfg *pool_cfg)
 					*net = rnet->lrn_net;
 					*hops = route->lr_hops;
 					*priority = route->lr_priority;
-					*gateway = route->lr_gateway->lpni_nid;
+					*gateway =
+					    route->lr_gateway->lp_primary_nid;
 					*alive = lnet_is_route_alive(route);
 					lnet_net_unlock(cpt);
 					return 0;
@@ -588,110 +321,12 @@ int lnet_get_rtr_pool_cfg(int cpt, struct lnet_ioctl_pool_cfg *pool_cfg)
 }
 
 /**
- * parse router-checker pinginfo, record number of down NIs for remote
- * networks on that router.
+ * TODO: re-implement
  */
 static void
 lnet_parse_rc_info(struct lnet_rc_data *rcd)
 {
-	struct lnet_ping_buffer *pbuf = rcd->rcd_pingbuffer;
-	struct lnet_peer_ni *gw = rcd->rcd_gateway;
-	struct lnet_route *rte;
-	int nnis;
-
-	if (!gw->lpni_alive || !pbuf)
-		return;
-
-	/*
-	 * Protect gw->lpni_ping_feats. This can be set from
-	 * lnet_notify_locked with different locks being held
-	 */
-	spin_lock(&gw->lpni_lock);
-
-	if (pbuf->pb_info.pi_magic == __swab32(LNET_PROTO_PING_MAGIC))
-		lnet_swap_pinginfo(pbuf);
-
-	/* NB always racing with network! */
-	if (pbuf->pb_info.pi_magic != LNET_PROTO_PING_MAGIC) {
-		CDEBUG(D_NET, "%s: Unexpected magic %08x\n",
-		       libcfs_nid2str(gw->lpni_nid), pbuf->pb_info.pi_magic);
-		gw->lpni_ping_feats = LNET_PING_FEAT_INVAL;
-		goto out;
-	}
-
-	gw->lpni_ping_feats = pbuf->pb_info.pi_features;
-
-	/* Without NI status info there's nothing more to do. */
-	if (!(gw->lpni_ping_feats & LNET_PING_FEAT_NI_STATUS))
-		goto out;
-
-	/* Determine the number of NIs for which there is data. */
-	nnis = pbuf->pb_info.pi_nnis;
-	if (pbuf->pb_nnis < nnis) {
-		if (rcd->rcd_nnis < nnis)
-			rcd->rcd_nnis = nnis;
-		nnis = pbuf->pb_nnis;
-	}
-
-	list_for_each_entry(rte, &gw->lpni_routes, lr_gwlist) {
-		int down = 0;
-		int up = 0;
-		int i;
-
-		/* If routing disabled then the route is down. */
-		if (gw->lpni_ping_feats & LNET_PING_FEAT_RTE_DISABLED) {
-			rte->lr_downis = 1;
-			continue;
-		}
-
-		for (i = 0; i < nnis; i++) {
-			struct lnet_ni_status *stat = &pbuf->pb_info.pi_ni[i];
-			lnet_nid_t nid = stat->ns_nid;
-
-			if (nid == LNET_NID_ANY) {
-				CDEBUG(D_NET, "%s: unexpected LNET_NID_ANY\n",
-				       libcfs_nid2str(gw->lpni_nid));
-				gw->lpni_ping_feats = LNET_PING_FEAT_INVAL;
-				goto out;
-			}
-
-			if (LNET_NETTYP(LNET_NIDNET(nid)) == LOLND)
-				continue;
-
-			if (stat->ns_status == LNET_NI_STATUS_DOWN) {
-				down++;
-				continue;
-			}
-
-			if (stat->ns_status == LNET_NI_STATUS_UP) {
-				if (LNET_NIDNET(nid) == rte->lr_net) {
-					up = 1;
-					break;
-				}
-				continue;
-			}
-
-			CDEBUG(D_NET, "%s: Unexpected status 0x%x\n",
-			       libcfs_nid2str(gw->lpni_nid), stat->ns_status);
-			gw->lpni_ping_feats = LNET_PING_FEAT_INVAL;
-			goto out;
-		}
-
-		if (up) { /* ignore downed NIs if NI for dest network is up */
-			rte->lr_downis = 0;
-			continue;
-		}
-		/**
-		 * if @down is zero and this route is single-hop, it means
-		 * we can't find NI for target network
-		 */
-		if (!down && rte->lr_hops == 1)
-			down = 1;
-
-		rte->lr_downis = down;
-	}
-out:
-	spin_unlock(&gw->lpni_lock);
+	rcd = rcd;
 }
 
 static void
@@ -725,7 +360,6 @@ int lnet_get_rtr_pool_cfg(int cpt, struct lnet_ioctl_pool_cfg *pool_cfg)
 	}
 
 	if (event->type == LNET_EVENT_SEND) {
-		lp->lpni_ping_notsent = 0;
 		if (!event->status)
 			goto out;
 	}
@@ -755,7 +389,7 @@ int lnet_get_rtr_pool_cfg(int cpt, struct lnet_ioctl_pool_cfg *pool_cfg)
 static void
 lnet_wait_known_routerstate(void)
 {
-	struct lnet_peer_ni *rtr;
+	struct lnet_peer *rtr;
 	int all_known;
 
 	LASSERT(the_lnet.ln_mt_state == LNET_MT_STATE_RUNNING);
@@ -764,15 +398,15 @@ int lnet_get_rtr_pool_cfg(int cpt, struct lnet_ioctl_pool_cfg *pool_cfg)
 		int cpt = lnet_net_lock_current();
 
 		all_known = 1;
-		list_for_each_entry(rtr, &the_lnet.ln_routers, lpni_rtr_list) {
-			spin_lock(&rtr->lpni_lock);
+		list_for_each_entry(rtr, &the_lnet.ln_routers, lp_rtr_list) {
+			spin_lock(&rtr->lp_lock);
 
-			if (!rtr->lpni_alive_count) {
+			if (!(rtr->lp_state & LNET_PEER_DISCOVERED)) {
 				all_known = 0;
-				spin_unlock(&rtr->lpni_lock);
+				spin_unlock(&rtr->lp_lock);
 				break;
 			}
-			spin_unlock(&rtr->lpni_lock);
+			spin_unlock(&rtr->lp_lock);
 		}
 
 		lnet_net_unlock(cpt);
@@ -784,17 +418,22 @@ int lnet_get_rtr_pool_cfg(int cpt, struct lnet_ioctl_pool_cfg *pool_cfg)
 	}
 }
 
+/* TODO: reimplement */
 void
 lnet_router_ni_update_locked(struct lnet_peer_ni *gw, u32 net)
 {
 	struct lnet_route *rte;
+	struct lnet_peer *lp;
 
-	if ((gw->lpni_ping_feats & LNET_PING_FEAT_NI_STATUS)) {
-		list_for_each_entry(rte, &gw->lpni_routes, lr_gwlist) {
-			if (rte->lr_net == net) {
-				rte->lr_downis = 0;
-				break;
-			}
+	if ((gw->lpni_ping_feats & LNET_PING_FEAT_NI_STATUS))
+		lp = gw->lpni_peer_net->lpn_peer;
+	else
+		return;
+
+	list_for_each_entry(rte, &lp->lp_routes, lr_gwlist) {
+		if (rte->lr_net == net) {
+			rte->lr_downis = 0;
+			break;
 		}
 	}
 }
@@ -841,212 +480,6 @@ int lnet_get_rtr_pool_cfg(int cpt, struct lnet_ioctl_pool_cfg *pool_cfg)
 	}
 }
 
-static void
-lnet_destroy_rc_data(struct lnet_rc_data *rcd)
-{
-	LASSERT(list_empty(&rcd->rcd_list));
-	/* detached from network */
-	LASSERT(LNetMDHandleIsInvalid(rcd->rcd_mdh));
-
-	if (rcd->rcd_gateway) {
-		int cpt = rcd->rcd_gateway->lpni_cpt;
-
-		lnet_net_lock(cpt);
-		lnet_peer_ni_decref_locked(rcd->rcd_gateway);
-		lnet_net_unlock(cpt);
-	}
-
-	if (rcd->rcd_pingbuffer)
-		lnet_ping_buffer_decref(rcd->rcd_pingbuffer);
-
-	kfree(rcd);
-}
-
-static struct lnet_rc_data *
-lnet_update_rc_data_locked(struct lnet_peer_ni *gateway)
-{
-	struct lnet_handle_md mdh;
-	struct lnet_rc_data *rcd;
-	struct lnet_ping_buffer *pbuf = NULL;
-	struct lnet_md md;
-	int nnis = LNET_INTERFACES_MIN;
-	int rc;
-	int i;
-
-	rcd = gateway->lpni_rcd;
-	if (rcd) {
-		nnis = rcd->rcd_nnis;
-		mdh = rcd->rcd_mdh;
-		LNetInvalidateMDHandle(&rcd->rcd_mdh);
-		pbuf = rcd->rcd_pingbuffer;
-		rcd->rcd_pingbuffer = NULL;
-	} else {
-		LNetInvalidateMDHandle(&mdh);
-	}
-
-	lnet_net_unlock(gateway->lpni_cpt);
-
-	if (rcd) {
-		LNetMDUnlink(mdh);
-		lnet_ping_buffer_decref(pbuf);
-	} else {
-		rcd = kzalloc(sizeof(*rcd), GFP_NOFS);
-		if (!rcd)
-			goto out;
-
-		LNetInvalidateMDHandle(&rcd->rcd_mdh);
-		INIT_LIST_HEAD(&rcd->rcd_list);
-		rcd->rcd_nnis = nnis;
-	}
-
-	pbuf = lnet_ping_buffer_alloc(nnis, GFP_NOFS);
-	if (!pbuf)
-		goto out;
-
-	for (i = 0; i < nnis; i++) {
-		pbuf->pb_info.pi_ni[i].ns_nid = LNET_NID_ANY;
-		pbuf->pb_info.pi_ni[i].ns_status = LNET_NI_STATUS_INVALID;
-	}
-	rcd->rcd_pingbuffer = pbuf;
-
-	md.start = &pbuf->pb_info;
-	md.user_ptr = rcd;
-	md.length = LNET_PING_INFO_SIZE(nnis);
-	md.threshold = LNET_MD_THRESH_INF;
-	md.options = LNET_MD_TRUNCATE;
-	md.eq_handle = the_lnet.ln_rc_eqh;
-
-	LASSERT(!LNetEQHandleIsInvalid(the_lnet.ln_rc_eqh));
-	rc = LNetMDBind(md, LNET_UNLINK, &rcd->rcd_mdh);
-	if (rc < 0) {
-		CERROR("Can't bind MD: %d\n", rc);
-		goto out_ping_buffer_decref;
-	}
-	LASSERT(!rc);
-
-	lnet_net_lock(gateway->lpni_cpt);
-	/* Check if this is still a router. */
-	if (!lnet_isrouter(gateway))
-		goto out_unlock;
-	/* Check if someone else installed router data. */
-	if (gateway->lpni_rcd && gateway->lpni_rcd != rcd)
-		goto out_unlock;
-
-	/* Install and/or update the router data. */
-	if (!gateway->lpni_rcd) {
-		lnet_peer_ni_addref_locked(gateway);
-		rcd->rcd_gateway = gateway;
-		gateway->lpni_rcd = rcd;
-	}
-	gateway->lpni_ping_notsent = 0;
-
-	return rcd;
-
-out_unlock:
-	lnet_net_unlock(gateway->lpni_cpt);
-	rc = LNetMDUnlink(mdh);
-	LASSERT(!rc);
-out_ping_buffer_decref:
-	lnet_ping_buffer_decref(pbuf);
-out:
-	if (rcd && rcd != gateway->lpni_rcd)
-		lnet_destroy_rc_data(rcd);
-	lnet_net_lock(gateway->lpni_cpt);
-	return gateway->lpni_rcd;
-}
-
-static int
-lnet_router_check_interval(struct lnet_peer_ni *rtr)
-{
-	int secs;
-
-	secs = rtr->lpni_alive ? live_router_check_interval :
-			       dead_router_check_interval;
-	if (secs < 0)
-		secs = 0;
-
-	return secs;
-}
-
-static void
-lnet_ping_router_locked(struct lnet_peer_ni *rtr)
-{
-	struct lnet_rc_data *rcd = NULL;
-	time64_t now = ktime_get_seconds();
-	time64_t secs;
-	struct lnet_ni *ni;
-
-	lnet_peer_ni_addref_locked(rtr);
-
-	if (rtr->lpni_ping_deadline && /* ping timed out? */
-	    now > rtr->lpni_ping_deadline)
-		lnet_notify_locked(rtr, 1, 0, now);
-
-	/* Run any outstanding notifications */
-	ni = lnet_get_next_ni_locked(rtr->lpni_net, NULL);
-	lnet_ni_notify_locked(ni, rtr);
-
-	if (!lnet_isrouter(rtr) ||
-	    the_lnet.ln_mt_state != LNET_MT_STATE_RUNNING) {
-		/* router table changed or router checker is shutting down */
-		lnet_peer_ni_decref_locked(rtr);
-		return;
-	}
-
-	rcd = rtr->lpni_rcd;
-
-	/* The response to the router checker ping could've timed out and
-	 * the mdh might've been invalidated, so we need to update it
-	 * again.
-	 */
-	if (!rcd || rcd->rcd_nnis > rcd->rcd_pingbuffer->pb_nnis ||
-	    LNetMDHandleIsInvalid(rcd->rcd_mdh))
-		rcd = lnet_update_rc_data_locked(rtr);
-	if (!rcd)
-		return;
-
-	secs = lnet_router_check_interval(rtr);
-
-	CDEBUG(D_NET,
-	       "rtr %s %lldd: deadline %lld ping_notsent %d alive %d alive_count %d lpni_ping_timestamp %lld\n",
-	       libcfs_nid2str(rtr->lpni_nid), secs,
-	       rtr->lpni_ping_deadline, rtr->lpni_ping_notsent,
-	       rtr->lpni_alive, rtr->lpni_alive_count,
-	       rtr->lpni_ping_timestamp);
-
-	if (secs && !rtr->lpni_ping_notsent &&
-	    now > rtr->lpni_ping_timestamp + secs) {
-		int rc;
-		struct lnet_process_id id;
-		struct lnet_handle_md mdh;
-
-		id.nid = rtr->lpni_nid;
-		id.pid = LNET_PID_LUSTRE;
-		CDEBUG(D_NET, "Check: %s\n", libcfs_id2str(id));
-
-		rtr->lpni_ping_notsent = 1;
-		rtr->lpni_ping_timestamp = now;
-
-		mdh = rcd->rcd_mdh;
-
-		if (!rtr->lpni_ping_deadline) {
-			rtr->lpni_ping_deadline = ktime_get_seconds() +
-						  router_ping_timeout;
-		}
-
-		lnet_net_unlock(rtr->lpni_cpt);
-
-		rc = LNetGet(LNET_NID_ANY, mdh, id, LNET_RESERVED_PORTAL,
-			     LNET_PROTO_PING_MATCHBITS, 0, false);
-
-		lnet_net_lock(rtr->lpni_cpt);
-		if (rc)
-			rtr->lpni_ping_notsent = 0; /* no event pending */
-	}
-
-	lnet_peer_ni_decref_locked(rtr);
-}
-
 int lnet_router_pre_mt_start(void)
 {
 	int rc;
@@ -1088,81 +521,7 @@ void lnet_router_cleanup(void)
 
 void lnet_prune_rc_data(int wait_unlink)
 {
-	struct lnet_rc_data *rcd;
-	struct lnet_rc_data *tmp;
-	struct lnet_peer_ni *lp;
-	struct list_head head;
-	int i = 2;
-
-	if (likely(the_lnet.ln_mt_state == LNET_MT_STATE_RUNNING &&
-		   list_empty(&the_lnet.ln_rcd_deathrow) &&
-		   list_empty(&the_lnet.ln_rcd_zombie)))
-		return;
-
-	INIT_LIST_HEAD(&head);
-
-	lnet_net_lock(LNET_LOCK_EX);
-
-	if (the_lnet.ln_mt_state != LNET_MT_STATE_RUNNING) {
-		/* router checker is stopping, prune all */
-		list_for_each_entry(lp, &the_lnet.ln_routers,
-				    lpni_rtr_list) {
-			if (!lp->lpni_rcd)
-				continue;
-
-			LASSERT(list_empty(&lp->lpni_rcd->rcd_list));
-			list_add(&lp->lpni_rcd->rcd_list,
-				 &the_lnet.ln_rcd_deathrow);
-			lp->lpni_rcd = NULL;
-		}
-	}
-
-	/* unlink all RCDs on deathrow list */
-	list_splice_init(&the_lnet.ln_rcd_deathrow, &head);
-
-	if (!list_empty(&head)) {
-		lnet_net_unlock(LNET_LOCK_EX);
-
-		list_for_each_entry(rcd, &head, rcd_list)
-			LNetMDUnlink(rcd->rcd_mdh);
-
-		lnet_net_lock(LNET_LOCK_EX);
-	}
-
-	list_splice_init(&head, &the_lnet.ln_rcd_zombie);
-
-	/* release all zombie RCDs */
-	while (!list_empty(&the_lnet.ln_rcd_zombie)) {
-		list_for_each_entry_safe(rcd, tmp, &the_lnet.ln_rcd_zombie,
-					 rcd_list) {
-			if (LNetMDHandleIsInvalid(rcd->rcd_mdh))
-				list_move(&rcd->rcd_list, &head);
-		}
-
-		wait_unlink = wait_unlink &&
-			      !list_empty(&the_lnet.ln_rcd_zombie);
-
-		lnet_net_unlock(LNET_LOCK_EX);
-
-		while ((rcd = list_first_entry_or_null(&head,
-						       struct lnet_rc_data,
-						       rcd_list)) != NULL) {
-			list_del_init(&rcd->rcd_list);
-			lnet_destroy_rc_data(rcd);
-		}
-
-		if (!wait_unlink)
-			return;
-
-		i++;
-		CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET,
-		       "Waiting for rc buffers to unlink\n");
-		schedule_timeout_uninterruptible(HZ / 4);
-
-		lnet_net_lock(LNET_LOCK_EX);
-	}
-
-	lnet_net_unlock(LNET_LOCK_EX);
+	wait_unlink = wait_unlink;
 }
 
 /*
@@ -1194,27 +553,16 @@ bool lnet_router_checker_active(void)
 void
 lnet_check_routers(void)
 {
-	struct lnet_peer_ni *rtr;
+	struct lnet_peer *rtr;
 	u64 version;
 	int cpt;
-	int cpt2;
 
 	cpt = lnet_net_lock_current();
 rescan:
 	version = the_lnet.ln_routers_version;
 
-	list_for_each_entry(rtr, &the_lnet.ln_routers, lpni_rtr_list) {
-		cpt2 = rtr->lpni_cpt;
-		if (cpt != cpt2) {
-			lnet_net_unlock(cpt);
-			cpt = cpt2;
-			lnet_net_lock(cpt);
-			/* the routers list has changed */
-			if (version != the_lnet.ln_routers_version)
-				goto rescan;
-		}
-
-		lnet_ping_router_locked(rtr);
+	list_for_each_entry(rtr, &the_lnet.ln_routers, lp_rtr_list) {
+		/* TODO use discovery to determine if router is alive */
 
 		/* NB dropped lock */
 		if (version != the_lnet.ln_routers_version) {
diff --git a/net/lnet/lnet/router_proc.c b/net/lnet/lnet/router_proc.c
index 5341599..d41ff00 100644
--- a/net/lnet/lnet/router_proc.c
+++ b/net/lnet/lnet/router_proc.c
@@ -215,7 +215,7 @@ static int proc_lnet_routes(struct ctl_table *table, int write,
 			u32 net = rnet->lrn_net;
 			u32 hops = route->lr_hops;
 			unsigned int priority = route->lr_priority;
-			lnet_nid_t nid = route->lr_gateway->lpni_nid;
+			lnet_nid_t nid = route->lr_gateway->lp_primary_nid;
 			int alive = lnet_is_route_alive(route);
 
 			s += snprintf(s, tmpstr + tmpsiz - s,
@@ -290,7 +290,7 @@ static int proc_lnet_routers(struct ctl_table *table, int write,
 		*ppos = LNET_PROC_POS_MAKE(0, ver, 0, off);
 	} else {
 		struct list_head *r;
-		struct lnet_peer_ni *peer = NULL;
+		struct lnet_peer *peer = NULL;
 		int skip = off - 1;
 
 		lnet_net_lock(0);
@@ -305,9 +305,9 @@ static int proc_lnet_routers(struct ctl_table *table, int write,
 		r = the_lnet.ln_routers.next;
 
 		while (r != &the_lnet.ln_routers) {
-			struct lnet_peer_ni *lp;
+			struct lnet_peer *lp;
 
-			lp = list_entry(r, struct lnet_peer_ni, lpni_rtr_list);
+			lp = list_entry(r, struct lnet_peer, lp_rtr_list);
 			if (!skip) {
 				peer = lp;
 				break;
@@ -318,21 +318,22 @@ static int proc_lnet_routers(struct ctl_table *table, int write,
 		}
 
 		if (peer) {
-			lnet_nid_t nid = peer->lpni_nid;
+			lnet_nid_t nid = peer->lp_primary_nid;
 			time64_t now = ktime_get_seconds();
-			time64_t deadline = peer->lpni_ping_deadline;
-			int nrefs = atomic_read(&peer->lpni_refcount);
-			int nrtrrefs = peer->lpni_rtr_refcount;
-			int alive_cnt = peer->lpni_alive_count;
-			int alive = peer->lpni_alive;
-			int pingsent = !peer->lpni_ping_notsent;
-			time64_t last_ping = now - peer->lpni_ping_timestamp;
+			/* TODO: readjust what's being printed */
+			time64_t deadline = 0;
+			int nrefs = atomic_read(&peer->lp_refcount);
+			int nrtrrefs = peer->lp_rtr_refcount;
+			int alive_cnt = 0;
+			int alive = 0;
+			int pingsent = ((peer->lp_state & LNET_PEER_PING_SENT)
+				       != 0);
+			time64_t last_ping = now - peer->lp_rtrcheck_timestamp;
 			int down_ni = 0;
 			struct lnet_route *rtr;
 
-			if ((peer->lpni_ping_feats &
-			     LNET_PING_FEAT_NI_STATUS)) {
-				list_for_each_entry(rtr, &peer->lpni_routes,
+			if (nrtrrefs > 0) {
+				list_for_each_entry(rtr, &peer->lp_routes,
 						    lr_gwlist) {
 					/*
 					 * downis on any route should be the
-- 
1.8.3.1

  parent reply	other threads:[~2020-02-27 21:13 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 ` [lustre-devel] [PATCH 075/622] lnet: refactor lnet_select_pathway() James Simmons
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 ` James Simmons [this message]
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-332-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.