|
@@ -132,7 +132,7 @@ static inline struct ucma_context *_ucma_find_context(int id,
|
|
|
ctx = idr_find(&ctx_idr, id);
|
|
|
if (!ctx)
|
|
|
ctx = ERR_PTR(-ENOENT);
|
|
|
- else if (ctx->file != file)
|
|
|
+ else if (ctx->file != file || !ctx->cm_id)
|
|
|
ctx = ERR_PTR(-EINVAL);
|
|
|
return ctx;
|
|
|
}
|
|
@@ -456,6 +456,7 @@ static ssize_t ucma_create_id(struct ucma_file *file, const char __user *inbuf,
|
|
|
struct rdma_ucm_create_id cmd;
|
|
|
struct rdma_ucm_create_id_resp resp;
|
|
|
struct ucma_context *ctx;
|
|
|
+ struct rdma_cm_id *cm_id;
|
|
|
enum ib_qp_type qp_type;
|
|
|
int ret;
|
|
|
|
|
@@ -476,10 +477,10 @@ static ssize_t ucma_create_id(struct ucma_file *file, const char __user *inbuf,
|
|
|
return -ENOMEM;
|
|
|
|
|
|
ctx->uid = cmd.uid;
|
|
|
- ctx->cm_id = rdma_create_id(current->nsproxy->net_ns,
|
|
|
- ucma_event_handler, ctx, cmd.ps, qp_type);
|
|
|
- if (IS_ERR(ctx->cm_id)) {
|
|
|
- ret = PTR_ERR(ctx->cm_id);
|
|
|
+ cm_id = rdma_create_id(current->nsproxy->net_ns,
|
|
|
+ ucma_event_handler, ctx, cmd.ps, qp_type);
|
|
|
+ if (IS_ERR(cm_id)) {
|
|
|
+ ret = PTR_ERR(cm_id);
|
|
|
goto err1;
|
|
|
}
|
|
|
|
|
@@ -489,14 +490,19 @@ static ssize_t ucma_create_id(struct ucma_file *file, const char __user *inbuf,
|
|
|
ret = -EFAULT;
|
|
|
goto err2;
|
|
|
}
|
|
|
+
|
|
|
+ ctx->cm_id = cm_id;
|
|
|
return 0;
|
|
|
|
|
|
err2:
|
|
|
- rdma_destroy_id(ctx->cm_id);
|
|
|
+ rdma_destroy_id(cm_id);
|
|
|
err1:
|
|
|
mutex_lock(&mut);
|
|
|
idr_remove(&ctx_idr, ctx->id);
|
|
|
mutex_unlock(&mut);
|
|
|
+ mutex_lock(&file->mut);
|
|
|
+ list_del(&ctx->list);
|
|
|
+ mutex_unlock(&file->mut);
|
|
|
kfree(ctx);
|
|
|
return ret;
|
|
|
}
|
|
@@ -664,19 +670,23 @@ static ssize_t ucma_resolve_ip(struct ucma_file *file,
|
|
|
int in_len, int out_len)
|
|
|
{
|
|
|
struct rdma_ucm_resolve_ip cmd;
|
|
|
+ struct sockaddr *src, *dst;
|
|
|
struct ucma_context *ctx;
|
|
|
int ret;
|
|
|
|
|
|
if (copy_from_user(&cmd, inbuf, sizeof(cmd)))
|
|
|
return -EFAULT;
|
|
|
|
|
|
+ src = (struct sockaddr *) &cmd.src_addr;
|
|
|
+ dst = (struct sockaddr *) &cmd.dst_addr;
|
|
|
+ if (!rdma_addr_size(src) || !rdma_addr_size(dst))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
ctx = ucma_get_ctx(file, cmd.id);
|
|
|
if (IS_ERR(ctx))
|
|
|
return PTR_ERR(ctx);
|
|
|
|
|
|
- ret = rdma_resolve_addr(ctx->cm_id, (struct sockaddr *) &cmd.src_addr,
|
|
|
- (struct sockaddr *) &cmd.dst_addr,
|
|
|
- cmd.timeout_ms);
|
|
|
+ ret = rdma_resolve_addr(ctx->cm_id, src, dst, cmd.timeout_ms);
|
|
|
ucma_put_ctx(ctx);
|
|
|
return ret;
|
|
|
}
|
|
@@ -1349,7 +1359,7 @@ static ssize_t ucma_process_join(struct ucma_file *file,
|
|
|
return -ENOSPC;
|
|
|
|
|
|
addr = (struct sockaddr *) &cmd->addr;
|
|
|
- if (!cmd->addr_size || (cmd->addr_size != rdma_addr_size(addr)))
|
|
|
+ if (cmd->addr_size != rdma_addr_size(addr))
|
|
|
return -EINVAL;
|
|
|
|
|
|
if (cmd->join_flags == RDMA_MC_JOIN_FLAG_FULLMEMBER)
|
|
@@ -1417,6 +1427,9 @@ static ssize_t ucma_join_ip_multicast(struct ucma_file *file,
|
|
|
join_cmd.uid = cmd.uid;
|
|
|
join_cmd.id = cmd.id;
|
|
|
join_cmd.addr_size = rdma_addr_size((struct sockaddr *) &cmd.addr);
|
|
|
+ if (!join_cmd.addr_size)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
join_cmd.join_flags = RDMA_MC_JOIN_FLAG_FULLMEMBER;
|
|
|
memcpy(&join_cmd.addr, &cmd.addr, join_cmd.addr_size);
|
|
|
|
|
@@ -1432,6 +1445,9 @@ static ssize_t ucma_join_multicast(struct ucma_file *file,
|
|
|
if (copy_from_user(&cmd, inbuf, sizeof(cmd)))
|
|
|
return -EFAULT;
|
|
|
|
|
|
+ if (!rdma_addr_size((struct sockaddr *)&cmd.addr))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
return ucma_process_join(file, &cmd, out_len);
|
|
|
}
|
|
|
|