Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending

Pull SCSI target fixes from Nicholas Bellinger:
"Here are the outstanding target-pending fixes for v4.9-rc2.

This includes:

- Fix v4.1.y+ reference leak regression with concurrent TMR
ABORT_TASK + session shutdown. (Vaibhav Tandon)

- Enable tcm_fc w/ SCF_USE_CPUID to avoid host exchange timeouts
(Hannes)

- target/user error sense handling fixes. (Andy + MNC + HCH)

- Fix iscsi-target NOP_OUT error path iscsi_cmd descriptor leak
(Varun)

- Two EXTENDED_COPY SCSI status fixes for ESX VAAI (Dinesh Israni +
Nixon Vincent)

- Revert a v4.8 residual overflow change, that breaks sg_inq with
small allocation lengths.

There are a number of folks stress testing the v4.1.y regression fix
in their environments, and more folks doing iser-target I/O stress
testing atop recent v4.x.y code.

There is also one v4.2.y+ RCU conversion regression related to
explicit NodeACL configfs changes, that is still being tracked down"

* git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending:
target/tcm_fc: use CPU affinity for responses
target/tcm_fc: Update debugging statements to match libfc usage
target/tcm_fc: return detailed error in ft_sess_create()
target/tcm_fc: print command pointer in debug message
target: fix potential race window in target_sess_cmd_list_waiting()
Revert "target: Fix residual overflow handling in target_complete_cmd_with_length"
target: Don't override EXTENDED_COPY xcopy_pt_cmd SCSI status code
target: Make EXTENDED_COPY 0xe4 failure return COPY TARGET DEVICE NOT REACHABLE
target: Re-add missing SCF_ACK_KREF assignment in v4.1.y
iscsi-target: fix iscsi cmd leak
iscsi-target: fix spelling mistake "Unsolicitied" -> "Unsolicited"
target/user: Fix comments to not refer to data ring
target/user: Return an error if cmd data size is too large
target/user: Use sense_reason_t in tcmu_queue_cmd_ring

