Skip to content

Commit

Permalink
iser-target: Handle DEVICE_REMOVAL event on network portal listener c…
Browse files Browse the repository at this point in the history
…orrectly

In this case the cm_id->context is the isert_np, and the cm_id->qp
is NULL, so use that to distinct the cases.

Since we don't expect any other events on this cm_id we can
just return -1 for explicit termination of the cm_id by the
cma layer.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Cc: <stable@vger.kernel.org> # 3.10+
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
  • Loading branch information
Sagi Grimberg authored and Nicholas Bellinger committed Nov 3, 2014
1 parent f57915c commit 3b726ae
Showing 1 changed file with 19 additions and 10 deletions.
29 changes: 19 additions & 10 deletions drivers/infiniband/ulp/isert/ib_isert.c
Original file line number Diff line number Diff line change
Expand Up @@ -806,14 +806,25 @@ isert_disconnect_work(struct work_struct *work)
complete(&isert_conn->conn_wait);
}

static void
static int
isert_disconnected_handler(struct rdma_cm_id *cma_id, bool disconnect)
{
struct isert_conn *isert_conn = (struct isert_conn *)cma_id->context;
struct isert_conn *isert_conn;

if (!cma_id->qp) {
struct isert_np *isert_np = cma_id->context;

isert_np->np_cm_id = NULL;
return -1;
}

isert_conn = (struct isert_conn *)cma_id->context;

isert_conn->disconnect = disconnect;
INIT_WORK(&isert_conn->conn_logout_work, isert_disconnect_work);
schedule_work(&isert_conn->conn_logout_work);

return 0;
}

static int
Expand All @@ -828,6 +839,9 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
switch (event->event) {
case RDMA_CM_EVENT_CONNECT_REQUEST:
ret = isert_connect_request(cma_id, event);
if (ret)
pr_err("isert_cma_handler failed RDMA_CM_EVENT: 0x%08x %d\n",
event->event, ret);
break;
case RDMA_CM_EVENT_ESTABLISHED:
isert_connected_handler(cma_id);
Expand All @@ -837,20 +851,14 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
case RDMA_CM_EVENT_DEVICE_REMOVAL: /* FALLTHRU */
disconnect = true;
case RDMA_CM_EVENT_TIMEWAIT_EXIT: /* FALLTHRU */
isert_disconnected_handler(cma_id, disconnect);
ret = isert_disconnected_handler(cma_id, disconnect);
break;
case RDMA_CM_EVENT_CONNECT_ERROR:
default:
pr_err("Unhandled RDMA CMA event: %d\n", event->event);
break;
}

if (ret != 0) {
pr_err("isert_cma_handler failed RDMA_CM_EVENT: 0x%08x %d\n",
event->event, ret);
dump_stack();
}

return ret;
}

Expand Down Expand Up @@ -3193,7 +3201,8 @@ isert_free_np(struct iscsi_np *np)
{
struct isert_np *isert_np = (struct isert_np *)np->np_context;

rdma_destroy_id(isert_np->np_cm_id);
if (isert_np->np_cm_id)
rdma_destroy_id(isert_np->np_cm_id);

np->np_context = NULL;
kfree(isert_np);
Expand Down

0 comments on commit 3b726ae

Please sign in to comment.