RDMA/iw_cxgb4: stop ep timer on close failure
authorHariprasad S <hariprasad@chelsio.com>
Wed, 4 May 2016 19:57:30 +0000 (01:27 +0530)
committerDoug Ledford <dledford@redhat.com>
Thu, 5 May 2016 20:11:14 +0000 (16:11 -0400)
In c4iw_ep_disconnect(), if we start the ep timer to begin a close,
but send_halfclose() fails, we need to stop the timer and send a CLOSE
event up to the IWCM before releasing the resources. Otherwise, we can
crash when the ep timer fires if the ep is referencing a previous instance
of the device. This can happen as part of adapter reset/recovery, for
instance.

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/cxgb4/cm.c

index 49784a40d1d194fc53c95cf97888ab52979eaf51..cc9836e468005809f2992b4558e20b309d8ff657 100644 (file)
@@ -3467,8 +3467,13 @@ int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp)
                        set_bit(EP_DISC_CLOSE, &ep->com.history);
                        ret = send_halfclose(ep, gfp);
                }
-               if (ret)
+               if (ret) {
+                       if (!abrupt) {
+                               stop_ep_timer(ep);
+                               close_complete_upcall(ep, -EIO);
+                       }
                        fatal = 1;
+               }
        }
        mutex_unlock(&ep->com.mutex);
        if (fatal)