2
* Copyright (C) 2002-2003 Ardis Technolgies <roman@ardistech.com>
4
* Released under the terms of the GNU GPL v2.0.
10
struct iscsi_session *session_lookup(struct iscsi_target *target, u64 sid)
12
struct iscsi_session *session;
14
list_for_each_entry(session, &target->session_list, list) {
15
if (session->sid == sid)
21
static struct iscsi_session *
22
iet_session_alloc(struct iscsi_target *target, struct session_info *info)
25
struct iscsi_session *session;
27
dprintk(D_SETUP, "%p %u %#Lx\n", target, target->tid,
28
(unsigned long long) info->sid);
30
session = kzalloc(sizeof(*session), GFP_KERNEL);
34
session->target = target;
35
session->sid = info->sid;
36
memcpy(&session->param, &target->sess_param, sizeof(session->param));
37
session->max_queued_cmnds = target->trgt_param.queued_cmnds;
39
session->exp_cmd_sn = info->exp_cmd_sn;
40
session->max_cmd_sn = info->max_cmd_sn;
42
session->initiator = kstrdup(info->initiator_name, GFP_KERNEL);
43
if (!session->initiator) {
48
INIT_LIST_HEAD(&session->conn_list);
49
INIT_LIST_HEAD(&session->pending_list);
51
spin_lock_init(&session->cmnd_hash_lock);
52
for (i = 0; i < ARRAY_SIZE(session->cmnd_hash); i++)
53
INIT_LIST_HEAD(&session->cmnd_hash[i]);
55
session->next_ttt = 1;
57
list_add(&session->list, &target->session_list);
62
static int session_free(struct iscsi_session *session)
66
dprintk(D_SETUP, "%#Lx\n", (unsigned long long) session->sid);
68
assert(list_empty(&session->conn_list));
70
for (i = 0; i < ARRAY_SIZE(session->cmnd_hash); i++) {
71
if (!list_empty(&session->cmnd_hash[i]))
75
list_del(&session->list);
77
kfree(session->initiator);
83
int session_add(struct iscsi_target *target, struct session_info *info)
85
struct iscsi_session *session;
88
session = session_lookup(target, info->sid);
92
session = iet_session_alloc(target, info);
99
int session_del(struct iscsi_target *target, u64 sid)
101
struct iscsi_session *session;
103
session = session_lookup(target, sid);
107
if (!list_empty(&session->conn_list)) {
108
eprintk("%llu still have connections\n", (unsigned long long) session->sid);
112
return session_free(session);
115
static void iet_session_info_show(struct seq_file *seq, struct iscsi_target *target)
117
struct iscsi_session *session;
119
list_for_each_entry(session, &target->session_list, list) {
120
seq_printf(seq, "\tsid:%llu initiator:%s\n",
121
(unsigned long long) session->sid, session->initiator);
122
conn_info_show(seq, session);
126
static int iet_session_seq_open(struct inode *inode, struct file *file)
129
res = seq_open(file, &iet_seq_op);
131
((struct seq_file *)file->private_data)->private =
132
iet_session_info_show;
136
struct file_operations session_seq_fops = {
137
.owner = THIS_MODULE,
138
.open = iet_session_seq_open,
141
.release = seq_release,