Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e2ee058 authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Sasha Levin
Browse files

iser-target: Fix possible deadlock in RDMA_CM connection error



[ Upstream commit 4a579da2586bd3b79b025947ea24ede2bbfede62 ]

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: default avatarSagi Grimberg <sagig@mellanox.com>
Cc: <stable@vger.kernel.org> # v3.10+
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
parent cf57073b
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -220,7 +220,7 @@ fail:
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;

@@ -742,9 +742,9 @@ out:
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;
	int cq_index;
	struct ib_device *ib_dev = device->ib_device;

	pr_debug("Entering isert_connect_release(): >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");

@@ -752,6 +752,7 @@ isert_connect_release(struct isert_conn *isert_conn)
		isert_conn_free_fastreg_pool(isert_conn);

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

	if (isert_conn->conn_qp) {
@@ -924,12 +925,15 @@ out:
	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
@@ -959,7 +963,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:
		pr_err("Unhandled RDMA CMA event: %d\n", event->event);