diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-07-03 06:05:37 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-07-07 21:35:56 -0400 |
commit | b2cb96494d83b894a43ba8b9023eead8ff50684b (patch) | |
tree | b16b85fe4b65448fb8d03c004d8a7d83c988c412 /include/target/iscsi/iscsi_transport.h | |
parent | 186a9647019587b3784694894c4d136fd00cfd7b (diff) |
iser-target: Fix session reset bug with RDMA_CM_EVENT_DISCONNECTED
This patch addresses a bug where RDMA_CM_EVENT_DISCONNECTED may occur
before the connection shutdown has been completed by rx/tx threads,
that causes isert_free_conn() to wait indefinately on ->conn_wait.
This patch allows isert_disconnect_work code to invoke rdma_disconnect
when isert_disconnect_work() process context is started by client
session reset before isert_free_conn() code has been reached.
It also adds isert_conn->conn_mutex protection for ->state within
isert_disconnect_work(), isert_cq_comp_err() and isert_free_conn()
code, along with isert_check_state() for wait_event usage.
(v2: Add explicit iscsit_cause_connection_reinstatement call
during isert_disconnect_work() to force conn reset)
Cc: stable@vger.kernel.org # 3.10+
Cc: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'include/target/iscsi/iscsi_transport.h')
-rw-r--r-- | include/target/iscsi/iscsi_transport.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/include/target/iscsi/iscsi_transport.h b/include/target/iscsi/iscsi_transport.h index ce4070d8f156..e5d09d242ba3 100644 --- a/include/target/iscsi/iscsi_transport.h +++ b/include/target/iscsi/iscsi_transport.h | |||
@@ -73,6 +73,10 @@ extern int iscsit_logout_post_handler(struct iscsi_cmd *, struct iscsi_conn *); | |||
73 | */ | 73 | */ |
74 | extern void iscsit_increment_maxcmdsn(struct iscsi_cmd *, struct iscsi_session *); | 74 | extern void iscsit_increment_maxcmdsn(struct iscsi_cmd *, struct iscsi_session *); |
75 | /* | 75 | /* |
76 | * From iscsi_target_erl0.c | ||
77 | */ | ||
78 | extern void iscsit_cause_connection_reinstatement(struct iscsi_conn *, int); | ||
79 | /* | ||
76 | * From iscsi_target_erl1.c | 80 | * From iscsi_target_erl1.c |
77 | */ | 81 | */ |
78 | extern void iscsit_stop_dataout_timer(struct iscsi_cmd *); | 82 | extern void iscsit_stop_dataout_timer(struct iscsi_cmd *); |