+105 -75
+5 -1
drivers/target/iscsi/iscsi_target.c
··· 1804 1804 * Otherwise, initiator is not expecting a NOPIN is response. 1805 1805 * Just ignore for now. 1806 1806 */ 1807 + 1808 + if (cmd) 1809 + iscsit_free_cmd(cmd, false); 1810 + 1807 1811 return 0; 1808 1812 } 1809 1813 EXPORT_SYMBOL(iscsit_process_nop_out); ··· 2986 2982 2987 2983 pr_debug("Built NOPIN %s Response ITT: 0x%08x, TTT: 0x%08x," 2988 2984 " StatSN: 0x%08x, Length %u\n", (nopout_response) ? 2989 - "Solicitied" : "Unsolicitied", cmd->init_task_tag, 2985 + "Solicited" : "Unsolicited", cmd->init_task_tag, 2990 2986 cmd->targ_xfer_tag, cmd->stat_sn, cmd->buf_ptr_size); 2991 2987 } 2992 2988 EXPORT_SYMBOL(iscsit_build_nopin_rsp);
+2 -2
drivers/target/iscsi/iscsi_target_login.c
··· 434 434 435 435 /* 436 436 * Make MaxRecvDataSegmentLength PAGE_SIZE aligned for 437 - * Immediate Data + Unsolicitied Data-OUT if necessary.. 437 + * Immediate Data + Unsolicited Data-OUT if necessary.. 438 438 */ 439 439 param = iscsi_find_param_from_key("MaxRecvDataSegmentLength", 440 440 conn->param_list); ··· 646 646 { 647 647 struct iscsi_session *sess = conn->sess; 648 648 /* 649 - * FIXME: Unsolicitied NopIN support for ISER 649 + * FIXME: Unsolicited NopIN support for ISER 650 650 */ 651 651 if (conn->conn_transport->transport_type == ISCSI_INFINIBAND) 652 652 return;
+19 -20
drivers/target/target_core_transport.c
··· 754 754 755 755 void target_complete_cmd_with_length(struct se_cmd *cmd, u8 scsi_status, int length) 756 756 { 757 - if (scsi_status != SAM_STAT_GOOD) { 758 - return; 759 - } 760 - 761 - /* 762 - * Calculate new residual count based upon length of SCSI data 763 - * transferred. 764 - */ 765 - if (length < cmd->data_length) { 757 + if (scsi_status == SAM_STAT_GOOD && length < cmd->data_length) { 766 758 if (cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) { 767 759 cmd->residual_count += cmd->data_length - length; 768 760 } else { ··· 763 771 } 764 772 765 773 cmd->data_length = length; 766 - } else if (length > cmd->data_length) { 767 - cmd->se_cmd_flags |= SCF_OVERFLOW_BIT; 768 - cmd->residual_count = length - cmd->data_length; 769 - } else { 770 - cmd->se_cmd_flags &= ~(SCF_OVERFLOW_BIT | SCF_UNDERFLOW_BIT); 771 - cmd->residual_count = 0; 772 774 } 773 775 774 776 target_complete_cmd(cmd, scsi_status); ··· 1692 1706 case TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED: 1693 1707 case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED: 1694 1708 case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED: 1709 + case TCM_COPY_TARGET_DEVICE_NOT_REACHABLE: 1695 1710 break; 1696 1711 case TCM_OUT_OF_RESOURCES: 1697 1712 sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; ··· 2534 2547 * fabric acknowledgement that requires two target_put_sess_cmd() 2535 2548 * invocations before se_cmd descriptor release. 2536 2549 */ 2537 - if (ack_kref) 2538 - kref_get(&se_cmd->cmd_kref); 2550 + if (ack_kref) { 2551 + if (!kref_get_unless_zero(&se_cmd->cmd_kref)) 2552 + return -EINVAL; 2553 + 2554 + se_cmd->se_cmd_flags |= SCF_ACK_KREF; 2555 + } 2539 2556 2540 2557 spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); 2541 2558 if (se_sess->sess_tearing_down) { ··· 2618 2627 */ 2619 2628 void target_sess_cmd_list_set_waiting(struct se_session *se_sess) 2620 2629 { 2621 - struct se_cmd *se_cmd; 2630 + struct se_cmd *se_cmd, *tmp_cmd; 2622 2631 unsigned long flags; 2623 2632 int rc; 2624 2633 ··· 2630 2639 se_sess->sess_tearing_down = 1; 2631 2640 list_splice_init(&se_sess->sess_cmd_list, &se_sess->sess_wait_list); 2632 2641 2633 - list_for_each_entry(se_cmd, &se_sess->sess_wait_list, se_cmd_list) { 2642 + list_for_each_entry_safe(se_cmd, tmp_cmd, 2643 + &se_sess->sess_wait_list, se_cmd_list) { 2634 2644 rc = kref_get_unless_zero(&se_cmd->cmd_kref); 2635 2645 if (rc) { 2636 2646 se_cmd->cmd_wait_set = 1; 2637 2647 spin_lock(&se_cmd->t_state_lock); 2638 2648 se_cmd->transport_state |= CMD_T_FABRIC_STOP; 2639 2649 spin_unlock(&se_cmd->t_state_lock); 2640 - } 2650 + } else 2651 + list_del_init(&se_cmd->se_cmd_list); 2641 2652 } 2642 2653 2643 2654 spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); ··· 2863 2870 .asc = 0x10, 2864 2871 .ascq = 0x03, /* LOGICAL BLOCK REFERENCE TAG CHECK FAILED */ 2865 2872 .add_sector_info = true, 2873 + }, 2874 + [TCM_COPY_TARGET_DEVICE_NOT_REACHABLE] = { 2875 + .key = COPY_ABORTED, 2876 + .asc = 0x0d, 2877 + .ascq = 0x02, /* COPY TARGET DEVICE NOT REACHABLE */ 2878 + 2866 2879 }, 2867 2880 [TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE] = { 2868 2881 /*
+21 -29
drivers/target/target_core_user.c
··· 96 96 size_t dev_size; 97 97 u32 cmdr_size; 98 98 u32 cmdr_last_cleaned; 99 - /* Offset of data ring from start of mb */ 99 + /* Offset of data area from start of mb */ 100 100 /* Must add data_off and mb_addr to get the address */ 101 101 size_t data_off; 102 102 size_t data_size; ··· 349 349 350 350 /* 351 351 * We can't queue a command until we have space available on the cmd ring *and* 352 - * space available on the data ring. 352 + * space available on the data area. 353 353 * 354 354 * Called with ring lock held. 355 355 */ ··· 389 389 return true; 390 390 } 391 391 392 - static int tcmu_queue_cmd_ring(struct tcmu_cmd *tcmu_cmd) 392 + static sense_reason_t 393 + tcmu_queue_cmd_ring(struct tcmu_cmd *tcmu_cmd) 393 394 { 394 395 struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; 395 396 struct se_cmd *se_cmd = tcmu_cmd->se_cmd; ··· 406 405 DECLARE_BITMAP(old_bitmap, DATA_BLOCK_BITS); 407 406 408 407 if (test_bit(TCMU_DEV_BIT_BROKEN, &udev->flags)) 409 - return -EINVAL; 408 + return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 410 409 411 410 /* 412 411 * Must be a certain minimum size for response sense info, but ··· 433 432 BUG_ON(!(se_cmd->t_bidi_data_sg && se_cmd->t_bidi_data_nents)); 434 433 data_length += se_cmd->t_bidi_data_sg->length; 435 434 } 436 - if ((command_size > (udev->cmdr_size / 2)) 437 - || data_length > udev->data_size) 438 - pr_warn("TCMU: Request of size %zu/%zu may be too big for %u/%zu " 439 - "cmd/data ring buffers\n", command_size, data_length, 435 + if ((command_size > (udev->cmdr_size / 2)) || 436 + data_length > udev->data_size) { 437 + pr_warn("TCMU: Request of size %zu/%zu is too big for %u/%zu " 438 + "cmd ring/data area\n", command_size, data_length, 440 439 udev->cmdr_size, udev->data_size); 440 + spin_unlock_irq(&udev->cmdr_lock); 441 + return TCM_INVALID_CDB_FIELD; 442 + } 441 443 442 444 while (!is_ring_space_avail(udev, command_size, data_length)) { 443 445 int ret; ··· 454 450 finish_wait(&udev->wait_cmdr, &__wait); 455 451 if (!ret) { 456 452 pr_warn("tcmu: command timed out\n"); 457 - return -ETIMEDOUT; 453 + return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 458 454 } 459 455 460 456 spin_lock_irq(&udev->cmdr_lock); ··· 491 487 492 488 bitmap_copy(old_bitmap, udev->data_bitmap, DATA_BLOCK_BITS); 493 489 494 - /* 495 - * Fix up iovecs, and handle if allocation in data ring wrapped. 496 - */ 490 + /* Handle allocating space from the data area */ 497 491 iov = &entry->req.iov[0]; 498 492 iov_cnt = 0; 499 493 copy_to_data_area = (se_cmd->data_direction == DMA_TO_DEVICE ··· 528 526 mod_timer(&udev->timeout, 529 527 round_jiffies_up(jiffies + msecs_to_jiffies(TCMU_TIME_OUT))); 530 528 531 - return 0; 529 + return TCM_NO_SENSE; 532 530 } 533 531 534 - static int tcmu_queue_cmd(struct se_cmd *se_cmd) 532 + static sense_reason_t 533 + tcmu_queue_cmd(struct se_cmd *se_cmd) 535 534 { 536 535 struct se_device *se_dev = se_cmd->se_dev; 537 536 struct tcmu_dev *udev = TCMU_DEV(se_dev); ··· 541 538 542 539 tcmu_cmd = tcmu_alloc_cmd(se_cmd); 543 540 if (!tcmu_cmd) 544 - return -ENOMEM; 541 + return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 545 542 546 543 ret = tcmu_queue_cmd_ring(tcmu_cmd); 547 - if (ret < 0) { 544 + if (ret != TCM_NO_SENSE) { 548 545 pr_err("TCMU: Could not queue command\n"); 549 546 spin_lock_irq(&udev->commands_lock); 550 547 idr_remove(&udev->commands, tcmu_cmd->cmd_id); ··· 564 561 if (test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) { 565 562 /* 566 563 * cmd has been completed already from timeout, just reclaim 567 - * data ring space and free cmd 564 + * data area space and free cmd 568 565 */ 569 566 free_data_area(udev, cmd); 570 567 ··· 1132 1129 } 1133 1130 1134 1131 static sense_reason_t 1135 - tcmu_pass_op(struct se_cmd *se_cmd) 1136 - { 1137 - int ret = tcmu_queue_cmd(se_cmd); 1138 - 1139 - if (ret != 0) 1140 - return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 1141 - else 1142 - return TCM_NO_SENSE; 1143 - } 1144 - 1145 - static sense_reason_t 1146 1132 tcmu_parse_cdb(struct se_cmd *cmd) 1147 1133 { 1148 - return passthrough_parse_cdb(cmd, tcmu_pass_op); 1134 + return passthrough_parse_cdb(cmd, tcmu_queue_cmd); 1149 1135 } 1150 1136 1151 1137 static const struct target_backend_ops tcmu_ops = {
+26 -8
drivers/target/target_core_xcopy.c
··· 104 104 } 105 105 mutex_unlock(&g_device_mutex); 106 106 107 - pr_err("Unable to locate 0xe4 descriptor for EXTENDED_COPY\n"); 107 + pr_debug_ratelimited("Unable to locate 0xe4 descriptor for EXTENDED_COPY\n"); 108 108 return -EINVAL; 109 109 } 110 110 ··· 185 185 186 186 static int target_xcopy_parse_target_descriptors(struct se_cmd *se_cmd, 187 187 struct xcopy_op *xop, unsigned char *p, 188 - unsigned short tdll) 188 + unsigned short tdll, sense_reason_t *sense_ret) 189 189 { 190 190 struct se_device *local_dev = se_cmd->se_dev; 191 191 unsigned char *desc = p; 192 192 int offset = tdll % XCOPY_TARGET_DESC_LEN, rc, ret = 0; 193 193 unsigned short start = 0; 194 194 bool src = true; 195 + 196 + *sense_ret = TCM_INVALID_PARAMETER_LIST; 195 197 196 198 if (offset != 0) { 197 199 pr_err("XCOPY target descriptor list length is not" ··· 245 243 rc = target_xcopy_locate_se_dev_e4(se_cmd, xop, true); 246 244 else 247 245 rc = target_xcopy_locate_se_dev_e4(se_cmd, xop, false); 248 - 249 - if (rc < 0) 246 + /* 247 + * If a matching IEEE NAA 0x83 descriptor for the requested device 248 + * is not located on this node, return COPY_ABORTED with ASQ/ASQC 249 + * 0x0d/0x02 - COPY_TARGET_DEVICE_NOT_REACHABLE to request the 250 + * initiator to fall back to normal copy method. 251 + */ 252 + if (rc < 0) { 253 + *sense_ret = TCM_COPY_TARGET_DEVICE_NOT_REACHABLE; 250 254 goto out; 255 + } 251 256 252 257 pr_debug("XCOPY TGT desc: Source dev: %p NAA IEEE WWN: 0x%16phN\n", 253 258 xop->src_dev, &xop->src_tid_wwn[0]); ··· 662 653 rc = target_xcopy_setup_pt_cmd(xpt_cmd, xop, src_dev, &cdb[0], 663 654 remote_port, true); 664 655 if (rc < 0) { 656 + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status; 665 657 transport_generic_free_cmd(se_cmd, 0); 666 658 return rc; 667 659 } ··· 674 664 675 665 rc = target_xcopy_issue_pt_cmd(xpt_cmd); 676 666 if (rc < 0) { 667 + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status; 677 668 transport_generic_free_cmd(se_cmd, 0); 678 669 return rc; 679 670 } ··· 725 714 remote_port, false); 726 715 if (rc < 0) { 727 716 struct se_cmd *src_cmd = &xop->src_pt_cmd->se_cmd; 717 + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status; 728 718 /* 729 719 * If the failure happened before the t_mem_list hand-off in 730 720 * target_xcopy_setup_pt_cmd(), Reset memory + clear flag so that ··· 741 729 742 730 rc = target_xcopy_issue_pt_cmd(xpt_cmd); 743 731 if (rc < 0) { 732 + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status; 744 733 se_cmd->se_cmd_flags &= ~SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC; 745 734 transport_generic_free_cmd(se_cmd, 0); 746 735 return rc; ··· 828 815 out: 829 816 xcopy_pt_undepend_remotedev(xop); 830 817 kfree(xop); 831 - 832 - pr_warn("target_xcopy_do_work: Setting X-COPY CHECK_CONDITION -> sending response\n"); 833 - ec_cmd->scsi_status = SAM_STAT_CHECK_CONDITION; 818 + /* 819 + * Don't override an error scsi status if it has already been set 820 + */ 821 + if (ec_cmd->scsi_status == SAM_STAT_GOOD) { 822 + pr_warn_ratelimited("target_xcopy_do_work: rc: %d, Setting X-COPY" 823 + " CHECK_CONDITION -> sending response\n", rc); 824 + ec_cmd->scsi_status = SAM_STAT_CHECK_CONDITION; 825 + } 834 826 target_complete_cmd(ec_cmd, SAM_STAT_CHECK_CONDITION); 835 827 } 836 828 ··· 893 875 " tdll: %hu sdll: %u inline_dl: %u\n", list_id, list_id_usage, 894 876 tdll, sdll, inline_dl); 895 877 896 - rc = target_xcopy_parse_target_descriptors(se_cmd, xop, &p[16], tdll); 878 + rc = target_xcopy_parse_target_descriptors(se_cmd, xop, &p[16], tdll, &ret); 897 879 if (rc <= 0) 898 880 goto out; 899 881
+2 -2
drivers/target/tcm_fc/tfc_cmd.c
··· 572 572 if (target_submit_cmd(&cmd->se_cmd, cmd->sess->se_sess, fcp->fc_cdb, 573 573 &cmd->ft_sense_buffer[0], scsilun_to_int(&fcp->fc_lun), 574 574 ntohl(fcp->fc_dl), task_attr, data_dir, 575 - TARGET_SCF_ACK_KREF)) 575 + TARGET_SCF_ACK_KREF | TARGET_SCF_USE_CPUID)) 576 576 goto err; 577 577 578 - pr_debug("r_ctl %x alloc target_submit_cmd\n", fh->fh_r_ctl); 578 + pr_debug("r_ctl %x target_submit_cmd %p\n", fh->fh_r_ctl, cmd); 579 579 return; 580 580 581 581 err:
+29 -13
drivers/target/tcm_fc/tfc_sess.c
··· 39 39 40 40 #include "tcm_fc.h" 41 41 42 + #define TFC_SESS_DBG(lport, fmt, args...) \ 43 + pr_debug("host%u: rport %6.6x: " fmt, \ 44 + (lport)->host->host_no, \ 45 + (lport)->port_id, ##args ) 46 + 42 47 static void ft_sess_delete_all(struct ft_tport *); 43 48 44 49 /* ··· 172 167 struct ft_tport *tport; 173 168 struct hlist_head *head; 174 169 struct ft_sess *sess; 170 + char *reason = "no session created"; 175 171 176 172 rcu_read_lock(); 177 173 tport = rcu_dereference(lport->prov[FC_TYPE_FCP]); 178 - if (!tport) 174 + if (!tport) { 175 + reason = "not an FCP port"; 179 176 goto out; 177 + } 180 178 181 179 head = &tport->hash[ft_sess_hash(port_id)]; 182 180 hlist_for_each_entry_rcu(sess, head, hash) { 183 181 if (sess->port_id == port_id) { 184 182 kref_get(&sess->kref); 185 183 rcu_read_unlock(); 186 - pr_debug("port_id %x found %p\n", port_id, sess); 184 + TFC_SESS_DBG(lport, "port_id %x found %p\n", 185 + port_id, sess); 187 186 return sess; 188 187 } 189 188 } 190 189 out: 191 190 rcu_read_unlock(); 192 - pr_debug("port_id %x not found\n", port_id); 191 + TFC_SESS_DBG(lport, "port_id %x not found, %s\n", 192 + port_id, reason); 193 193 return NULL; 194 194 } 195 195 ··· 205 195 struct ft_tport *tport = sess->tport; 206 196 struct hlist_head *head = &tport->hash[ft_sess_hash(sess->port_id)]; 207 197 208 - pr_debug("port_id %x sess %p\n", sess->port_id, sess); 198 + TFC_SESS_DBG(tport->lport, "port_id %x sess %p\n", sess->port_id, sess); 209 199 hlist_add_head_rcu(&sess->hash, head); 210 200 tport->sess_count++; 211 201 ··· 233 223 234 224 sess = kzalloc(sizeof(*sess), GFP_KERNEL); 235 225 if (!sess) 236 - return NULL; 226 + return ERR_PTR(-ENOMEM); 237 227 238 228 kref_init(&sess->kref); /* ref for table entry */ 239 229 sess->tport = tport; ··· 244 234 TARGET_PROT_NORMAL, &initiatorname[0], 245 235 sess, ft_sess_alloc_cb); 246 236 if (IS_ERR(sess->se_sess)) { 237 + int rc = PTR_ERR(sess->se_sess); 247 238 kfree(sess); 248 - return NULL; 239 + sess = ERR_PTR(rc); 249 240 } 250 241 return sess; 251 242 } ··· 330 319 mutex_unlock(&ft_lport_lock); 331 320 return; 332 321 } 333 - pr_debug("port_id %x\n", port_id); 322 + TFC_SESS_DBG(sess->tport->lport, "port_id %x close session\n", port_id); 334 323 ft_sess_unhash(sess); 335 324 mutex_unlock(&ft_lport_lock); 336 325 ft_close_sess(sess); ··· 390 379 if (!(fcp_parm & FCP_SPPF_INIT_FCN)) 391 380 return FC_SPP_RESP_CONF; 392 381 sess = ft_sess_create(tport, rdata->ids.port_id, rdata); 393 - if (!sess) 394 - return FC_SPP_RESP_RES; 382 + if (IS_ERR(sess)) { 383 + if (PTR_ERR(sess) == -EACCES) { 384 + spp->spp_flags &= ~FC_SPP_EST_IMG_PAIR; 385 + return FC_SPP_RESP_CONF; 386 + } else 387 + return FC_SPP_RESP_RES; 388 + } 395 389 if (!sess->params) 396 390 rdata->prli_count++; 397 391 sess->params = fcp_parm; ··· 439 423 mutex_lock(&ft_lport_lock); 440 424 ret = ft_prli_locked(rdata, spp_len, rspp, spp); 441 425 mutex_unlock(&ft_lport_lock); 442 - pr_debug("port_id %x flags %x ret %x\n", 443 - rdata->ids.port_id, rspp ? rspp->spp_flags : 0, ret); 426 + TFC_SESS_DBG(rdata->local_port, "port_id %x flags %x ret %x\n", 427 + rdata->ids.port_id, rspp ? rspp->spp_flags : 0, ret); 444 428 return ret; 445 429 } 446 430 ··· 493 477 struct ft_sess *sess; 494 478 u32 sid = fc_frame_sid(fp); 495 479 496 - pr_debug("sid %x\n", sid); 480 + TFC_SESS_DBG(lport, "recv sid %x\n", sid); 497 481 498 482 sess = ft_sess_get(lport, sid); 499 483 if (!sess) { 500 - pr_debug("sid %x sess lookup failed\n", sid); 484 + TFC_SESS_DBG(lport, "sid %x sess lookup failed\n", sid); 501 485 /* TBD XXX - if FCP_CMND, send PRLO */ 502 486 fc_frame_free(fp); 503 487 return;
+1
include/target/target_core_base.h
··· 177 177 TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED = R(0x15), 178 178 TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED = R(0x16), 179 179 TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED = R(0x17), 180 + TCM_COPY_TARGET_DEVICE_NOT_REACHABLE = R(0x18), 180 181 #undef R 181 182 }; 182 183