From dbf6975a3b201ff7b258010e29fe89ece75d18c9 Mon Sep 17 00:00:00 2001 From: Israel Rukshin Date: Wed, 17 Aug 2016 07:28:06 +0000 Subject: [PATCH] isert: close isert connection earlier We want to close the connection not only when timewait exit event arrive, but also on some other events. Signed-off-by: Israel Rukshin git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@6948 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- iscsi-scst/kernel/isert-scst/iser.h | 1 + iscsi-scst/kernel/isert-scst/iser_rdma.c | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/iscsi-scst/kernel/isert-scst/iser.h b/iscsi-scst/kernel/isert-scst/iser.h index 104f8d5e7..10ce4fd7c 100644 --- a/iscsi-scst/kernel/isert-scst/iser.h +++ b/iscsi-scst/kernel/isert-scst/iser.h @@ -162,6 +162,7 @@ struct isert_cq { #define ISERT_CONNECTION_EST 3 #define ISERT_DRAINED_RQ 4 #define ISERT_DRAINED_SQ 5 +#define ISERT_CONNECTION_CLOSE 6 struct isert_connection { struct iscsi_conn iscsi ____cacheline_aligned; diff --git a/iscsi-scst/kernel/isert-scst/iser_rdma.c b/iscsi-scst/kernel/isert-scst/iser_rdma.c index 346765843..dccd7bb80 100644 --- a/iscsi-scst/kernel/isert-scst/iser_rdma.c +++ b/iscsi-scst/kernel/isert-scst/iser_rdma.c @@ -1388,12 +1388,12 @@ void isert_conn_free(struct isert_connection *isert_conn) kref_put(&isert_conn->kref, isert_kref_free); } -static int isert_cm_timewait_exit_handler(struct rdma_cm_id *cm_id, +static int isert_cm_disconnected_handler(struct rdma_cm_id *cm_id, struct rdma_cm_event *event) { struct isert_connection *isert_conn = cm_id->qp->qp_context; - - isert_sched_conn_closed(isert_conn); + if (!test_and_set_bit(ISERT_CONNECTION_CLOSE, &isert_conn->flags)) + isert_sched_conn_closed(isert_conn); return 0; } @@ -1684,15 +1684,15 @@ static int isert_cm_evt_handler(struct rdma_cm_id *cm_id, case RDMA_CM_EVENT_CONNECT_ERROR: case RDMA_CM_EVENT_REJECTED: - case RDMA_CM_EVENT_ADDR_CHANGE: - case RDMA_CM_EVENT_DISCONNECTED: err = isert_cm_disconnect_handler(cm_id, cm_ev); break; + case RDMA_CM_EVENT_ADDR_CHANGE: + case RDMA_CM_EVENT_DISCONNECTED: case RDMA_CM_EVENT_DEVICE_REMOVAL: case RDMA_CM_EVENT_TIMEWAIT_EXIT: isert_cm_disconnect_handler(cm_id, cm_ev); - err = isert_cm_timewait_exit_handler(cm_id, cm_ev); + err = isert_cm_disconnected_handler(cm_id, cm_ev); break; case RDMA_CM_EVENT_MULTICAST_JOIN: