Skip to content

Commit

Permalink
[SCSI] libiscsi: fix shutdown
Browse files Browse the repository at this point in the history
We were using the device delete sysfs file to remove each device
then logout. Now in 2.6.21 this will not work because
the sysfs delete file returns immediately and does not wait for
the device removal to complete. This causes a hang if a cache sync
is needed during shutdown. Before .21, that approach had other
problems, so this patch fixes the shutdown code so that we remove the target
and unbind the session before logging out and shut down the session

Signed-off-by: Mike Christie <[email protected]>
Signed-off-by: James Bottomley <[email protected]>
  • Loading branch information
Mike Christie authored and James Bottomley committed Jan 12, 2008
1 parent bc436b2 commit 2697478
Show file tree
Hide file tree
Showing 7 changed files with 176 additions and 144 deletions.
4 changes: 2 additions & 2 deletions drivers/scsi/libiscsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1662,7 +1662,7 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
struct module *owner = cls_session->transport->owner;

iscsi_unblock_session(cls_session);
iscsi_remove_session(cls_session);
scsi_remove_host(shost);

iscsi_pool_free(&session->mgmtpool);
Expand All @@ -1677,7 +1677,7 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
kfree(session->hwaddress);
kfree(session->initiatorname);

iscsi_destroy_session(cls_session);
iscsi_free_session(cls_session);
scsi_host_put(shost);
module_put(owner);
}
Expand Down
4 changes: 3 additions & 1 deletion drivers/scsi/qla4xxx/ql4_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* See LICENSE.qla4xxx for copyright and licensing details.
*/

#include <scsi/iscsi_if.h>
#include "ql4_def.h"
#include "ql4_glbl.h"
#include "ql4_dbg.h"
Expand Down Expand Up @@ -1305,7 +1306,8 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha,
atomic_set(&ddb_entry->relogin_timer, 0);
clear_bit(DF_RELOGIN, &ddb_entry->flags);
clear_bit(DF_NO_RELOGIN, &ddb_entry->flags);
iscsi_if_create_session_done(ddb_entry->conn);
iscsi_session_event(ddb_entry->sess,
ISCSI_KEVENT_CREATE_SESSION);
/*
* Change the lun state to READY in case the lun TIMEOUT before
* the device came back.
Expand Down
7 changes: 2 additions & 5 deletions drivers/scsi/qla4xxx/ql4_os.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,8 +298,7 @@ void qla4xxx_destroy_sess(struct ddb_entry *ddb_entry)
return;

if (ddb_entry->conn) {
iscsi_if_destroy_session_done(ddb_entry->conn);
iscsi_destroy_conn(ddb_entry->conn);
atomic_set(&ddb_entry->state, DDB_STATE_DEAD);
iscsi_remove_session(ddb_entry->sess);
}
iscsi_free_session(ddb_entry->sess);
Expand All @@ -309,6 +308,7 @@ int qla4xxx_add_sess(struct ddb_entry *ddb_entry)
{
int err;

ddb_entry->sess->recovery_tmo = ddb_entry->ha->port_down_retry_count;
err = iscsi_add_session(ddb_entry->sess, ddb_entry->fw_ddb_index);
if (err) {
DEBUG2(printk(KERN_ERR "Could not add session.\n"));
Expand All @@ -321,9 +321,6 @@ int qla4xxx_add_sess(struct ddb_entry *ddb_entry)
DEBUG2(printk(KERN_ERR "Could not add connection.\n"));
return -ENOMEM;
}

ddb_entry->sess->recovery_tmo = ddb_entry->ha->port_down_retry_count;
iscsi_if_create_session_done(ddb_entry->conn);
return 0;
}

Expand Down
Loading

0 comments on commit 2697478

Please sign in to comment.