iser-target: Fix session reset bug with RDMA_CM_EVENT_DISCONNECTED
authorNicholas Bellinger <nab@linux-iscsi.org>
Wed, 3 Jul 2013 10:05:37 +0000 (03:05 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 4 Aug 2013 08:50:33 +0000 (16:50 +0800)
commitd9e507c05ca19ad2ec166577edd8b47e17c8961e
treea3369adbf8ab02bc88eca6549c5ad4bc4a12b21e
parenta5d56a2217664c7bc06cb7deeac9a2a155ba4345
iser-target: Fix session reset bug with RDMA_CM_EVENT_DISCONNECTED

commit b2cb96494d83b894a43ba8b9023eead8ff50684b upstream.

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: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/infiniband/ulp/isert/ib_isert.c
drivers/infiniband/ulp/isert/ib_isert.h
drivers/target/iscsi/iscsi_target_erl0.c
include/target/iscsi/iscsi_transport.h