aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/iscsi/iscsi_target.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-09-11 22:00:42 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-09-11 22:00:42 -0400
commit05c78081d2d8eaf04bf60946fcc53380febf3376 (patch)
tree0ba735378eb44380c916c075e4fe17d74f3889c5 /drivers/target/iscsi/iscsi_target.c
parent8e78b7dc93c580c050435b0f88991c26e02166bc (diff)
parentac64a2ce509104a746321a4f9646b6750cf281eb (diff)
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull SCSI target updates from Nicholas Bellinger: "Here are the outstanding target-pending updates for v4.3-rc1. Mostly bug-fixes and minor changes this round. The fallout from the big v4.2-rc1 RCU conversion have (thus far) been minimal. The highlights this round include: - Move sense handling routines into scsi_common code (Sagi) - Return ABORTED_COMMAND sense key for PI errors (Sagi) - Add tpg_enabled_sendtargets attribute for disabled iscsi-target discovery (David) - Shrink target struct se_cmd by rearranging fields (Roland) - Drop iSCSI use of mutex around max_cmd_sn increment (Roland) - Replace iSCSI __kernel_sockaddr_storage with sockaddr_storage (Andy + Chris) - Honor fabric max_data_sg_nents I/O transfer limit (Arun + Himanshu + nab) - Fix EXTENDED_COPY >= v4.1 regression OOPsen (Alex + nab)" * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (37 commits) target: use stringify.h instead of own definition target/user: Fix UFLAG_UNKNOWN_OP handling target: Remove no-op conditional target/user: Remove unused variable target: Fix max_cmd_sn increment w/o cmdsn mutex regressions target: Attach EXTENDED_COPY local I/O descriptors to xcopy_pt_sess target/qla2xxx: Honor max_data_sg_nents I/O transfer limit target/iscsi: Replace __kernel_sockaddr_storage with sockaddr_storage target/iscsi: Replace conn->login_ip with login_sockaddr target/iscsi: Keep local_ip as the actual sockaddr target/iscsi: Fix np_ip bracket issue by removing np_ip target: Drop iSCSI use of mutex around max_cmd_sn increment qla2xxx: Update tcm_qla2xxx module description to 24xx+ iscsi-target: Add tpg_enabled_sendtargets for disabled discovery drivers: target: Drop unlikely before IS_ERR(_OR_NULL) target: check DPO/FUA usage for COMPARE AND WRITE target: Shrink struct se_cmd by rearranging fields target: Remove cmd->se_ordered_id (unused except debug log lines) target: add support for START_STOP_UNIT SCSI opcode target: improve unsupported opcode message ...
Diffstat (limited to 'drivers/target/iscsi/iscsi_target.c')
-rw-r--r--drivers/target/iscsi/iscsi_target.c86
1 files changed, 37 insertions, 49 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index fd092909a457..342a07c58d89 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -269,14 +269,14 @@ int iscsit_deaccess_np(struct iscsi_np *np, struct iscsi_portal_group *tpg,
269} 269}
270 270
271bool iscsit_check_np_match( 271bool iscsit_check_np_match(
272 struct __kernel_sockaddr_storage *sockaddr, 272 struct sockaddr_storage *sockaddr,
273 struct iscsi_np *np, 273 struct iscsi_np *np,
274 int network_transport) 274 int network_transport)
275{ 275{
276 struct sockaddr_in *sock_in, *sock_in_e; 276 struct sockaddr_in *sock_in, *sock_in_e;
277 struct sockaddr_in6 *sock_in6, *sock_in6_e; 277 struct sockaddr_in6 *sock_in6, *sock_in6_e;
278 bool ip_match = false; 278 bool ip_match = false;
279 u16 port; 279 u16 port, port_e;
280 280
281 if (sockaddr->ss_family == AF_INET6) { 281 if (sockaddr->ss_family == AF_INET6) {
282 sock_in6 = (struct sockaddr_in6 *)sockaddr; 282 sock_in6 = (struct sockaddr_in6 *)sockaddr;
@@ -288,6 +288,7 @@ bool iscsit_check_np_match(
288 ip_match = true; 288 ip_match = true;
289 289
290 port = ntohs(sock_in6->sin6_port); 290 port = ntohs(sock_in6->sin6_port);
291 port_e = ntohs(sock_in6_e->sin6_port);
291 } else { 292 } else {
292 sock_in = (struct sockaddr_in *)sockaddr; 293 sock_in = (struct sockaddr_in *)sockaddr;
293 sock_in_e = (struct sockaddr_in *)&np->np_sockaddr; 294 sock_in_e = (struct sockaddr_in *)&np->np_sockaddr;
@@ -296,9 +297,10 @@ bool iscsit_check_np_match(
296 ip_match = true; 297 ip_match = true;
297 298
298 port = ntohs(sock_in->sin_port); 299 port = ntohs(sock_in->sin_port);
300 port_e = ntohs(sock_in_e->sin_port);
299 } 301 }
300 302
301 if (ip_match && (np->np_port == port) && 303 if (ip_match && (port_e == port) &&
302 (np->np_network_transport == network_transport)) 304 (np->np_network_transport == network_transport))
303 return true; 305 return true;
304 306
@@ -309,7 +311,7 @@ bool iscsit_check_np_match(
309 * Called with mutex np_lock held 311 * Called with mutex np_lock held
310 */ 312 */
311static struct iscsi_np *iscsit_get_np( 313static struct iscsi_np *iscsit_get_np(
312 struct __kernel_sockaddr_storage *sockaddr, 314 struct sockaddr_storage *sockaddr,
313 int network_transport) 315 int network_transport)
314{ 316{
315 struct iscsi_np *np; 317 struct iscsi_np *np;
@@ -340,12 +342,9 @@ static struct iscsi_np *iscsit_get_np(
340} 342}
341 343
342struct iscsi_np *iscsit_add_np( 344struct iscsi_np *iscsit_add_np(
343 struct __kernel_sockaddr_storage *sockaddr, 345 struct sockaddr_storage *sockaddr,
344 char *ip_str,
345 int network_transport) 346 int network_transport)
346{ 347{
347 struct sockaddr_in *sock_in;
348 struct sockaddr_in6 *sock_in6;
349 struct iscsi_np *np; 348 struct iscsi_np *np;
350 int ret; 349 int ret;
351 350
@@ -368,16 +367,6 @@ struct iscsi_np *iscsit_add_np(
368 } 367 }
369 368
370 np->np_flags |= NPF_IP_NETWORK; 369 np->np_flags |= NPF_IP_NETWORK;
371 if (sockaddr->ss_family == AF_INET6) {
372 sock_in6 = (struct sockaddr_in6 *)sockaddr;
373 snprintf(np->np_ip, IPV6_ADDRESS_SPACE, "%s", ip_str);
374 np->np_port = ntohs(sock_in6->sin6_port);
375 } else {
376 sock_in = (struct sockaddr_in *)sockaddr;
377 sprintf(np->np_ip, "%s", ip_str);
378 np->np_port = ntohs(sock_in->sin_port);
379 }
380
381 np->np_network_transport = network_transport; 370 np->np_network_transport = network_transport;
382 spin_lock_init(&np->np_thread_lock); 371 spin_lock_init(&np->np_thread_lock);
383 init_completion(&np->np_restart_comp); 372 init_completion(&np->np_restart_comp);
@@ -411,8 +400,8 @@ struct iscsi_np *iscsit_add_np(
411 list_add_tail(&np->np_list, &g_np_list); 400 list_add_tail(&np->np_list, &g_np_list);
412 mutex_unlock(&np_lock); 401 mutex_unlock(&np_lock);
413 402
414 pr_debug("CORE[0] - Added Network Portal: %s:%hu on %s\n", 403 pr_debug("CORE[0] - Added Network Portal: %pISpc on %s\n",
415 np->np_ip, np->np_port, np->np_transport->name); 404 &np->np_sockaddr, np->np_transport->name);
416 405
417 return np; 406 return np;
418} 407}
@@ -481,8 +470,8 @@ int iscsit_del_np(struct iscsi_np *np)
481 list_del(&np->np_list); 470 list_del(&np->np_list);
482 mutex_unlock(&np_lock); 471 mutex_unlock(&np_lock);
483 472
484 pr_debug("CORE[0] - Removed Network Portal: %s:%hu on %s\n", 473 pr_debug("CORE[0] - Removed Network Portal: %pISpc on %s\n",
485 np->np_ip, np->np_port, np->np_transport->name); 474 &np->np_sockaddr, np->np_transport->name);
486 475
487 iscsit_put_transport(np->np_transport); 476 iscsit_put_transport(np->np_transport);
488 kfree(np); 477 kfree(np);
@@ -1209,7 +1198,6 @@ static u32 iscsit_do_crypto_hash_sg(
1209 u8 *pad_bytes) 1198 u8 *pad_bytes)
1210{ 1199{
1211 u32 data_crc; 1200 u32 data_crc;
1212 u32 i;
1213 struct scatterlist *sg; 1201 struct scatterlist *sg;
1214 unsigned int page_off; 1202 unsigned int page_off;
1215 1203
@@ -1218,15 +1206,15 @@ static u32 iscsit_do_crypto_hash_sg(
1218 sg = cmd->first_data_sg; 1206 sg = cmd->first_data_sg;
1219 page_off = cmd->first_data_sg_off; 1207 page_off = cmd->first_data_sg_off;
1220 1208
1221 i = 0;
1222 while (data_length) { 1209 while (data_length) {
1223 u32 cur_len = min_t(u32, data_length, (sg[i].length - page_off)); 1210 u32 cur_len = min_t(u32, data_length, (sg->length - page_off));
1224 1211
1225 crypto_hash_update(hash, &sg[i], cur_len); 1212 crypto_hash_update(hash, sg, cur_len);
1226 1213
1227 data_length -= cur_len; 1214 data_length -= cur_len;
1228 page_off = 0; 1215 page_off = 0;
1229 i++; 1216 /* iscsit_map_iovec has already checked for invalid sg pointers */
1217 sg = sg_next(sg);
1230 } 1218 }
1231 1219
1232 if (padding) { 1220 if (padding) {
@@ -2556,7 +2544,7 @@ static int iscsit_send_conn_drop_async_message(
2556 cmd->stat_sn = conn->stat_sn++; 2544 cmd->stat_sn = conn->stat_sn++;
2557 hdr->statsn = cpu_to_be32(cmd->stat_sn); 2545 hdr->statsn = cpu_to_be32(cmd->stat_sn);
2558 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); 2546 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
2559 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); 2547 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
2560 hdr->async_event = ISCSI_ASYNC_MSG_DROPPING_CONNECTION; 2548 hdr->async_event = ISCSI_ASYNC_MSG_DROPPING_CONNECTION;
2561 hdr->param1 = cpu_to_be16(cmd->logout_cid); 2549 hdr->param1 = cpu_to_be16(cmd->logout_cid);
2562 hdr->param2 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Wait); 2550 hdr->param2 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Wait);
@@ -2628,7 +2616,7 @@ iscsit_build_datain_pdu(struct iscsi_cmd *cmd, struct iscsi_conn *conn,
2628 hdr->statsn = cpu_to_be32(0xFFFFFFFF); 2616 hdr->statsn = cpu_to_be32(0xFFFFFFFF);
2629 2617
2630 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); 2618 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
2631 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); 2619 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
2632 hdr->datasn = cpu_to_be32(datain->data_sn); 2620 hdr->datasn = cpu_to_be32(datain->data_sn);
2633 hdr->offset = cpu_to_be32(datain->offset); 2621 hdr->offset = cpu_to_be32(datain->offset);
2634 2622
@@ -2839,7 +2827,7 @@ iscsit_build_logout_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn,
2839 2827
2840 iscsit_increment_maxcmdsn(cmd, conn->sess); 2828 iscsit_increment_maxcmdsn(cmd, conn->sess);
2841 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); 2829 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
2842 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); 2830 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
2843 2831
2844 pr_debug("Built Logout Response ITT: 0x%08x StatSN:" 2832 pr_debug("Built Logout Response ITT: 0x%08x StatSN:"
2845 " 0x%08x Response: 0x%02x CID: %hu on CID: %hu\n", 2833 " 0x%08x Response: 0x%02x CID: %hu on CID: %hu\n",
@@ -2902,7 +2890,7 @@ iscsit_build_nopin_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn,
2902 iscsit_increment_maxcmdsn(cmd, conn->sess); 2890 iscsit_increment_maxcmdsn(cmd, conn->sess);
2903 2891
2904 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); 2892 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
2905 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); 2893 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
2906 2894
2907 pr_debug("Built NOPIN %s Response ITT: 0x%08x, TTT: 0x%08x," 2895 pr_debug("Built NOPIN %s Response ITT: 0x%08x, TTT: 0x%08x,"
2908 " StatSN: 0x%08x, Length %u\n", (nopout_response) ? 2896 " StatSN: 0x%08x, Length %u\n", (nopout_response) ?
@@ -3049,7 +3037,7 @@ static int iscsit_send_r2t(
3049 hdr->ttt = cpu_to_be32(r2t->targ_xfer_tag); 3037 hdr->ttt = cpu_to_be32(r2t->targ_xfer_tag);
3050 hdr->statsn = cpu_to_be32(conn->stat_sn); 3038 hdr->statsn = cpu_to_be32(conn->stat_sn);
3051 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); 3039 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3052 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); 3040 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3053 hdr->r2tsn = cpu_to_be32(r2t->r2t_sn); 3041 hdr->r2tsn = cpu_to_be32(r2t->r2t_sn);
3054 hdr->data_offset = cpu_to_be32(r2t->offset); 3042 hdr->data_offset = cpu_to_be32(r2t->offset);
3055 hdr->data_length = cpu_to_be32(r2t->xfer_len); 3043 hdr->data_length = cpu_to_be32(r2t->xfer_len);
@@ -3202,7 +3190,7 @@ void iscsit_build_rsp_pdu(struct iscsi_cmd *cmd, struct iscsi_conn *conn,
3202 3190
3203 iscsit_increment_maxcmdsn(cmd, conn->sess); 3191 iscsit_increment_maxcmdsn(cmd, conn->sess);
3204 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); 3192 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3205 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); 3193 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3206 3194
3207 pr_debug("Built SCSI Response, ITT: 0x%08x, StatSN: 0x%08x," 3195 pr_debug("Built SCSI Response, ITT: 0x%08x, StatSN: 0x%08x,"
3208 " Response: 0x%02x, SAM Status: 0x%02x, CID: %hu\n", 3196 " Response: 0x%02x, SAM Status: 0x%02x, CID: %hu\n",
@@ -3321,7 +3309,7 @@ iscsit_build_task_mgt_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn,
3321 3309
3322 iscsit_increment_maxcmdsn(cmd, conn->sess); 3310 iscsit_increment_maxcmdsn(cmd, conn->sess);
3323 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); 3311 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3324 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); 3312 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3325 3313
3326 pr_debug("Built Task Management Response ITT: 0x%08x," 3314 pr_debug("Built Task Management Response ITT: 0x%08x,"
3327 " StatSN: 0x%08x, Response: 0x%02x, CID: %hu\n", 3315 " StatSN: 0x%08x, Response: 0x%02x, CID: %hu\n",
@@ -3399,6 +3387,7 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd,
3399 int target_name_printed; 3387 int target_name_printed;
3400 unsigned char buf[ISCSI_IQN_LEN+12]; /* iqn + "TargetName=" + \0 */ 3388 unsigned char buf[ISCSI_IQN_LEN+12]; /* iqn + "TargetName=" + \0 */
3401 unsigned char *text_in = cmd->text_in_ptr, *text_ptr = NULL; 3389 unsigned char *text_in = cmd->text_in_ptr, *text_ptr = NULL;
3390 bool active;
3402 3391
3403 buffer_len = min(conn->conn_ops->MaxRecvDataSegmentLength, 3392 buffer_len = min(conn->conn_ops->MaxRecvDataSegmentLength,
3404 SENDTARGETS_BUF_LIMIT); 3393 SENDTARGETS_BUF_LIMIT);
@@ -3452,19 +3441,18 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd,
3452 } 3441 }
3453 3442
3454 spin_lock(&tpg->tpg_state_lock); 3443 spin_lock(&tpg->tpg_state_lock);
3455 if ((tpg->tpg_state == TPG_STATE_FREE) || 3444 active = (tpg->tpg_state == TPG_STATE_ACTIVE);
3456 (tpg->tpg_state == TPG_STATE_INACTIVE)) {
3457 spin_unlock(&tpg->tpg_state_lock);
3458 continue;
3459 }
3460 spin_unlock(&tpg->tpg_state_lock); 3445 spin_unlock(&tpg->tpg_state_lock);
3461 3446
3447 if (!active && tpg->tpg_attrib.tpg_enabled_sendtargets)
3448 continue;
3449
3462 spin_lock(&tpg->tpg_np_lock); 3450 spin_lock(&tpg->tpg_np_lock);
3463 list_for_each_entry(tpg_np, &tpg->tpg_gnp_list, 3451 list_for_each_entry(tpg_np, &tpg->tpg_gnp_list,
3464 tpg_np_list) { 3452 tpg_np_list) {
3465 struct iscsi_np *np = tpg_np->tpg_np; 3453 struct iscsi_np *np = tpg_np->tpg_np;
3466 bool inaddr_any = iscsit_check_inaddr_any(np); 3454 bool inaddr_any = iscsit_check_inaddr_any(np);
3467 char *fmt_str; 3455 struct sockaddr_storage *sockaddr;
3468 3456
3469 if (np->np_network_transport != network_transport) 3457 if (np->np_network_transport != network_transport)
3470 continue; 3458 continue;
@@ -3492,15 +3480,15 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd,
3492 } 3480 }
3493 } 3481 }
3494 3482
3495 if (np->np_sockaddr.ss_family == AF_INET6) 3483 if (inaddr_any)
3496 fmt_str = "TargetAddress=[%s]:%hu,%hu"; 3484 sockaddr = &conn->local_sockaddr;
3497 else 3485 else
3498 fmt_str = "TargetAddress=%s:%hu,%hu"; 3486 sockaddr = &np->np_sockaddr;
3499 3487
3500 len = sprintf(buf, fmt_str, 3488 len = sprintf(buf, "TargetAddress="
3501 inaddr_any ? conn->local_ip : np->np_ip, 3489 "%pISpc,%hu",
3502 np->np_port, 3490 sockaddr,
3503 tpg->tpgt); 3491 tpg->tpgt);
3504 len += 1; 3492 len += 1;
3505 3493
3506 if ((len + payload_len) > buffer_len) { 3494 if ((len + payload_len) > buffer_len) {
@@ -3576,7 +3564,7 @@ iscsit_build_text_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn,
3576 */ 3564 */
3577 cmd->maxcmdsn_inc = 0; 3565 cmd->maxcmdsn_inc = 0;
3578 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); 3566 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3579 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); 3567 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3580 3568
3581 pr_debug("Built Text Response: ITT: 0x%08x, TTT: 0x%08x, StatSN: 0x%08x," 3569 pr_debug("Built Text Response: ITT: 0x%08x, TTT: 0x%08x, StatSN: 0x%08x,"
3582 " Length: %u, CID: %hu F: %d C: %d\n", cmd->init_task_tag, 3570 " Length: %u, CID: %hu F: %d C: %d\n", cmd->init_task_tag,
@@ -3654,7 +3642,7 @@ iscsit_build_reject(struct iscsi_cmd *cmd, struct iscsi_conn *conn,
3654 cmd->stat_sn = conn->stat_sn++; 3642 cmd->stat_sn = conn->stat_sn++;
3655 hdr->statsn = cpu_to_be32(cmd->stat_sn); 3643 hdr->statsn = cpu_to_be32(cmd->stat_sn);
3656 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); 3644 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3657 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); 3645 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3658 3646
3659} 3647}
3660EXPORT_SYMBOL(iscsit_build_reject); 3648EXPORT_SYMBOL(iscsit_build_reject);