Skip to content

Commit

Permalink
iser-target: Fix possible deadlock in RDMA_CM connection error
Browse files Browse the repository at this point in the history
Before we reach to connection established we may get an
error event. In this case the core won't teardown this
connection (never established it), so we take care of freeing
it ourselves.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Cc: <stable@vger.kernel.org> # v3.10+
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
  • Loading branch information
Sagi Grimberg authored and Nicholas Bellinger committed Apr 8, 2015
1 parent 364189f commit 4a579da
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions drivers/infiniband/ulp/isert/ib_isert.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ isert_alloc_rx_descriptors(struct isert_conn *isert_conn)
static void
isert_free_rx_descriptors(struct isert_conn *isert_conn)
{
struct ib_device *ib_dev = isert_conn->conn_cm_id->device;
struct ib_device *ib_dev = isert_conn->conn_device->ib_device;
struct iser_rx_desc *rx_desc;
int i;

Expand Down Expand Up @@ -719,16 +719,17 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
static void
isert_connect_release(struct isert_conn *isert_conn)
{
struct ib_device *ib_dev = isert_conn->conn_cm_id->device;
struct isert_device *device = isert_conn->conn_device;
struct ib_device *ib_dev = device->ib_device;

isert_dbg("conn %p\n", isert_conn);

if (device && device->use_fastreg)
isert_conn_free_fastreg_pool(isert_conn);

isert_free_rx_descriptors(isert_conn);
rdma_destroy_id(isert_conn->conn_cm_id);
if (isert_conn->conn_cm_id)
rdma_destroy_id(isert_conn->conn_cm_id);

if (isert_conn->conn_qp) {
struct isert_comp *comp = isert_conn->conn_qp->recv_cq->cq_context;
Expand Down Expand Up @@ -878,12 +879,15 @@ isert_disconnected_handler(struct rdma_cm_id *cma_id,
return 0;
}

static void
static int
isert_connect_error(struct rdma_cm_id *cma_id)
{
struct isert_conn *isert_conn = cma_id->qp->qp_context;

isert_conn->conn_cm_id = NULL;
isert_put_conn(isert_conn);

return -1;
}

static int
Expand Down Expand Up @@ -912,7 +916,7 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
case RDMA_CM_EVENT_REJECTED: /* FALLTHRU */
case RDMA_CM_EVENT_UNREACHABLE: /* FALLTHRU */
case RDMA_CM_EVENT_CONNECT_ERROR:
isert_connect_error(cma_id);
ret = isert_connect_error(cma_id);
break;
default:
isert_err("Unhandled RDMA CMA event: %d\n", event->event);
Expand Down

0 comments on commit 4a579da

Please sign in to comment.