diff options
Diffstat (limited to 'drivers/infiniband/core/cma.c')
-rw-r--r-- | drivers/infiniband/core/cma.c | 42 |
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 | ||
1256 | err3: | ||
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 | 1260 | err2: | |
1258 | release_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); | 1263 | err1: |
1262 | |||
1263 | out: | ||
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 | ||