1126 goto release_conn_id;
1127
1128 conn_id->cm_id.ib = cm_id;
1129 cm_id->context = conn_id;
1130 cm_id->cm_handler = cma_ib_handler;
1131
1132 ret = conn_id->id.event_handler(&conn_id->id, &event);
1133 if (!ret) {
1134
1135
1136
1137
1138 mutex_lock(&lock);
1139 if (cma_comp(conn_id, CMA_CONNECT) &&
1140 !cma_is_ud_ps(conn_id->id.ps))
1141 ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
1142 mutex_unlock(&lock);
1143 mutex_unlock(&conn_id->handler_mutex);
1144 goto out;
1145 }
1146
1147
1148 conn_id->cm_id.ib = NULL;
1149
1150release_conn_id:
1151 cma_exch(conn_id, CMA_DESTROYING);
1152 mutex_unlock(&conn_id->handler_mutex);
1153 rdma_destroy_id(&conn_id->id);
1154
1155out:
1156 mutex_unlock(&listen_id->handler_mutex);
1157 return ret;
1158}
1159
1160static __be64 cma_get_service_id(enum rdma_port_space ps, struct sockaddr *addr)
1161{
1162 return cpu_to_be64(((u64)ps << 16) + be16_to_cpu(cma_port(addr)));
1163}
1164
1165static void cma_set_compare_data(enum rdma_port_space ps, struct sockaddr *addr,
1166 struct ib_cm_compare_data *compare)