diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-11 22:00:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-11 22:00:42 -0400 |
commit | 05c78081d2d8eaf04bf60946fcc53380febf3376 (patch) | |
tree | 0ba735378eb44380c916c075e4fe17d74f3889c5 /drivers/target/iscsi/iscsi_target.c | |
parent | 8e78b7dc93c580c050435b0f88991c26e02166bc (diff) | |
parent | ac64a2ce509104a746321a4f9646b6750cf281eb (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.c | 86 |
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 | ||
271 | bool iscsit_check_np_match( | 271 | bool 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 | */ |
311 | static struct iscsi_np *iscsit_get_np( | 313 | static 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 | ||
342 | struct iscsi_np *iscsit_add_np( | 344 | struct 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 | } |
3660 | EXPORT_SYMBOL(iscsit_build_reject); | 3648 | EXPORT_SYMBOL(iscsit_build_reject); |