summaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorAriel Nahum2014-10-01 13:02:03 +0200
committerRoland Dreier2014-10-09 09:06:06 +0200
commitec370e2b63526931a65f4668626dbb43896788c6 (patch)
tree607b088fdf7035beed4401186ac3a94bc6db8b39 /drivers/infiniband
parentIB/iser: Don't bound release_work completions timeouts (diff)
downloadkernel-qcow2-linux-ec370e2b63526931a65f4668626dbb43896788c6.tar.gz
kernel-qcow2-linux-ec370e2b63526931a65f4668626dbb43896788c6.tar.xz
kernel-qcow2-linux-ec370e2b63526931a65f4668626dbb43896788c6.zip
IB/iser: Unbind at conn_stop stage
Previously we didn't need to unbind the iser_conn and iscsi_conn since we always relied on iscsi daemon to teardown the connection and never let it finish before we cleanup all that is needed in iser. This is not the case anymore (for DEVICE_REMOVAL event). So avoid any possible chance we cause iscsi_conn dereference after iscsi_conn was freed. We also call iser_conn_terminate (safe to call multiple times) just for the corner case of iscsi daemon stopping an old connection before invoking endpoint removal (might happen if it was violently killed). Notice we are unbinding under a lock - which is required. Signed-off-by: Ariel Nahum <arieln@mellanox.com> Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Roi Dayan <roid@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c
index db83530184f8..7298e696c6cf 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -414,8 +414,15 @@ iscsi_iser_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
* might have only partially setup the connection.
*/
if (iser_conn) {
+ mutex_lock(&iser_conn->state_mutex);
+ iser_conn_terminate(iser_conn);
+
+ /* unbind */
+ iser_conn->iscsi_conn = NULL;
conn->dd_data = NULL;
+
complete(&iser_conn->stop_completion);
+ mutex_unlock(&iser_conn->state_mutex);
}
}