Merge pull request #1749 from ez-lbz/fix-node-name-map-duplicate

util: Fix duplicate node name map entries
diff --git a/buildlib/azure-pipelines.yml b/buildlib/azure-pipelines.yml
index 5f80523..3a00900 100644
--- a/buildlib/azure-pipelines.yml
+++ b/buildlib/azure-pipelines.yml
@@ -34,7 +34,7 @@
       image: ucfconsort.azurecr.io/rdma-core/ubuntu-20.04:44.0
       endpoint: ucfconsort_registry
     - container: leap
-      image: ucfconsort.azurecr.io/rdma-core/opensuse-15.0:25.0
+      image: ucfconsort.azurecr.io/rdma-core/opensuse-16.0:64.0
       endpoint: ucfconsort_registry
     - container: i386
       image: ucfconsort.azurecr.io/rdma-core/debian-11-i386:37.0
diff --git a/buildlib/cbuild b/buildlib/cbuild
index eeaf2e2..a307ae2 100755
--- a/buildlib/cbuild
+++ b/buildlib/cbuild
@@ -404,7 +404,7 @@
         return res;
 
 class leap(ZypperEnvironment):
-    docker_parent = "opensuse/leap:15.0";
+    docker_parent = "opensuse/leap:16.0";
     specfile = "suse/rdma-core.spec";
     pkgs = {
         'cmake',
@@ -426,7 +426,7 @@
     };
     rpmbuild_options = [ "--without=curlmini" ];
     to_azp = True;
-    name = "opensuse-15.0";
+    name = "opensuse-16.0";
     aliases = {"leap"};
 
 class tumbleweed(ZypperEnvironment):
diff --git a/libibumad/umad.c b/libibumad/umad.c
index d18fbb5..1618381 100644
--- a/libibumad/umad.c
+++ b/libibumad/umad.c
@@ -1482,13 +1482,22 @@
 	ca_names_t *legacy_ca_names = malloc(sizeof(ca_names_t));
 	if (!legacy_ca_names)
 		return -1;
-	struct port_guid_port_count counts[UMAD_MAX_PORTS] = {};
-	struct guid_ca_pairs_mapping mapping[UMAD_MAX_PORTS] = {};
+	struct port_guid_port_count *counts = calloc(UMAD_MAX_PORTS, sizeof(struct port_guid_port_count));
+	struct guid_ca_pairs_mapping *mapping = calloc(UMAD_MAX_PORTS, sizeof(struct guid_ca_pairs_mapping));
+
+	if (!counts || !mapping) {
+		free(counts);
+		free(mapping);
+		free(legacy_ca_names);
+		return -1;
+	}
 
 	memset(cas, 0, sizeof(struct umad_ca_pair) * max);
 	int cas_found = umad_get_cas_names(legacy_ca_names->_ca_names_arr, UMAD_MAX_DEVICES);
 
 	if (cas_found < 0) {
+		free(counts);
+		free(mapping);
 		free(legacy_ca_names);
 		return 0;
 	}
@@ -1532,6 +1541,8 @@
 				break;
 			} else {
 				umad_release_ca(&curr_ca);
+				free(counts);
+				free(mapping);
 				free(legacy_ca_names);
 				return -1;
 			}
@@ -1540,6 +1551,8 @@
 		umad_release_ca(&curr_ca);
 	}
 
+	free(counts);
+	free(mapping);
 	free(legacy_ca_names);
 	return added_devices;
 }
@@ -1625,18 +1638,23 @@
 	bool is_gsi		= false;
 
 	umad_ca_t ca;
-	struct umad_ca_pair cas_pair[UMAD_MAX_PORTS] = {};
+	struct umad_ca_pair *cas_pair;
 
 	if (!ca_pair)
 		return -1;
 
-	memset(cas_pair, 0, sizeof(cas_pair));
+	cas_pair = calloc(UMAD_MAX_PORTS, sizeof(struct umad_ca_pair));
+	if (!cas_pair)
+		return -1;
+
 	memset(ca_pair, 0, sizeof(*ca_pair));
 
 	num_cas = umad_get_smi_gsi_pairs(cas_pair, UMAD_MAX_PORTS);
 
-	if (num_cas <= 0)
+	if (num_cas <= 0) {
+		free(cas_pair);
 		return num_cas;
+	}
 
 	for (i = 0; i < (size_t)num_cas; ++i) {
 		if (enforce_smi && !cas_pair[i].smi_name[0])
@@ -1678,9 +1696,11 @@
 
 	if (rc) {
 		errno = ENODEV;
+		free(cas_pair);
 		return -errno;
 	}
 
+	free(cas_pair);
 	return rc;
 }
 
diff --git a/libibumad/umad.h b/libibumad/umad.h
index 3ca436b..e56a132 100644
--- a/libibumad/umad.h
+++ b/libibumad/umad.h
@@ -116,7 +116,7 @@
 #define SYS_IB_MAD_PORT		"port"
 #define SYS_IB_MAD_DEV		"ibdev"
 
-#define UMAD_MAX_PORTS		64
+#define UMAD_MAX_PORTS		192
 
 #define SYS_CA_PORTS_DIR	"ports"
 
