Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-drm-fsl-dcu.git] / drivers / infiniband / core / cma.c
index 189f73f3f721f4744f2b78abc2d5f698ce3adc4d..985a6b564d8feec4781cefd7f3316cf1793013ce 100644 (file)
@@ -344,7 +344,7 @@ static int cma_init_ib_qp(struct rdma_id_private *id_priv, struct ib_qp *qp)
                return ret;
 
        qp_attr.qp_state = IB_QPS_INIT;
-       qp_attr.qp_access_flags = IB_ACCESS_LOCAL_WRITE;
+       qp_attr.qp_access_flags = 0;
        qp_attr.port_num = id_priv->id.port_num;
        return ib_modify_qp(qp, &qp_attr, IB_QP_STATE | IB_QP_ACCESS_FLAGS |
                                          IB_QP_PKEY_INDEX | IB_QP_PORT);
@@ -935,13 +935,8 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
        mutex_lock(&lock);
        ret = cma_acquire_dev(conn_id);
        mutex_unlock(&lock);
-       if (ret) {
-               ret = -ENODEV;
-               cma_exch(conn_id, CMA_DESTROYING);
-               cma_release_remove(conn_id);
-               rdma_destroy_id(&conn_id->id);
-               goto out;
-       }
+       if (ret)
+               goto release_conn_id;
 
        conn_id->cm_id.ib = cm_id;
        cm_id->context = conn_id;
@@ -951,13 +946,17 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
        ret = cma_notify_user(conn_id, RDMA_CM_EVENT_CONNECT_REQUEST, 0,
                              ib_event->private_data + offset,
                              IB_CM_REQ_PRIVATE_DATA_SIZE - offset);
-       if (ret) {
-               /* Destroy the CM ID by returning a non-zero value. */
-               conn_id->cm_id.ib = NULL;
-               cma_exch(conn_id, CMA_DESTROYING);
-               cma_release_remove(conn_id);
-               rdma_destroy_id(&conn_id->id);
-       }
+       if (!ret)
+               goto out;
+
+       /* Destroy the CM ID by returning a non-zero value. */
+       conn_id->cm_id.ib = NULL;
+
+release_conn_id:
+       cma_exch(conn_id, CMA_DESTROYING);
+       cma_release_remove(conn_id);
+       rdma_destroy_id(&conn_id->id);
+
 out:
        cma_release_remove(listen_id);
        return ret;
@@ -1481,19 +1480,18 @@ static int cma_bind_loopback(struct rdma_id_private *id_priv)
        u8 p;
 
        mutex_lock(&lock);
+       if (list_empty(&dev_list)) {
+               ret = -ENODEV;
+               goto out;
+       }
        list_for_each_entry(cma_dev, &dev_list, list)
                for (p = 1; p <= cma_dev->device->phys_port_cnt; ++p)
-                       if (!ib_query_port (cma_dev->device, p, &port_attr) &&
+                       if (!ib_query_port(cma_dev->device, p, &port_attr) &&
                            port_attr.state == IB_PORT_ACTIVE)
                                goto port_found;
 
-       if (!list_empty(&dev_list)) {
-               p = 1;
-               cma_dev = list_entry(dev_list.next, struct cma_device, list);
-       } else {
-               ret = -ENODEV;
-               goto out;
-       }
+       p = 1;
+       cma_dev = list_entry(dev_list.next, struct cma_device, list);
 
 port_found:
        ret = ib_get_cached_gid(cma_dev->device, p, 0, &gid);
@@ -2123,8 +2121,6 @@ static void cma_add_one(struct ib_device *device)
 
        cma_dev->device = device;
        cma_dev->node_guid = device->node_guid;
-       if (!cma_dev->node_guid)
-               goto err;
 
        init_completion(&cma_dev->comp);
        atomic_set(&cma_dev->refcount, 1);
@@ -2136,9 +2132,6 @@ static void cma_add_one(struct ib_device *device)
        list_for_each_entry(id_priv, &listen_any_list, list)
                cma_listen_on_dev(id_priv, cma_dev);
        mutex_unlock(&lock);
-       return;
-err:
-       kfree(cma_dev);
 }
 
 static int cma_remove_id_dev(struct rdma_id_private *id_priv)