~ubuntu-branches/ubuntu/karmic/linux-mvl-dove/karmic-proposed

« back to all changes in this revision

Viewing changes to ubuntu/iscsitarget/session.c

  • Committer: Bazaar Package Importer
  • Author(s): Stefan Bader
  • Date: 2010-03-10 22:24:12 UTC
  • mto: (15.1.2 karmic-security)
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: james.westby@ubuntu.com-20100310222412-k86m3r53jw0je7x1
Tags: upstream-2.6.31
ImportĀ upstreamĀ versionĀ 2.6.31

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (C) 2002-2003 Ardis Technolgies <roman@ardistech.com>
3
 
 *
4
 
 * Released under the terms of the GNU GPL v2.0.
5
 
 */
6
 
 
7
 
#include "iscsi.h"
8
 
#include "iscsi_dbg.h"
9
 
 
10
 
struct iscsi_session *session_lookup(struct iscsi_target *target, u64 sid)
11
 
{
12
 
        struct iscsi_session *session;
13
 
 
14
 
        list_for_each_entry(session, &target->session_list, list) {
15
 
                if (session->sid == sid)
16
 
                        return session;
17
 
        }
18
 
        return NULL;
19
 
}
20
 
 
21
 
static struct iscsi_session *
22
 
iet_session_alloc(struct iscsi_target *target, struct session_info *info)
23
 
{
24
 
        int i;
25
 
        struct iscsi_session *session;
26
 
 
27
 
        dprintk(D_SETUP, "%p %u %#Lx\n", target, target->tid,
28
 
                (unsigned long long) info->sid);
29
 
 
30
 
        session = kzalloc(sizeof(*session), GFP_KERNEL);
31
 
        if (!session)
32
 
                return NULL;
33
 
 
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;
38
 
 
39
 
        session->exp_cmd_sn = info->exp_cmd_sn;
40
 
        session->max_cmd_sn = info->max_cmd_sn;
41
 
 
42
 
        session->initiator = kstrdup(info->initiator_name, GFP_KERNEL);
43
 
        if (!session->initiator) {
44
 
                kfree(session);
45
 
                return NULL;
46
 
        }
47
 
 
48
 
        INIT_LIST_HEAD(&session->conn_list);
49
 
        INIT_LIST_HEAD(&session->pending_list);
50
 
 
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]);
54
 
 
55
 
        session->next_ttt = 1;
56
 
 
57
 
        list_add(&session->list, &target->session_list);
58
 
 
59
 
        return session;
60
 
}
61
 
 
62
 
static int session_free(struct iscsi_session *session)
63
 
{
64
 
        int i;
65
 
 
66
 
        dprintk(D_SETUP, "%#Lx\n", (unsigned long long) session->sid);
67
 
 
68
 
        assert(list_empty(&session->conn_list));
69
 
 
70
 
        for (i = 0; i < ARRAY_SIZE(session->cmnd_hash); i++) {
71
 
                if (!list_empty(&session->cmnd_hash[i]))
72
 
                        BUG();
73
 
        }
74
 
 
75
 
        list_del(&session->list);
76
 
 
77
 
        kfree(session->initiator);
78
 
        kfree(session);
79
 
 
80
 
        return 0;
81
 
}
82
 
 
83
 
int session_add(struct iscsi_target *target, struct session_info *info)
84
 
{
85
 
        struct iscsi_session *session;
86
 
        int err = -EEXIST;
87
 
 
88
 
        session = session_lookup(target, info->sid);
89
 
        if (session)
90
 
                return err;
91
 
 
92
 
        session = iet_session_alloc(target, info);
93
 
        if (!session)
94
 
                err = -ENOMEM;
95
 
 
96
 
        return err;
97
 
}
98
 
 
99
 
int session_del(struct iscsi_target *target, u64 sid)
100
 
{
101
 
        struct iscsi_session *session;
102
 
 
103
 
        session = session_lookup(target, sid);
104
 
        if (!session)
105
 
                return -ENOENT;
106
 
 
107
 
        if (!list_empty(&session->conn_list)) {
108
 
                eprintk("%llu still have connections\n", (unsigned long long) session->sid);
109
 
                return -EBUSY;
110
 
        }
111
 
 
112
 
        return session_free(session);
113
 
}
114
 
 
115
 
static void iet_session_info_show(struct seq_file *seq, struct iscsi_target *target)
116
 
{
117
 
        struct iscsi_session *session;
118
 
 
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);
123
 
        }
124
 
}
125
 
 
126
 
static int iet_session_seq_open(struct inode *inode, struct file *file)
127
 
{
128
 
        int res;
129
 
        res = seq_open(file, &iet_seq_op);
130
 
        if (!res)
131
 
                ((struct seq_file *)file->private_data)->private =
132
 
                        iet_session_info_show;
133
 
        return res;
134
 
}
135
 
 
136
 
struct file_operations session_seq_fops = {
137
 
        .owner          = THIS_MODULE,
138
 
        .open           = iet_session_seq_open,
139
 
        .read           = seq_read,
140
 
        .llseek         = seq_lseek,
141
 
        .release        = seq_release,
142
 
};