]> Pileus Git - ~andy/linux/commitdiff
RDMA/cma: Fix endianness bugs
authorSean Hefty <sean.hefty@intel.com>
Tue, 6 Dec 2011 21:15:18 +0000 (21:15 +0000)
committerRoland Dreier <roland@purestorage.com>
Wed, 4 Jan 2012 17:13:52 +0000 (09:13 -0800)
Fix endianness bugs reported by sparse in the RDMA core stack.  Note
that these are real bugs, but don't affect any existing code to the
best of my knowledge.  The mlid issue would only affect kernel users
of rdma_join_multicast which have the rdma_cm attach/detach its QP.
There are no current in tree users that do this. (rdma_join_multicast
may be used called by user space applications, which does not have
this issue.)  And the pkey setting is simply returned as
informational.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/core/cma.c

index d0d4aa9f480245097b2fab1bd05380c3fe6a01d6..fdd8ef8dad325b577c5ad8dc9e5627888c280c8c 100644 (file)
@@ -1110,7 +1110,7 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
        if (cma_any_addr((struct sockaddr *) &rt->addr.src_addr)) {
                rt->addr.dev_addr.dev_type = ARPHRD_INFINIBAND;
                rdma_addr_set_sgid(&rt->addr.dev_addr, &rt->path_rec[0].sgid);
-               ib_addr_set_pkey(&rt->addr.dev_addr, rt->path_rec[0].pkey);
+               ib_addr_set_pkey(&rt->addr.dev_addr, be16_to_cpu(rt->path_rec[0].pkey));
        } else {
                ret = rdma_translate_ip((struct sockaddr *) &rt->addr.src_addr,
                                        &rt->addr.dev_addr);
@@ -2926,7 +2926,7 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast)
        mutex_lock(&id_priv->qp_mutex);
        if (!status && id_priv->id.qp)
                status = ib_attach_mcast(id_priv->id.qp, &multicast->rec.mgid,
-                                        multicast->rec.mlid);
+                                        be16_to_cpu(multicast->rec.mlid));
        mutex_unlock(&id_priv->qp_mutex);
 
        memset(&event, 0, sizeof event);
@@ -3187,7 +3187,7 @@ void rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr)
                        if (id->qp)
                                ib_detach_mcast(id->qp,
                                                &mc->multicast.ib->rec.mgid,
-                                               mc->multicast.ib->rec.mlid);
+                                               be16_to_cpu(mc->multicast.ib->rec.mlid));
                        if (rdma_node_get_transport(id_priv->cma_dev->device->node_type) == RDMA_TRANSPORT_IB) {
                                switch (rdma_port_get_link_layer(id->device, id->port_num)) {
                                case IB_LINK_LAYER_INFINIBAND: