-#define LNET_PROC_ROOT "sys/lnet"
-#define LNET_PROC_STATS LNET_PROC_ROOT"/stats"
-#define LNET_PROC_ROUTES LNET_PROC_ROOT"/routes"
-#define LNET_PROC_ROUTERS LNET_PROC_ROOT"/routers"
-#define LNET_PROC_PEERS LNET_PROC_ROOT"/peers"
-#define LNET_PROC_BUFFERS LNET_PROC_ROOT"/buffers"
-#define LNET_PROC_NIS LNET_PROC_ROOT"/nis"
-
-static int
-lnet_router_proc_stats_read (char *page, char **start, off_t off,
- int count, int *eof, void *data)
+static cfs_sysctl_table_header_t *lnet_table_header = NULL;
+
+#ifndef HAVE_SYSCTL_UNNUMBERED
+#define CTL_LNET (0x100)
+enum {
+ PSDEV_LNET_STATS = 100,
+ PSDEV_LNET_ROUTES,
+ PSDEV_LNET_ROUTERS,
+ PSDEV_LNET_PEERS,
+ PSDEV_LNET_BUFFERS,
+ PSDEV_LNET_NIS,
+};
+#else
+#define CTL_LNET CTL_UNNUMBERED
+#define PSDEV_LNET_STATS CTL_UNNUMBERED
+#define PSDEV_LNET_ROUTES CTL_UNNUMBERED
+#define PSDEV_LNET_ROUTERS CTL_UNNUMBERED
+#define PSDEV_LNET_PEERS CTL_UNNUMBERED
+#define PSDEV_LNET_BUFFERS CTL_UNNUMBERED
+#define PSDEV_LNET_NIS CTL_UNNUMBERED
+#endif
+
+/*
+ * NB: we don't use the highest bit of *ppos because it's signed;
+ * next 9 bits is used to stash idx (assuming that
+ * LNET_PEER_HASHSIZE < 512)
+ */
+#define LNET_LOFFT_BITS (sizeof(loff_t) * 8)
+#define LNET_VERSION_BITS MAX(((MIN(LNET_LOFFT_BITS, 64)) / 4), 8)
+#define LNET_PHASH_IDX_BITS 9
+#define LNET_PHASH_NUM_BITS (LNET_LOFFT_BITS - 1 -\
+ LNET_VERSION_BITS - LNET_PHASH_IDX_BITS)
+#define LNET_PHASH_BITS (LNET_PHASH_IDX_BITS + LNET_PHASH_NUM_BITS)
+
+#define LNET_VERSION_BITMASK ((1ULL << LNET_VERSION_BITS) - 1)
+#define LNET_PHASH_IDX_BITMASK ((1ULL << LNET_PHASH_IDX_BITS) - 1)
+#define LNET_PHASH_NUM_BITMASK ((1ULL << LNET_PHASH_NUM_BITS) - 1)
+
+#define LNET_VERSION_MASK (LNET_VERSION_BITMASK << LNET_PHASH_BITS)
+#define LNET_PHASH_IDX_MASK (LNET_PHASH_IDX_BITMASK << LNET_PHASH_NUM_BITS)
+#define LNET_PHASH_NUM_MASK (LNET_PHASH_NUM_BITMASK)
+
+#define LNET_VERSION_GET(pos) (int)(((pos) & LNET_VERSION_MASK) >> \
+ LNET_PHASH_BITS)
+#define LNET_PHASH_IDX_GET(pos) (int)(((pos) & LNET_PHASH_IDX_MASK) >> \
+ LNET_PHASH_NUM_BITS)
+#define LNET_PHASH_NUM_GET(pos) (int)((pos) & LNET_PHASH_NUM_MASK)
+#define LNET_VERSION_VALID_MASK(ver) \
+ (unsigned int)((ver) & \
+ LNET_VERSION_BITMASK)
+#define LNET_PHASH_POS_MAKE(ver, idx, num) \
+ (((((loff_t)(ver)) & LNET_VERSION_BITMASK) << \
+ LNET_PHASH_BITS) | \
+ ((((loff_t)(idx)) & LNET_PHASH_IDX_BITMASK) <<\
+ LNET_PHASH_NUM_BITS) | \
+ ((num) & LNET_PHASH_NUM_BITMASK))
+
+static int __proc_lnet_stats(void *data, int write,
+ loff_t pos, void *buffer, int nob)