diff options
Diffstat (limited to 'ubuntu/iscsitarget/session.c')
-rw-r--r-- | ubuntu/iscsitarget/session.c | 32 |
1 files changed, 11 insertions, 21 deletions
diff --git a/ubuntu/iscsitarget/session.c b/ubuntu/iscsitarget/session.c index 6365373c768..a566d8bea07 100644 --- a/ubuntu/iscsitarget/session.c +++ b/ubuntu/iscsitarget/session.c @@ -124,40 +124,30 @@ int session_add(struct iscsi_target *target, struct session_info *info) int session_del(struct iscsi_target *target, u64 sid) { struct iscsi_session *session; + struct iet_volume *volume; session = session_lookup(target, sid); if (!session) return -ENOENT; if (!list_empty(&session->conn_list)) { - eprintk("%llu still have connections\n", (unsigned long long) session->sid); - return -EBUSY; - } + DECLARE_COMPLETION_ONSTACK(done); + struct iscsi_conn *conn; - return session_free(session); -} - -void session_del_all(struct iscsi_target *target) -{ - DECLARE_COMPLETION_ONSTACK(done); - struct iscsi_session *sess; + session->done = &done; + list_for_each_entry(conn, &session->conn_list, list) + conn_close(conn); - while (!list_empty(&target->session_list)) { - init_completion(&done); - target_lock(target, 0); - sess = list_entry(target->session_list.next, struct - iscsi_session, list); - sess->done = &done; - conn_del_all(sess); target_unlock(target); wait_for_completion(&done); target_lock(target, 0); - session_free(sess); - target_unlock(target); } - if (target->done) - complete(target->done); + list_for_each_entry(volume, &target->volumes, list){ + volume_release(volume, sid, 0); + } + + return session_free(session); } static void iet_session_info_show(struct seq_file *seq, struct iscsi_target *target) |