diff options
author | Mike Christie <michaelc@cs.wisc.edu> | 2007-12-13 13:43:29 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-11 19:28:33 -0500 |
commit | 2697478903d0ad8bdbf868b1346ae4b891662bb1 (patch) | |
tree | 8b40d774c0a6f33f9320333a20e08fa920f154fc /drivers/scsi/qla4xxx/ql4_os.c | |
parent | bc436b278776d22eb10e7e75bf3e5257d14550a9 (diff) |
[SCSI] libiscsi: fix shutdown
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 <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/qla4xxx/ql4_os.c')
-rw-r--r-- | drivers/scsi/qla4xxx/ql4_os.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index 89460d27c689..f55b9f7d9396 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c | |||
@@ -298,8 +298,7 @@ void qla4xxx_destroy_sess(struct ddb_entry *ddb_entry) | |||
298 | return; | 298 | return; |
299 | 299 | ||
300 | if (ddb_entry->conn) { | 300 | if (ddb_entry->conn) { |
301 | iscsi_if_destroy_session_done(ddb_entry->conn); | 301 | atomic_set(&ddb_entry->state, DDB_STATE_DEAD); |
302 | iscsi_destroy_conn(ddb_entry->conn); | ||
303 | iscsi_remove_session(ddb_entry->sess); | 302 | iscsi_remove_session(ddb_entry->sess); |
304 | } | 303 | } |
305 | iscsi_free_session(ddb_entry->sess); | 304 | iscsi_free_session(ddb_entry->sess); |
@@ -309,6 +308,7 @@ int qla4xxx_add_sess(struct ddb_entry *ddb_entry) | |||
309 | { | 308 | { |
310 | int err; | 309 | int err; |
311 | 310 | ||
311 | ddb_entry->sess->recovery_tmo = ddb_entry->ha->port_down_retry_count; | ||
312 | err = iscsi_add_session(ddb_entry->sess, ddb_entry->fw_ddb_index); | 312 | err = iscsi_add_session(ddb_entry->sess, ddb_entry->fw_ddb_index); |
313 | if (err) { | 313 | if (err) { |
314 | DEBUG2(printk(KERN_ERR "Could not add session.\n")); | 314 | DEBUG2(printk(KERN_ERR "Could not add session.\n")); |
@@ -321,9 +321,6 @@ int qla4xxx_add_sess(struct ddb_entry *ddb_entry) | |||
321 | DEBUG2(printk(KERN_ERR "Could not add connection.\n")); | 321 | DEBUG2(printk(KERN_ERR "Could not add connection.\n")); |
322 | return -ENOMEM; | 322 | return -ENOMEM; |
323 | } | 323 | } |
324 | |||
325 | ddb_entry->sess->recovery_tmo = ddb_entry->ha->port_down_retry_count; | ||
326 | iscsi_if_create_session_done(ddb_entry->conn); | ||
327 | return 0; | 324 | return 0; |
328 | } | 325 | } |
329 | 326 | ||