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 | ||