diff --git a/providers/efa/verbs.c b/providers/efa/verbs.c
index 09604a4..f7dd9bb 100644
--- a/providers/efa/verbs.c
+++ b/providers/efa/verbs.c
@@ -2923,7 +2923,7 @@
 	rdma_tracepoint(rdma_core_efa, post_send, qp->dev->name, ibvqpx->wr_id,
 			EFA_GET(&md->ctrl1, EFA_IO_TX_META_DESC_OP_TYPE),
 			ibvqpx->qp_base.qp_num, remote_qpn, ah->efa_ah,
-			efa_wqe_get_data_length(qp->sq));
+			efa_wqe_get_data_length(&qp->sq));
 }
 
 static void efa_send_wr_set_processing_hints(struct efadv_qp *efadv_qp, uint32_t hints)
diff --git a/providers/rxe/rxe.c b/providers/rxe/rxe.c
index 423f834..fc91223 100644
--- a/providers/rxe/rxe.c
+++ b/providers/rxe/rxe.c
@@ -1102,6 +1102,7 @@
 
 		memcpy(data, buf_list->addr, length);
 
+		tot_length += length;
 		buf_list++;
 		data += length;
 	}
@@ -1138,6 +1139,7 @@
 	struct rxe_send_wqe *wqe = addr_from_index(qp->sq.queue,
 						   qp->cur_index - 1);
 	size_t tot_length = 0;
+	size_t i;
 
 	if (qp->err)
 		return;
@@ -1150,8 +1152,8 @@
 	wqe->dma.num_sge = num_sge;
 	memcpy(wqe->dma.sge, sg_list, num_sge*sizeof(*sg_list));
 
-	while (num_sge--)
-		tot_length += sg_list->length;
+	for (i = 0; i < num_sge; i++)
+		tot_length += sg_list[i].length;
 
 	wqe->dma.length = tot_length;
 	wqe->dma.resid = tot_length;
@@ -1454,7 +1456,7 @@
 
 /* basic sanity checks for send work request */
 static int validate_send_wr(struct rxe_qp *qp, struct ibv_send_wr *ibwr,
-			    unsigned int length)
+			    uint64_t length)
 {
 	struct rxe_wq *sq = &qp->sq;
 	enum ibv_wr_opcode opcode = ibwr->opcode;
@@ -1593,7 +1595,7 @@
 {
 	int err;
 	struct rxe_send_wqe *wqe;
-	unsigned int length = 0;
+	uint64_t length = 0;
 	int i;
 
 	for (i = 0; i < ibwr->num_sge; i++)
diff --git a/suse/rdma-core.spec b/suse/rdma-core.spec
index 0606e04..03ae7f3 100644
--- a/suse/rdma-core.spec
+++ b/suse/rdma-core.spec
@@ -203,7 +203,6 @@
 %package -n     libibverbs
 Summary:        Library & drivers for direct userspace use of InfiniBand/iWARP/RoCE hardware
 Group:          System/Libraries
-Requires:       %{name}%{?_isa} = %{version}-%{release}
 Obsoletes:      libcxgb4-rdmav2 < %{version}-%{release}
 Obsoletes:      libefa-rdmav2 < %{version}-%{release}
 Obsoletes:      libhfi1verbs-rdmav2 < %{version}-%{release}
@@ -530,38 +529,17 @@
 rm -rf %{buildroot}/%{_initddir}/
 rm -rf %{buildroot}/%{_sbindir}/srp_daemon.sh
 
-%post -n %verbs_lname -p /sbin/ldconfig
-%postun -n %verbs_lname -p /sbin/ldconfig
-
-%post -n %efa_lname -p /sbin/ldconfig
-%postun -n %efa_lname -p /sbin/ldconfig
-
-%post -n %hns_lname -p /sbin/ldconfig
-%postun -n %hns_lname -p /sbin/ldconfig
-
-%post -n %ionic_lname -p /sbin/ldconfig
-%postun -n %ionic_lname -p /sbin/ldconfig
-
-%post -n %mana_lname -p /sbin/ldconfig
-%postun -n %mana_lname -p /sbin/ldconfig
-
-%post -n %mlx4_lname -p /sbin/ldconfig
-%postun -n %mlx4_lname -p /sbin/ldconfig
-
-%post -n %mlx5_lname -p /sbin/ldconfig
-%postun -n %mlx5_lname -p /sbin/ldconfig
-
-%post -n %umad_lname -p /sbin/ldconfig
-%postun -n %umad_lname -p /sbin/ldconfig
-
-%post -n %rdmacm_lname -p /sbin/ldconfig
-%postun -n %rdmacm_lname -p /sbin/ldconfig
-
-%post -n libibnetdisc%{ibnetdisc_major} -p /sbin/ldconfig
-%postun -n libibnetdisc%{ibnetdisc_major} -p /sbin/ldconfig
-
-%post -n libibmad%{mad_major} -p /sbin/ldconfig
-%postun -n libibmad%{mad_major} -p /sbin/ldconfig
+%ldconfig_scriptlets -n %verbs_lname
+%ldconfig_scriptlets -n %efa_lname
+%ldconfig_scriptlets -n %hns_lname
+%ldconfig_scriptlets -n %ionic_lname
+%ldconfig_scriptlets -n %mana_lname
+%ldconfig_scriptlets -n %mlx4_lname
+%ldconfig_scriptlets -n %mlx5_lname
+%ldconfig_scriptlets -n %umad_lname
+%ldconfig_scriptlets -n %rdmacm_lname
+%ldconfig_scriptlets -n libibnetdisc%{ibnetdisc_major}
+%ldconfig_scriptlets -n libibmad%{mad_major}
 
 %pre
 # Avoid restoring outdated stuff in posttrans