iser-target: Handle DEVICE_REMOVAL event on network portal listener correctly
commit 3b726ae2de
upstream.
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>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
20a1d763e5
commit
c0cf551451
|
@ -725,14 +725,25 @@ wake_up:
|
|||
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
|
||||
|
@ -747,6 +758,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);
|
||||
|
@ -756,7 +770,7 @@ 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:
|
||||
|
@ -764,12 +778,6 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_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;
|
||||
}
|
||||
|
||||
|
@ -2775,7 +2783,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);
|
||||
|
|
Loading…
Reference in New Issue