|
@@ -2941,10 +2941,10 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
|
|
{
|
|
{
|
|
struct iscsi_conn *conn = cls_conn->dd_data;
|
|
struct iscsi_conn *conn = cls_conn->dd_data;
|
|
struct iscsi_session *session = conn->session;
|
|
struct iscsi_session *session = conn->session;
|
|
- unsigned long flags;
|
|
|
|
|
|
|
|
del_timer_sync(&conn->transport_timer);
|
|
del_timer_sync(&conn->transport_timer);
|
|
|
|
|
|
|
|
+ mutex_lock(&session->eh_mutex);
|
|
spin_lock_bh(&session->frwd_lock);
|
|
spin_lock_bh(&session->frwd_lock);
|
|
conn->c_stage = ISCSI_CONN_CLEANUP_WAIT;
|
|
conn->c_stage = ISCSI_CONN_CLEANUP_WAIT;
|
|
if (session->leadconn == conn) {
|
|
if (session->leadconn == conn) {
|
|
@@ -2956,28 +2956,6 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
|
|
}
|
|
}
|
|
spin_unlock_bh(&session->frwd_lock);
|
|
spin_unlock_bh(&session->frwd_lock);
|
|
|
|
|
|
- /*
|
|
|
|
- * Block until all in-progress commands for this connection
|
|
|
|
- * time out or fail.
|
|
|
|
- */
|
|
|
|
- for (;;) {
|
|
|
|
- spin_lock_irqsave(session->host->host_lock, flags);
|
|
|
|
- if (!atomic_read(&session->host->host_busy)) { /* OK for ERL == 0 */
|
|
|
|
- spin_unlock_irqrestore(session->host->host_lock, flags);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- spin_unlock_irqrestore(session->host->host_lock, flags);
|
|
|
|
- msleep_interruptible(500);
|
|
|
|
- iscsi_conn_printk(KERN_INFO, conn, "iscsi conn_destroy(): "
|
|
|
|
- "host_busy %d host_failed %d\n",
|
|
|
|
- atomic_read(&session->host->host_busy),
|
|
|
|
- session->host->host_failed);
|
|
|
|
- /*
|
|
|
|
- * force eh_abort() to unblock
|
|
|
|
- */
|
|
|
|
- wake_up(&conn->ehwait);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
/* flush queued up work because we free the connection below */
|
|
/* flush queued up work because we free the connection below */
|
|
iscsi_suspend_tx(conn);
|
|
iscsi_suspend_tx(conn);
|
|
|
|
|
|
@@ -2994,6 +2972,7 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
|
|
if (session->leadconn == conn)
|
|
if (session->leadconn == conn)
|
|
session->leadconn = NULL;
|
|
session->leadconn = NULL;
|
|
spin_unlock_bh(&session->frwd_lock);
|
|
spin_unlock_bh(&session->frwd_lock);
|
|
|
|
+ mutex_unlock(&session->eh_mutex);
|
|
|
|
|
|
iscsi_destroy_conn(cls_conn);
|
|
iscsi_destroy_conn(cls_conn);
|
|
}
|
|
}
|