aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi/scsi_transport_iscsi.h
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2007-12-13 13:43:29 -0500
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-01-11 19:28:33 -0500
commit2697478903d0ad8bdbf868b1346ae4b891662bb1 (patch)
tree8b40d774c0a6f33f9320333a20e08fa920f154fc /include/scsi/scsi_transport_iscsi.h
parentbc436b278776d22eb10e7e75bf3e5257d14550a9 (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 'include/scsi/scsi_transport_iscsi.h')
-rw-r--r--include/scsi/scsi_transport_iscsi.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
index b8d97bd20f6e..093b4036f8db 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -186,6 +186,7 @@ struct iscsi_cls_session {
186 /* recovery fields */ 186 /* recovery fields */
187 int recovery_tmo; 187 int recovery_tmo;
188 struct delayed_work recovery_work; 188 struct delayed_work recovery_work;
189 struct work_struct unbind_work;
189 190
190 int target_id; 191 int target_id;
191 192
@@ -206,6 +207,8 @@ struct iscsi_cls_session {
206struct iscsi_host { 207struct iscsi_host {
207 struct list_head sessions; 208 struct list_head sessions;
208 struct mutex mutex; 209 struct mutex mutex;
210 struct workqueue_struct *unbind_workq;
211 char unbind_workq_name[KOBJ_NAME_LEN];
209}; 212};
210 213
211/* 214/*
@@ -215,8 +218,8 @@ extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost,
215 struct iscsi_transport *transport); 218 struct iscsi_transport *transport);
216extern int iscsi_add_session(struct iscsi_cls_session *session, 219extern int iscsi_add_session(struct iscsi_cls_session *session,
217 unsigned int target_id); 220 unsigned int target_id);
218extern int iscsi_if_create_session_done(struct iscsi_cls_conn *conn); 221extern int iscsi_session_event(struct iscsi_cls_session *session,
219extern int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn); 222 enum iscsi_uevent_e event);
220extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, 223extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
221 struct iscsi_transport *t, 224 struct iscsi_transport *t,
222 unsigned int target_id); 225 unsigned int target_id);