RDMA/cma: Fix synchronization with device removal in cma_iw_handler
authorSean Hefty <sean.hefty@intel.com>
Mon, 7 May 2007 18:49:12 +0000 (11:49 -0700)
committerRoland Dreier <rolandd@cisco.com>
Mon, 14 May 2007 20:56:32 +0000 (13:56 -0700)
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>
drivers/infiniband/core/cma.c

index d026764c7e9c57e78429f0e315e48f25fc08e584..cfd57b4abd0390b94a1b39855792a25b41d250af 100644 (file)
@@ -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;