diff options
author | Sean Hefty | 2007-05-07 20:49:12 +0200 |
---|---|---|
committer | Roland Dreier | 2007-05-14 22:56:32 +0200 |
commit | be65f086f2a50c478b2f5ecf4c55a52a4e95059a (patch) | |
tree | 11d048c93ea0f638a15ec47f4efda23731d202f1 | |
parent | RDMA/cma: Simplify device removal handling code (diff) | |
download | kernel-qcow2-linux-be65f086f2a50c478b2f5ecf4c55a52a4e95059a.tar.gz kernel-qcow2-linux-be65f086f2a50c478b2f5ecf4c55a52a4e95059a.tar.xz kernel-qcow2-linux-be65f086f2a50c478b2f5ecf4c55a52a4e95059a.zip |
RDMA/cma: Fix synchronization with device removal in cma_iw_handler
The cma_iw_handler needs to validate the state of the rdma_cm_id before
processing a new connection request to ensure that a device removal is
not already being processed for the same rdma_cm_id. Without the state
check, the user can receive simultaneous callbacks for the same cm_id, or
a callback after they've destroyed the cm_id.
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r-- | drivers/infiniband/core/cma.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index d026764c7e9c..cfd57b4abd03 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -1183,9 +1183,10 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event) struct sockaddr_in *sin; int ret = 0; - memset(&event, 0, sizeof event); - atomic_inc(&id_priv->dev_remove); + if (cma_disable_remove(id_priv, CMA_CONNECT)) + return 0; + memset(&event, 0, sizeof event); switch (iw_event->event) { case IW_CM_EVENT_CLOSE: event.event = RDMA_CM_EVENT_DISCONNECTED; |