aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libiscsi.c
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2006-07-24 16:47:26 -0400
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2006-07-28 12:48:32 -0400
commit1c83469d36a9dd30dbf1fb9fc5ca3be3a0e64ff4 (patch)
treed20c53420f6596ebd6500562b294ef820a190887 /drivers/scsi/libiscsi.c
parent7ea8b82847293c2311cf08fc3ed31ab0e452a27e (diff)
[SCSI] iscsi bugfixes: fix oops when iser is flushing io
When we enter recovery and flush the running commands we cannot freee the connection before flushing the commands. Some commands may have a reference to the connection that needs to be released before. iscsi_stop was forcing the term and suspend too early and was causing a oops in iser, so this patch removes those callbacks all together and allows the LLD to handle that detail. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/libiscsi.c')
-rw-r--r--drivers/scsi/libiscsi.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 4e2ca8f7d9a1..36f520b9260e 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -1440,12 +1440,6 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
1440 1440
1441 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); 1441 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
1442 mutex_lock(&conn->xmitmutex); 1442 mutex_lock(&conn->xmitmutex);
1443 if (conn->c_stage == ISCSI_CONN_INITIAL_STAGE) {
1444 if (session->tt->suspend_conn_recv)
1445 session->tt->suspend_conn_recv(conn);
1446
1447 session->tt->terminate_conn(conn);
1448 }
1449 1443
1450 spin_lock_bh(&session->lock); 1444 spin_lock_bh(&session->lock);
1451 conn->c_stage = ISCSI_CONN_CLEANUP_WAIT; 1445 conn->c_stage = ISCSI_CONN_CLEANUP_WAIT;
@@ -1622,8 +1616,9 @@ static void iscsi_start_session_recovery(struct iscsi_session *session,
1622 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); 1616 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
1623 spin_unlock_bh(&session->lock); 1617 spin_unlock_bh(&session->lock);
1624 1618
1625 if (session->tt->suspend_conn_recv) 1619 write_lock_bh(conn->recv_lock);
1626 session->tt->suspend_conn_recv(conn); 1620 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx);
1621 write_unlock_bh(conn->recv_lock);
1627 1622
1628 mutex_lock(&conn->xmitmutex); 1623 mutex_lock(&conn->xmitmutex);
1629 /* 1624 /*
@@ -1642,7 +1637,6 @@ static void iscsi_start_session_recovery(struct iscsi_session *session,
1642 } 1637 }
1643 } 1638 }
1644 1639
1645 session->tt->terminate_conn(conn);
1646 /* 1640 /*
1647 * flush queues. 1641 * flush queues.
1648 */ 1642 */