aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/core/cma.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/core/cma.c')
-rw-r--r--drivers/infiniband/core/cma.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 59fbd704a1ec..55d5642eb10a 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -1219,13 +1219,13 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
1219 } 1219 }
1220 if (!conn_id) { 1220 if (!conn_id) {
1221 ret = -ENOMEM; 1221 ret = -ENOMEM;
1222 goto out; 1222 goto err1;
1223 } 1223 }
1224 1224
1225 mutex_lock_nested(&conn_id->handler_mutex, SINGLE_DEPTH_NESTING); 1225 mutex_lock_nested(&conn_id->handler_mutex, SINGLE_DEPTH_NESTING);
1226 ret = cma_acquire_dev(conn_id); 1226 ret = cma_acquire_dev(conn_id);
1227 if (ret) 1227 if (ret)
1228 goto release_conn_id; 1228 goto err2;
1229 1229
1230 conn_id->cm_id.ib = cm_id; 1230 conn_id->cm_id.ib = cm_id;
1231 cm_id->context = conn_id; 1231 cm_id->context = conn_id;
@@ -1237,31 +1237,33 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
1237 */ 1237 */
1238 atomic_inc(&conn_id->refcount); 1238 atomic_inc(&conn_id->refcount);
1239 ret = conn_id->id.event_handler(&conn_id->id, &event); 1239 ret = conn_id->id.event_handler(&conn_id->id, &event);
1240 if (!ret) { 1240 if (ret)
1241 /* 1241 goto err3;
1242 * Acquire mutex to prevent user executing rdma_destroy_id() 1242
1243 * while we're accessing the cm_id. 1243 /*
1244 */ 1244 * Acquire mutex to prevent user executing rdma_destroy_id()
1245 mutex_lock(&lock); 1245 * while we're accessing the cm_id.
1246 if (cma_comp(conn_id, RDMA_CM_CONNECT) && (conn_id->id.qp_type != IB_QPT_UD)) 1246 */
1247 ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0); 1247 mutex_lock(&lock);
1248 mutex_unlock(&lock); 1248 if (cma_comp(conn_id, RDMA_CM_CONNECT) && (conn_id->id.qp_type != IB_QPT_UD))
1249 mutex_unlock(&conn_id->handler_mutex); 1249 ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
1250 cma_deref_id(conn_id); 1250 mutex_unlock(&lock);
1251 goto out; 1251 mutex_unlock(&conn_id->handler_mutex);
1252 } 1252 mutex_unlock(&listen_id->handler_mutex);
1253 cma_deref_id(conn_id); 1253 cma_deref_id(conn_id);
1254 return 0;
1254 1255
1256err3:
1257 cma_deref_id(conn_id);
1255 /* Destroy the CM ID by returning a non-zero value. */ 1258 /* Destroy the CM ID by returning a non-zero value. */
1256 conn_id->cm_id.ib = NULL; 1259 conn_id->cm_id.ib = NULL;
1257 1260err2:
1258release_conn_id:
1259 cma_exch(conn_id, RDMA_CM_DESTROYING); 1261 cma_exch(conn_id, RDMA_CM_DESTROYING);
1260 mutex_unlock(&conn_id->handler_mutex); 1262 mutex_unlock(&conn_id->handler_mutex);
1261 rdma_destroy_id(&conn_id->id); 1263err1:
1262
1263out:
1264 mutex_unlock(&listen_id->handler_mutex); 1264 mutex_unlock(&listen_id->handler_mutex);
1265 if (conn_id)
1266 rdma_destroy_id(&conn_id->id);
1265 return ret; 1267 return ret;
1266} 1268}
1267 1269