+
+static int
+libcfs_expand_nidrange(struct nidrange *nr, __u32 *addrs, int max_nids)
+{
+ struct addrrange *ar;
+ int rc = 0, count = max_nids;
+ struct netstrfns *nf = nr->nr_netstrfns;
+
+ list_for_each_entry(ar, &nr->nr_addrranges, ar_link) {
+ rc = nf->nf_expand_addrrange(&ar->ar_numaddr_ranges, addrs,
+ count);
+ if (rc < 0)
+ return rc;
+
+ count -= rc;
+ }
+
+ return max_nids - count;
+}
+
+int cfs_expand_nidlist(struct list_head *nidlist, lnet_nid_t *lnet_nidlist,
+ int max_nids)
+{
+ struct nidrange *nr;
+ int rc = 0, count = max_nids;
+ int i, j = 0;
+ __u32 *addrs;
+ struct netstrfns *nf;
+ __u32 net;
+
+ addrs = calloc(max_nids, sizeof(__u32));
+ if (!addrs)
+ return -ENOMEM;
+
+ list_for_each_entry(nr, nidlist, nr_link) {
+ rc = libcfs_expand_nidrange(nr, addrs, count);
+
+ if (rc < 0) {
+ free(addrs);
+ return rc;
+ }
+
+ nf = nr->nr_netstrfns;
+ net = LNET_MKNET(nf->nf_type, nr->nr_netnum);
+
+ for (i = count - 1; i >= count - rc; i--)
+ lnet_nidlist[j++] = LNET_MKNID(net, addrs[i]);
+
+ count -= rc;
+ }
+
+ free(addrs);
+ return max_nids - count;
+}