diff options
author | Mike Christie <michaelc@cs.wisc.edu> | 2006-07-24 16:47:26 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-07-28 12:48:32 -0400 |
commit | 1c83469d36a9dd30dbf1fb9fc5ca3be3a0e64ff4 (patch) | |
tree | d20c53420f6596ebd6500562b294ef820a190887 /drivers/scsi/libiscsi.c | |
parent | 7ea8b82847293c2311cf08fc3ed31ab0e452a27e (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.c | 12 |
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 | */ |