aboutsummaryrefslogtreecommitdiff
path: root/ubuntu/iscsitarget/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'ubuntu/iscsitarget/session.c')
-rw-r--r--ubuntu/iscsitarget/session.c32
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)