diff options
-rw-r--r-- | drivers/scsi/iscsi_tcp.c | 152 |
1 files changed, 24 insertions, 128 deletions
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index b4743a9ecc80..848fb2aa4ca3 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c | |||
@@ -2130,19 +2130,21 @@ iscsi_r2tpool_free(struct iscsi_session *session) | |||
2130 | 2130 | ||
2131 | static int | 2131 | static int |
2132 | iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, | 2132 | iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, |
2133 | uint32_t value) | 2133 | char *buf, int buflen) |
2134 | { | 2134 | { |
2135 | struct iscsi_conn *conn = cls_conn->dd_data; | 2135 | struct iscsi_conn *conn = cls_conn->dd_data; |
2136 | struct iscsi_session *session = conn->session; | 2136 | struct iscsi_session *session = conn->session; |
2137 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; | 2137 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; |
2138 | int value; | ||
2138 | 2139 | ||
2139 | switch(param) { | 2140 | switch(param) { |
2140 | case ISCSI_PARAM_MAX_RECV_DLENGTH: { | 2141 | case ISCSI_PARAM_MAX_RECV_DLENGTH: { |
2141 | char *saveptr = tcp_conn->data; | 2142 | char *saveptr = tcp_conn->data; |
2142 | gfp_t flags = GFP_KERNEL; | 2143 | gfp_t flags = GFP_KERNEL; |
2143 | 2144 | ||
2145 | sscanf(buf, "%d", &value); | ||
2144 | if (tcp_conn->data_size >= value) { | 2146 | if (tcp_conn->data_size >= value) { |
2145 | conn->max_recv_dlength = value; | 2147 | iscsi_set_param(cls_conn, param, buf, buflen); |
2146 | break; | 2148 | break; |
2147 | } | 2149 | } |
2148 | 2150 | ||
@@ -2165,15 +2167,12 @@ iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, | |||
2165 | else | 2167 | else |
2166 | free_pages((unsigned long)saveptr, | 2168 | free_pages((unsigned long)saveptr, |
2167 | get_order(tcp_conn->data_size)); | 2169 | get_order(tcp_conn->data_size)); |
2168 | conn->max_recv_dlength = value; | 2170 | iscsi_set_param(cls_conn, param, buf, buflen); |
2169 | tcp_conn->data_size = value; | 2171 | tcp_conn->data_size = value; |
2170 | } | ||
2171 | break; | ||
2172 | case ISCSI_PARAM_MAX_XMIT_DLENGTH: | ||
2173 | conn->max_xmit_dlength = value; | ||
2174 | break; | 2172 | break; |
2173 | } | ||
2175 | case ISCSI_PARAM_HDRDGST_EN: | 2174 | case ISCSI_PARAM_HDRDGST_EN: |
2176 | conn->hdrdgst_en = value; | 2175 | iscsi_set_param(cls_conn, param, buf, buflen); |
2177 | tcp_conn->hdr_size = sizeof(struct iscsi_hdr); | 2176 | tcp_conn->hdr_size = sizeof(struct iscsi_hdr); |
2178 | if (conn->hdrdgst_en) { | 2177 | if (conn->hdrdgst_en) { |
2179 | tcp_conn->hdr_size += sizeof(__u32); | 2178 | tcp_conn->hdr_size += sizeof(__u32); |
@@ -2197,7 +2196,7 @@ iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, | |||
2197 | } | 2196 | } |
2198 | break; | 2197 | break; |
2199 | case ISCSI_PARAM_DATADGST_EN: | 2198 | case ISCSI_PARAM_DATADGST_EN: |
2200 | conn->datadgst_en = value; | 2199 | iscsi_set_param(cls_conn, param, buf, buflen); |
2201 | if (conn->datadgst_en) { | 2200 | if (conn->datadgst_en) { |
2202 | if (!tcp_conn->data_tx_tfm) | 2201 | if (!tcp_conn->data_tx_tfm) |
2203 | tcp_conn->data_tx_tfm = | 2202 | tcp_conn->data_tx_tfm = |
@@ -2220,121 +2219,36 @@ iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, | |||
2220 | tcp_conn->sendpage = conn->datadgst_en ? | 2219 | tcp_conn->sendpage = conn->datadgst_en ? |
2221 | sock_no_sendpage : tcp_conn->sock->ops->sendpage; | 2220 | sock_no_sendpage : tcp_conn->sock->ops->sendpage; |
2222 | break; | 2221 | break; |
2223 | case ISCSI_PARAM_INITIAL_R2T_EN: | ||
2224 | session->initial_r2t_en = value; | ||
2225 | break; | ||
2226 | case ISCSI_PARAM_MAX_R2T: | 2222 | case ISCSI_PARAM_MAX_R2T: |
2223 | sscanf(buf, "%d", &value); | ||
2227 | if (session->max_r2t == roundup_pow_of_two(value)) | 2224 | if (session->max_r2t == roundup_pow_of_two(value)) |
2228 | break; | 2225 | break; |
2229 | iscsi_r2tpool_free(session); | 2226 | iscsi_r2tpool_free(session); |
2230 | session->max_r2t = value; | 2227 | iscsi_set_param(cls_conn, param, buf, buflen); |
2231 | if (session->max_r2t & (session->max_r2t - 1)) | 2228 | if (session->max_r2t & (session->max_r2t - 1)) |
2232 | session->max_r2t = roundup_pow_of_two(session->max_r2t); | 2229 | session->max_r2t = roundup_pow_of_two(session->max_r2t); |
2233 | if (iscsi_r2tpool_alloc(session)) | 2230 | if (iscsi_r2tpool_alloc(session)) |
2234 | return -ENOMEM; | 2231 | return -ENOMEM; |
2235 | break; | 2232 | break; |
2236 | case ISCSI_PARAM_IMM_DATA_EN: | ||
2237 | session->imm_data_en = value; | ||
2238 | break; | ||
2239 | case ISCSI_PARAM_FIRST_BURST: | ||
2240 | session->first_burst = value; | ||
2241 | break; | ||
2242 | case ISCSI_PARAM_MAX_BURST: | ||
2243 | session->max_burst = value; | ||
2244 | break; | ||
2245 | case ISCSI_PARAM_PDU_INORDER_EN: | ||
2246 | session->pdu_inorder_en = value; | ||
2247 | break; | ||
2248 | case ISCSI_PARAM_DATASEQ_INORDER_EN: | ||
2249 | session->dataseq_inorder_en = value; | ||
2250 | break; | ||
2251 | case ISCSI_PARAM_ERL: | ||
2252 | session->erl = value; | ||
2253 | break; | ||
2254 | case ISCSI_PARAM_IFMARKER_EN: | ||
2255 | BUG_ON(value); | ||
2256 | session->ifmarker_en = value; | ||
2257 | break; | ||
2258 | case ISCSI_PARAM_OFMARKER_EN: | ||
2259 | BUG_ON(value); | ||
2260 | session->ofmarker_en = value; | ||
2261 | break; | ||
2262 | case ISCSI_PARAM_EXP_STATSN: | ||
2263 | conn->exp_statsn = value; | ||
2264 | break; | ||
2265 | default: | ||
2266 | break; | ||
2267 | } | ||
2268 | |||
2269 | return 0; | ||
2270 | } | ||
2271 | |||
2272 | static int | ||
2273 | iscsi_session_get_param(struct iscsi_cls_session *cls_session, | ||
2274 | enum iscsi_param param, uint32_t *value) | ||
2275 | { | ||
2276 | struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); | ||
2277 | struct iscsi_session *session = iscsi_hostdata(shost->hostdata); | ||
2278 | |||
2279 | switch(param) { | ||
2280 | case ISCSI_PARAM_INITIAL_R2T_EN: | ||
2281 | *value = session->initial_r2t_en; | ||
2282 | break; | ||
2283 | case ISCSI_PARAM_MAX_R2T: | ||
2284 | *value = session->max_r2t; | ||
2285 | break; | ||
2286 | case ISCSI_PARAM_IMM_DATA_EN: | ||
2287 | *value = session->imm_data_en; | ||
2288 | break; | ||
2289 | case ISCSI_PARAM_FIRST_BURST: | ||
2290 | *value = session->first_burst; | ||
2291 | break; | ||
2292 | case ISCSI_PARAM_MAX_BURST: | ||
2293 | *value = session->max_burst; | ||
2294 | break; | ||
2295 | case ISCSI_PARAM_PDU_INORDER_EN: | ||
2296 | *value = session->pdu_inorder_en; | ||
2297 | break; | ||
2298 | case ISCSI_PARAM_DATASEQ_INORDER_EN: | ||
2299 | *value = session->dataseq_inorder_en; | ||
2300 | break; | ||
2301 | case ISCSI_PARAM_ERL: | ||
2302 | *value = session->erl; | ||
2303 | break; | ||
2304 | case ISCSI_PARAM_IFMARKER_EN: | ||
2305 | *value = session->ifmarker_en; | ||
2306 | break; | ||
2307 | case ISCSI_PARAM_OFMARKER_EN: | ||
2308 | *value = session->ofmarker_en; | ||
2309 | break; | ||
2310 | default: | 2233 | default: |
2311 | return -EINVAL; | 2234 | return iscsi_set_param(cls_conn, param, buf, buflen); |
2312 | } | 2235 | } |
2313 | 2236 | ||
2314 | return 0; | 2237 | return 0; |
2315 | } | 2238 | } |
2316 | 2239 | ||
2317 | static int | 2240 | static int |
2318 | iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, | 2241 | iscsi_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn, |
2319 | enum iscsi_param param, uint32_t *value) | 2242 | enum iscsi_param param, char *buf) |
2320 | { | 2243 | { |
2321 | struct iscsi_conn *conn = cls_conn->dd_data; | 2244 | struct iscsi_conn *conn = cls_conn->dd_data; |
2322 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; | 2245 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; |
2323 | struct inet_sock *inet; | 2246 | struct inet_sock *inet; |
2247 | struct ipv6_pinfo *np; | ||
2248 | struct sock *sk; | ||
2249 | int len; | ||
2324 | 2250 | ||
2325 | switch(param) { | 2251 | switch(param) { |
2326 | case ISCSI_PARAM_MAX_RECV_DLENGTH: | ||
2327 | *value = conn->max_recv_dlength; | ||
2328 | break; | ||
2329 | case ISCSI_PARAM_MAX_XMIT_DLENGTH: | ||
2330 | *value = conn->max_xmit_dlength; | ||
2331 | break; | ||
2332 | case ISCSI_PARAM_HDRDGST_EN: | ||
2333 | *value = conn->hdrdgst_en; | ||
2334 | break; | ||
2335 | case ISCSI_PARAM_DATADGST_EN: | ||
2336 | *value = conn->datadgst_en; | ||
2337 | break; | ||
2338 | case ISCSI_PARAM_CONN_PORT: | 2252 | case ISCSI_PARAM_CONN_PORT: |
2339 | mutex_lock(&conn->xmitmutex); | 2253 | mutex_lock(&conn->xmitmutex); |
2340 | if (!tcp_conn->sock) { | 2254 | if (!tcp_conn->sock) { |
@@ -2343,30 +2257,9 @@ iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, | |||
2343 | } | 2257 | } |
2344 | 2258 | ||
2345 | inet = inet_sk(tcp_conn->sock->sk); | 2259 | inet = inet_sk(tcp_conn->sock->sk); |
2346 | *value = be16_to_cpu(inet->dport); | 2260 | len = sprintf(buf, "%hu\n", be16_to_cpu(inet->dport)); |
2347 | mutex_unlock(&conn->xmitmutex); | 2261 | mutex_unlock(&conn->xmitmutex); |
2348 | case ISCSI_PARAM_EXP_STATSN: | ||
2349 | *value = conn->exp_statsn; | ||
2350 | break; | 2262 | break; |
2351 | default: | ||
2352 | return -EINVAL; | ||
2353 | } | ||
2354 | |||
2355 | return 0; | ||
2356 | } | ||
2357 | |||
2358 | static int | ||
2359 | iscsi_conn_get_str_param(struct iscsi_cls_conn *cls_conn, | ||
2360 | enum iscsi_param param, char *buf) | ||
2361 | { | ||
2362 | struct iscsi_conn *conn = cls_conn->dd_data; | ||
2363 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; | ||
2364 | struct sock *sk; | ||
2365 | struct inet_sock *inet; | ||
2366 | struct ipv6_pinfo *np; | ||
2367 | int len = 0; | ||
2368 | |||
2369 | switch (param) { | ||
2370 | case ISCSI_PARAM_CONN_ADDRESS: | 2263 | case ISCSI_PARAM_CONN_ADDRESS: |
2371 | mutex_lock(&conn->xmitmutex); | 2264 | mutex_lock(&conn->xmitmutex); |
2372 | if (!tcp_conn->sock) { | 2265 | if (!tcp_conn->sock) { |
@@ -2388,7 +2281,7 @@ iscsi_conn_get_str_param(struct iscsi_cls_conn *cls_conn, | |||
2388 | mutex_unlock(&conn->xmitmutex); | 2281 | mutex_unlock(&conn->xmitmutex); |
2389 | break; | 2282 | break; |
2390 | default: | 2283 | default: |
2391 | return -EINVAL; | 2284 | return iscsi_conn_get_param(cls_conn, param, buf); |
2392 | } | 2285 | } |
2393 | 2286 | ||
2394 | return len; | 2287 | return len; |
@@ -2501,7 +2394,11 @@ static struct iscsi_transport iscsi_tcp_transport = { | |||
2501 | ISCSI_ERL | | 2394 | ISCSI_ERL | |
2502 | ISCSI_CONN_PORT | | 2395 | ISCSI_CONN_PORT | |
2503 | ISCSI_CONN_ADDRESS | | 2396 | ISCSI_CONN_ADDRESS | |
2504 | ISCSI_EXP_STATSN, | 2397 | ISCSI_EXP_STATSN | |
2398 | ISCSI_PERSISTENT_PORT | | ||
2399 | ISCSI_PERSISTENT_ADDRESS | | ||
2400 | ISCSI_TARGET_NAME | | ||
2401 | ISCSI_TPGT, | ||
2505 | .host_template = &iscsi_sht, | 2402 | .host_template = &iscsi_sht, |
2506 | .conndata_size = sizeof(struct iscsi_conn), | 2403 | .conndata_size = sizeof(struct iscsi_conn), |
2507 | .max_conn = 1, | 2404 | .max_conn = 1, |
@@ -2514,8 +2411,7 @@ static struct iscsi_transport iscsi_tcp_transport = { | |||
2514 | .bind_conn = iscsi_tcp_conn_bind, | 2411 | .bind_conn = iscsi_tcp_conn_bind, |
2515 | .destroy_conn = iscsi_tcp_conn_destroy, | 2412 | .destroy_conn = iscsi_tcp_conn_destroy, |
2516 | .set_param = iscsi_conn_set_param, | 2413 | .set_param = iscsi_conn_set_param, |
2517 | .get_conn_param = iscsi_conn_get_param, | 2414 | .get_conn_param = iscsi_tcp_conn_get_param, |
2518 | .get_conn_str_param = iscsi_conn_get_str_param, | ||
2519 | .get_session_param = iscsi_session_get_param, | 2415 | .get_session_param = iscsi_session_get_param, |
2520 | .start_conn = iscsi_conn_start, | 2416 | .start_conn = iscsi_conn_start, |
2521 | .stop_conn = iscsi_conn_stop, | 2417 | .stop_conn = iscsi_conn_stop, |