Commit 6c719f5c authored by Sean Hefty's avatar Sean Hefty Committed by Roland Dreier

RDMA/cma: Add check to validate that cm_id is bound to a device

Several checks in the rdma_cm check against the state of the
cm_id, but only to validate that the cm_id is bound to an underlying
transport specific CM and an RDMA device.  Make the check explicit
in what we're trying to check for, since we're not synchronizing
against the cm_id state.

This will allow a user to disconnect a cm_id or reject a connection
after receiving a device removal event.
Signed-off-by: default avatarSean Hefty <sean.hefty@intel.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent be65f086
...@@ -368,6 +368,11 @@ static void cma_enable_remove(struct rdma_id_private *id_priv) ...@@ -368,6 +368,11 @@ static void cma_enable_remove(struct rdma_id_private *id_priv)
wake_up(&id_priv->wait_remove); wake_up(&id_priv->wait_remove);
} }
static int cma_has_cm_dev(struct rdma_id_private *id_priv)
{
return (id_priv->id.device && id_priv->cm_id.ib);
}
struct rdma_cm_id *rdma_create_id(rdma_cm_event_handler event_handler, struct rdma_cm_id *rdma_create_id(rdma_cm_event_handler event_handler,
void *context, enum rdma_port_space ps) void *context, enum rdma_port_space ps)
{ {
...@@ -2422,7 +2427,7 @@ int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event) ...@@ -2422,7 +2427,7 @@ int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event)
int ret; int ret;
id_priv = container_of(id, struct rdma_id_private, id); id_priv = container_of(id, struct rdma_id_private, id);
if (!cma_comp(id_priv, CMA_CONNECT)) if (!cma_has_cm_dev(id_priv))
return -EINVAL; return -EINVAL;
switch (id->device->node_type) { switch (id->device->node_type) {
...@@ -2444,7 +2449,7 @@ int rdma_reject(struct rdma_cm_id *id, const void *private_data, ...@@ -2444,7 +2449,7 @@ int rdma_reject(struct rdma_cm_id *id, const void *private_data,
int ret; int ret;
id_priv = container_of(id, struct rdma_id_private, id); id_priv = container_of(id, struct rdma_id_private, id);
if (!cma_comp(id_priv, CMA_CONNECT)) if (!cma_has_cm_dev(id_priv))
return -EINVAL; return -EINVAL;
switch (rdma_node_get_transport(id->device->node_type)) { switch (rdma_node_get_transport(id->device->node_type)) {
...@@ -2475,8 +2480,7 @@ int rdma_disconnect(struct rdma_cm_id *id) ...@@ -2475,8 +2480,7 @@ int rdma_disconnect(struct rdma_cm_id *id)
int ret; int ret;
id_priv = container_of(id, struct rdma_id_private, id); id_priv = container_of(id, struct rdma_id_private, id);
if (!cma_comp(id_priv, CMA_CONNECT) && if (!cma_has_cm_dev(id_priv))
!cma_comp(id_priv, CMA_DISCONNECT))
return -EINVAL; return -EINVAL;
switch (rdma_node_get_transport(id->device->node_type)) { switch (rdma_node_get_transport(id->device->node_type)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment