2
* (C) 2005 FUJITA Tomonori <tomof@acm.org>
4
* This code is licenced under the GPL.
11
struct target_type *target_type_array[] = {
15
#define CHECK_PARAM(info, iparam, word, min, max) \
17
if (!info->partial || (info->partial & 1 << key_##word)) \
18
if (iparam[key_##word] < min || \
19
iparam[key_##word] > max) { \
20
eprintk("%s: %u is out of range (%u %u)\n", \
21
#word, iparam[key_##word], min, max); \
22
iparam[key_##word] = min; \
26
#define SET_PARAM(param, info, iparam, word) \
29
if (!info->partial || (info->partial & 1 << key_##word)) { \
30
if (param->word != iparam[key_##word]) \
32
param->word = iparam[key_##word]; \
37
#define GET_PARAM(param, info, iparam, word) \
39
iparam[key_##word] = param->word; \
42
static void sess_param_check(struct iscsi_param_info *info)
44
u32 *iparam = info->session_param;
46
CHECK_PARAM(info, iparam, max_connections, 1, 65535);
47
CHECK_PARAM(info, iparam, max_recv_data_length, 512,
48
(u32) ((ISCSI_CONN_IOV_MAX - 1) * PAGE_CACHE_SIZE));
49
CHECK_PARAM(info, iparam, max_xmit_data_length, 512,
50
(u32) ((ISCSI_CONN_IOV_MAX - 1) * PAGE_CACHE_SIZE));
51
CHECK_PARAM(info, iparam, error_recovery_level, 0, 0);
52
CHECK_PARAM(info, iparam, data_pdu_inorder, 1, 1);
53
CHECK_PARAM(info, iparam, data_sequence_inorder, 1, 1);
55
digest_alg_available(&iparam[key_header_digest]);
56
digest_alg_available(&iparam[key_data_digest]);
58
CHECK_PARAM(info, iparam, ofmarker, 0, 0);
59
CHECK_PARAM(info, iparam, ifmarker, 0, 0);
62
static void sess_param_set(struct iscsi_sess_param *param, struct iscsi_param_info *info)
64
u32 *iparam = info->session_param;
66
SET_PARAM(param, info, iparam, initial_r2t);
67
SET_PARAM(param, info, iparam, immediate_data);
68
SET_PARAM(param, info, iparam, max_connections);
69
SET_PARAM(param, info, iparam, max_recv_data_length);
70
SET_PARAM(param, info, iparam, max_xmit_data_length);
71
SET_PARAM(param, info, iparam, max_burst_length);
72
SET_PARAM(param, info, iparam, first_burst_length);
73
SET_PARAM(param, info, iparam, default_wait_time);
74
SET_PARAM(param, info, iparam, default_retain_time);
75
SET_PARAM(param, info, iparam, max_outstanding_r2t);
76
SET_PARAM(param, info, iparam, data_pdu_inorder);
77
SET_PARAM(param, info, iparam, data_sequence_inorder);
78
SET_PARAM(param, info, iparam, error_recovery_level);
79
SET_PARAM(param, info, iparam, header_digest);
80
SET_PARAM(param, info, iparam, data_digest);
81
SET_PARAM(param, info, iparam, ofmarker);
82
SET_PARAM(param, info, iparam, ifmarker);
83
SET_PARAM(param, info, iparam, ofmarkint);
84
SET_PARAM(param, info, iparam, ifmarkint);
87
static void sess_param_get(struct iscsi_sess_param *param, struct iscsi_param_info *info)
89
u32 *iparam = info->session_param;
91
GET_PARAM(param, info, iparam, initial_r2t);
92
GET_PARAM(param, info, iparam, immediate_data);
93
GET_PARAM(param, info, iparam, max_connections);
94
GET_PARAM(param, info, iparam, max_recv_data_length);
95
GET_PARAM(param, info, iparam, max_xmit_data_length);
96
GET_PARAM(param, info, iparam, max_burst_length);
97
GET_PARAM(param, info, iparam, first_burst_length);
98
GET_PARAM(param, info, iparam, default_wait_time);
99
GET_PARAM(param, info, iparam, default_retain_time);
100
GET_PARAM(param, info, iparam, max_outstanding_r2t);
101
GET_PARAM(param, info, iparam, data_pdu_inorder);
102
GET_PARAM(param, info, iparam, data_sequence_inorder);
103
GET_PARAM(param, info, iparam, error_recovery_level);
104
GET_PARAM(param, info, iparam, header_digest);
105
GET_PARAM(param, info, iparam, data_digest);
106
GET_PARAM(param, info, iparam, ofmarker);
107
GET_PARAM(param, info, iparam, ifmarker);
108
GET_PARAM(param, info, iparam, ofmarkint);
109
GET_PARAM(param, info, iparam, ifmarkint);
112
static void trgt_param_check(struct iscsi_param_info *info)
114
u32 *iparam = info->target_param;
116
CHECK_PARAM(info, iparam, wthreads, MIN_NR_WTHREADS, MAX_NR_WTHREADS);
117
CHECK_PARAM(info, iparam, target_type, 0,
118
(unsigned int) ARRAY_SIZE(target_type_array) - 1);
119
CHECK_PARAM(info, iparam, queued_cmnds, MIN_NR_QUEUED_CMNDS,
120
MAX_NR_QUEUED_CMNDS);
121
CHECK_PARAM(info, iparam, nop_interval, MIN_NOP_INTERVAL,
123
CHECK_PARAM(info, iparam, nop_timeout, MIN_NOP_TIMEOUT,
127
static void trgt_param_set(struct iscsi_target *target, struct iscsi_param_info *info)
129
struct iscsi_trgt_param *param = &target->trgt_param;
130
u32 *iparam = info->target_param;
132
if (!worker_thread_pool &&
133
SET_PARAM(param, info, iparam, wthreads))
134
wthread_start(target->wthread_info,
135
target->trgt_param.wthreads, target->tid);
136
SET_PARAM(param, info, iparam, target_type);
137
SET_PARAM(param, info, iparam, queued_cmnds);
138
SET_PARAM(param, info, iparam, nop_interval);
139
SET_PARAM(param, info, iparam, nop_timeout);
142
static void trgt_param_get(struct iscsi_trgt_param *param, struct iscsi_param_info *info)
144
u32 *iparam = info->target_param;
146
GET_PARAM(param, info, iparam, wthreads);
147
GET_PARAM(param, info, iparam, target_type);
148
GET_PARAM(param, info, iparam, queued_cmnds);
149
GET_PARAM(param, info, iparam, nop_interval);
150
GET_PARAM(param, info, iparam, nop_timeout);
153
static int trgt_param(struct iscsi_target *target, struct iscsi_param_info *info, int set)
157
trgt_param_check(info);
158
trgt_param_set(target, info);
160
trgt_param_get(&target->trgt_param, info);
165
static int sess_param(struct iscsi_target *target, struct iscsi_param_info *info, int set)
167
struct iscsi_session *session = NULL;
168
struct iscsi_sess_param *param;
172
sess_param_check(info);
175
if (!(session = session_lookup(target, info->sid)))
177
param = &session->param;
179
param = &target->sess_param;
183
sess_param_set(param, info);
186
sess_param_get(param, info);
193
int iscsi_param_set(struct iscsi_target *target, struct iscsi_param_info *info, int set)
197
if (info->param_type == key_session)
198
err = sess_param(target, info, set);
199
else if (info->param_type == key_target)
200
err = trgt_param(target, info, set);