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

target: Simplify fabric sense data length handling

Every fabric driver has to supply a se_tfo->set_fabric_sense_len()
method, just so iSCSI can return an offset of 2. However, every fabric
driver is already allocating a sense buffer and passing it into the
target core, either via transport_init_se_cmd() or target_submit_cmd().

So instead of having iSCSI pass the start of its sense buffer into the
core and then later tell the core to skip the first 2 bytes, it seems
easier for iSCSI just to do the offset of 2 when it passes the sense
buffer into the core. Then we can drop the se_tfo->set_fabric_sense_len()
everywhere, and just add a couple of lines of code to iSCSI to set the
sense data length to the beginning of the buffer right before it sends
it over the network.

(nab: Remove .set_fabric_sense_len usage from tcm_qla2xxx_npiv_ops +
change transport_get_sense_buffer to follow v3.6-rc6 code w/o
->set_fabric_sense_len usage)

Signed-off-by: Roland Dreier <roland@purestorage.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>

authored by

Roland Dreier and committed by
Nicholas Bellinger
9c58b7dd 2ed772b7

+79 -163
-8
Documentation/target/tcm_mod_builder.py
··· 402 402 buf += " .queue_data_in = " + fabric_mod_name + "_queue_data_in,\n" 403 403 buf += " .queue_status = " + fabric_mod_name + "_queue_status,\n" 404 404 buf += " .queue_tm_rsp = " + fabric_mod_name + "_queue_tm_rsp,\n" 405 - buf += " .set_fabric_sense_len = " + fabric_mod_name + "_set_fabric_sense_len,\n" 406 405 buf += " .is_state_remove = " + fabric_mod_name + "_is_state_remove,\n" 407 406 buf += " /*\n" 408 407 buf += " * Setup function pointers for generic logic in target_core_fabric_configfs.c\n" ··· 903 904 buf += " return 0;\n" 904 905 buf += "}\n\n" 905 906 bufi += "int " + fabric_mod_name + "_queue_tm_rsp(struct se_cmd *);\n" 906 - 907 - if re.search('set_fabric_sense_len\)\(', fo): 908 - buf += "u16 " + fabric_mod_name + "_set_fabric_sense_len(struct se_cmd *se_cmd, u32 sense_length)\n" 909 - buf += "{\n" 910 - buf += " return 0;\n" 911 - buf += "}\n\n" 912 - bufi += "u16 " + fabric_mod_name + "_set_fabric_sense_len(struct se_cmd *, u32);\n" 913 907 914 908 if re.search('is_state_remove\)\(', fo): 915 909 buf += "int " + fabric_mod_name + "_is_state_remove(struct se_cmd *se_cmd)\n"
-6
drivers/infiniband/ulp/srpt/ib_srpt.c
··· 3564 3564 return srpt_get_cmd_state(ioctx); 3565 3565 } 3566 3566 3567 - static u16 srpt_set_fabric_sense_len(struct se_cmd *cmd, u32 sense_length) 3568 - { 3569 - return 0; 3570 - } 3571 - 3572 3567 /** 3573 3568 * srpt_parse_i_port_id() - Parse an initiator port ID. 3574 3569 * @name: ASCII representation of a 128-bit initiator port ID. ··· 3943 3948 .queue_data_in = srpt_queue_response, 3944 3949 .queue_status = srpt_queue_status, 3945 3950 .queue_tm_rsp = srpt_queue_response, 3946 - .set_fabric_sense_len = srpt_set_fabric_sense_len, 3947 3951 /* 3948 3952 * Setup function pointers for generic logic in 3949 3953 * target_core_fabric_configfs.c
-8
drivers/scsi/qla2xxx/tcm_qla2xxx.c
··· 735 735 return 0; 736 736 } 737 737 738 - static u16 tcm_qla2xxx_set_fabric_sense_len(struct se_cmd *se_cmd, 739 - u32 sense_length) 740 - { 741 - return 0; 742 - } 743 - 744 738 /* Local pointer to allocated TCM configfs fabric module */ 745 739 struct target_fabric_configfs *tcm_qla2xxx_fabric_configfs; 746 740 struct target_fabric_configfs *tcm_qla2xxx_npiv_fabric_configfs; ··· 1680 1686 .queue_data_in = tcm_qla2xxx_queue_data_in, 1681 1687 .queue_status = tcm_qla2xxx_queue_status, 1682 1688 .queue_tm_rsp = tcm_qla2xxx_queue_tm_rsp, 1683 - .set_fabric_sense_len = tcm_qla2xxx_set_fabric_sense_len, 1684 1689 /* 1685 1690 * Setup function pointers for generic logic in 1686 1691 * target_core_fabric_configfs.c ··· 1727 1734 .queue_data_in = tcm_qla2xxx_queue_data_in, 1728 1735 .queue_status = tcm_qla2xxx_queue_status, 1729 1736 .queue_tm_rsp = tcm_qla2xxx_queue_tm_rsp, 1730 - .set_fabric_sense_len = tcm_qla2xxx_set_fabric_sense_len, 1731 1737 /* 1732 1738 * Setup function pointers for generic logic in 1733 1739 * target_core_fabric_configfs.c
+8 -5
drivers/target/iscsi/iscsi_target.c
··· 953 953 */ 954 954 transport_init_se_cmd(&cmd->se_cmd, &lio_target_fabric_configfs->tf_ops, 955 955 conn->sess->se_sess, hdr->data_length, cmd->data_direction, 956 - sam_task_attr, &cmd->sense_buffer[0]); 956 + sam_task_attr, cmd->sense_buffer + 2); 957 957 958 958 pr_debug("Got SCSI Command, ITT: 0x%08x, CmdSN: 0x%08x," 959 959 " ExpXferLen: %u, Length: %u, CID: %hu\n", hdr->itt, ··· 1700 1700 transport_init_se_cmd(&cmd->se_cmd, 1701 1701 &lio_target_fabric_configfs->tf_ops, 1702 1702 conn->sess->se_sess, 0, DMA_NONE, 1703 - MSG_SIMPLE_TAG, &cmd->sense_buffer[0]); 1703 + MSG_SIMPLE_TAG, cmd->sense_buffer + 2); 1704 1704 1705 1705 switch (function) { 1706 1706 case ISCSI_TM_FUNC_ABORT_TASK: ··· 3092 3092 if (cmd->se_cmd.sense_buffer && 3093 3093 ((cmd->se_cmd.se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) || 3094 3094 (cmd->se_cmd.se_cmd_flags & SCF_EMULATED_TASK_SENSE))) { 3095 + put_unaligned_be16(cmd->se_cmd.scsi_sense_length, cmd->sense_buffer); 3096 + cmd->se_cmd.scsi_sense_length += sizeof (__be16); 3097 + 3095 3098 padding = -(cmd->se_cmd.scsi_sense_length) & 3; 3096 3099 hton24(hdr->dlength, cmd->se_cmd.scsi_sense_length); 3097 - iov[iov_count].iov_base = cmd->se_cmd.sense_buffer; 3100 + iov[iov_count].iov_base = cmd->sense_buffer; 3098 3101 iov[iov_count++].iov_len = 3099 3102 (cmd->se_cmd.scsi_sense_length + padding); 3100 3103 tx_size += cmd->se_cmd.scsi_sense_length; 3101 3104 3102 3105 if (padding) { 3103 - memset(cmd->se_cmd.sense_buffer + 3106 + memset(cmd->sense_buffer + 3104 3107 cmd->se_cmd.scsi_sense_length, 0, padding); 3105 3108 tx_size += padding; 3106 3109 pr_debug("Adding %u bytes of padding to" ··· 3112 3109 3113 3110 if (conn->conn_ops->DataDigest) { 3114 3111 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, 3115 - cmd->se_cmd.sense_buffer, 3112 + cmd->sense_buffer, 3116 3113 (cmd->se_cmd.scsi_sense_length + padding), 3117 3114 0, NULL, (u8 *)&cmd->data_crc); 3118 3115
-16
drivers/target/iscsi/iscsi_target_configfs.c
··· 1542 1542 return 0; 1543 1543 } 1544 1544 1545 - static u16 lio_set_fabric_sense_len(struct se_cmd *se_cmd, u32 sense_length) 1546 - { 1547 - unsigned char *buffer = se_cmd->sense_buffer; 1548 - /* 1549 - * From RFC-3720 10.4.7. Data Segment - Sense and Response Data Segment 1550 - * 16-bit SenseLength. 1551 - */ 1552 - buffer[0] = ((sense_length >> 8) & 0xff); 1553 - buffer[1] = (sense_length & 0xff); 1554 - /* 1555 - * Return two byte offset into allocated sense_buffer. 1556 - */ 1557 - return 2; 1558 - } 1559 - 1560 1545 static int lio_queue_tm_rsp(struct se_cmd *se_cmd) 1561 1546 { 1562 1547 struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); ··· 1725 1740 fabric->tf_ops.queue_data_in = &lio_queue_data_in; 1726 1741 fabric->tf_ops.queue_status = &lio_queue_status; 1727 1742 fabric->tf_ops.queue_tm_rsp = &lio_queue_tm_rsp; 1728 - fabric->tf_ops.set_fabric_sense_len = &lio_set_fabric_sense_len; 1729 1743 /* 1730 1744 * Setup function pointers for generic logic in target_core_fabric_configfs.c 1731 1745 */
-6
drivers/target/loopback/tcm_loop.c
··· 846 846 return 0; 847 847 } 848 848 849 - static u16 tcm_loop_set_fabric_sense_len(struct se_cmd *se_cmd, u32 sense_length) 850 - { 851 - return 0; 852 - } 853 - 854 849 static char *tcm_loop_dump_proto_id(struct tcm_loop_hba *tl_hba) 855 850 { 856 851 switch (tl_hba->tl_proto_id) { ··· 1363 1368 fabric->tf_ops.queue_data_in = &tcm_loop_queue_data_in; 1364 1369 fabric->tf_ops.queue_status = &tcm_loop_queue_status; 1365 1370 fabric->tf_ops.queue_tm_rsp = &tcm_loop_queue_tm_rsp; 1366 - fabric->tf_ops.set_fabric_sense_len = &tcm_loop_set_fabric_sense_len; 1367 1371 1368 1372 /* 1369 1373 * Setup function pointers for generic logic in target_core_fabric_configfs.c
-6
drivers/target/sbp/sbp_target.c
··· 1847 1847 return 0; 1848 1848 } 1849 1849 1850 - static u16 sbp_set_fabric_sense_len(struct se_cmd *se_cmd, u32 sense_length) 1851 - { 1852 - return 0; 1853 - } 1854 - 1855 1850 static int sbp_check_stop_free(struct se_cmd *se_cmd) 1856 1851 { 1857 1852 struct sbp_target_request *req = container_of(se_cmd, ··· 2524 2529 .queue_data_in = sbp_queue_data_in, 2525 2530 .queue_status = sbp_queue_status, 2526 2531 .queue_tm_rsp = sbp_queue_tm_rsp, 2527 - .set_fabric_sense_len = sbp_set_fabric_sense_len, 2528 2532 .check_stop_free = sbp_check_stop_free, 2529 2533 2530 2534 .fabric_make_wwn = sbp_make_tport,
-4
drivers/target/target_core_configfs.c
··· 457 457 pr_err("Missing tfo->queue_tm_rsp()\n"); 458 458 return -EINVAL; 459 459 } 460 - if (!tfo->set_fabric_sense_len) { 461 - pr_err("Missing tfo->set_fabric_sense_len()\n"); 462 - return -EINVAL; 463 - } 464 460 /* 465 461 * We at least require tfo->fabric_make_wwn(), tfo->fabric_drop_wwn() 466 462 * tfo->fabric_make_tpg() and tfo->fabric_drop_tpg() in
+71 -84
drivers/target/target_core_transport.c
··· 567 567 */ 568 568 static unsigned char *transport_get_sense_buffer(struct se_cmd *cmd) 569 569 { 570 - unsigned char *buffer = cmd->sense_buffer; 571 570 struct se_device *dev = cmd->se_dev; 572 - u32 offset = 0; 573 571 574 572 WARN_ON(!cmd->se_lun); 575 573 ··· 577 579 if (cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) 578 580 return NULL; 579 581 580 - offset = cmd->se_tfo->set_fabric_sense_len(cmd, TRANSPORT_SENSE_BUFFER); 581 - 582 - /* Automatically padded */ 583 - cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER + offset; 582 + cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER; 584 583 585 584 pr_debug("HBA_[%u]_PLUG[%s]: Requesting sense for SAM STATUS: 0x%02x\n", 586 585 dev->se_hba->hba_id, dev->transport->name, cmd->scsi_status); 587 - return &buffer[offset]; 586 + return cmd->sense_buffer; 588 587 } 589 588 590 589 void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status) ··· 2799 2804 { 2800 2805 unsigned char *buffer = cmd->sense_buffer; 2801 2806 unsigned long flags; 2802 - int offset; 2803 2807 u8 asc = 0, ascq = 0; 2804 2808 2805 2809 spin_lock_irqsave(&cmd->t_state_lock, flags); ··· 2814 2820 2815 2821 if (!from_transport) 2816 2822 cmd->se_cmd_flags |= SCF_EMULATED_TASK_SENSE; 2817 - /* 2818 - * Data Segment and SenseLength of the fabric response PDU. 2819 - * 2820 - * TRANSPORT_SENSE_BUFFER is now set to SCSI_SENSE_BUFFERSIZE 2821 - * from include/scsi/scsi_cmnd.h 2822 - */ 2823 - offset = cmd->se_tfo->set_fabric_sense_len(cmd, 2824 - TRANSPORT_SENSE_BUFFER); 2823 + 2825 2824 /* 2826 2825 * Actual SENSE DATA, see SPC-3 7.23.2 SPC_SENSE_KEY_OFFSET uses 2827 2826 * SENSE KEY values from include/scsi/scsi.h ··· 2822 2835 switch (reason) { 2823 2836 case TCM_NON_EXISTENT_LUN: 2824 2837 /* CURRENT ERROR */ 2825 - buffer[offset] = 0x70; 2826 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2838 + buffer[0] = 0x70; 2839 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2827 2840 /* ILLEGAL REQUEST */ 2828 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2841 + buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2829 2842 /* LOGICAL UNIT NOT SUPPORTED */ 2830 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x25; 2843 + buffer[SPC_ASC_KEY_OFFSET] = 0x25; 2831 2844 break; 2832 2845 case TCM_UNSUPPORTED_SCSI_OPCODE: 2833 2846 case TCM_SECTOR_COUNT_TOO_MANY: 2834 2847 /* CURRENT ERROR */ 2835 - buffer[offset] = 0x70; 2836 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2848 + buffer[0] = 0x70; 2849 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2837 2850 /* ILLEGAL REQUEST */ 2838 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2851 + buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2839 2852 /* INVALID COMMAND OPERATION CODE */ 2840 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x20; 2853 + buffer[SPC_ASC_KEY_OFFSET] = 0x20; 2841 2854 break; 2842 2855 case TCM_UNKNOWN_MODE_PAGE: 2843 2856 /* CURRENT ERROR */ 2844 - buffer[offset] = 0x70; 2845 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2857 + buffer[0] = 0x70; 2858 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2846 2859 /* ILLEGAL REQUEST */ 2847 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2860 + buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2848 2861 /* INVALID FIELD IN CDB */ 2849 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x24; 2862 + buffer[SPC_ASC_KEY_OFFSET] = 0x24; 2850 2863 break; 2851 2864 case TCM_CHECK_CONDITION_ABORT_CMD: 2852 2865 /* CURRENT ERROR */ 2853 - buffer[offset] = 0x70; 2854 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2866 + buffer[0] = 0x70; 2867 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2855 2868 /* ABORTED COMMAND */ 2856 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2869 + buffer[SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2857 2870 /* BUS DEVICE RESET FUNCTION OCCURRED */ 2858 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x29; 2859 - buffer[offset+SPC_ASCQ_KEY_OFFSET] = 0x03; 2871 + buffer[SPC_ASC_KEY_OFFSET] = 0x29; 2872 + buffer[SPC_ASCQ_KEY_OFFSET] = 0x03; 2860 2873 break; 2861 2874 case TCM_INCORRECT_AMOUNT_OF_DATA: 2862 2875 /* CURRENT ERROR */ 2863 - buffer[offset] = 0x70; 2864 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2876 + buffer[0] = 0x70; 2877 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2865 2878 /* ABORTED COMMAND */ 2866 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2879 + buffer[SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2867 2880 /* WRITE ERROR */ 2868 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x0c; 2881 + buffer[SPC_ASC_KEY_OFFSET] = 0x0c; 2869 2882 /* NOT ENOUGH UNSOLICITED DATA */ 2870 - buffer[offset+SPC_ASCQ_KEY_OFFSET] = 0x0d; 2883 + buffer[SPC_ASCQ_KEY_OFFSET] = 0x0d; 2871 2884 break; 2872 2885 case TCM_INVALID_CDB_FIELD: 2873 2886 /* CURRENT ERROR */ 2874 - buffer[offset] = 0x70; 2875 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2887 + buffer[0] = 0x70; 2888 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2876 2889 /* ILLEGAL REQUEST */ 2877 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2890 + buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2878 2891 /* INVALID FIELD IN CDB */ 2879 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x24; 2892 + buffer[SPC_ASC_KEY_OFFSET] = 0x24; 2880 2893 break; 2881 2894 case TCM_INVALID_PARAMETER_LIST: 2882 2895 /* CURRENT ERROR */ 2883 - buffer[offset] = 0x70; 2884 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2896 + buffer[0] = 0x70; 2897 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2885 2898 /* ILLEGAL REQUEST */ 2886 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2899 + buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2887 2900 /* INVALID FIELD IN PARAMETER LIST */ 2888 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x26; 2901 + buffer[SPC_ASC_KEY_OFFSET] = 0x26; 2889 2902 break; 2890 2903 case TCM_UNEXPECTED_UNSOLICITED_DATA: 2891 2904 /* CURRENT ERROR */ 2892 - buffer[offset] = 0x70; 2893 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2905 + buffer[0] = 0x70; 2906 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2894 2907 /* ABORTED COMMAND */ 2895 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2908 + buffer[SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2896 2909 /* WRITE ERROR */ 2897 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x0c; 2910 + buffer[SPC_ASC_KEY_OFFSET] = 0x0c; 2898 2911 /* UNEXPECTED_UNSOLICITED_DATA */ 2899 - buffer[offset+SPC_ASCQ_KEY_OFFSET] = 0x0c; 2912 + buffer[SPC_ASCQ_KEY_OFFSET] = 0x0c; 2900 2913 break; 2901 2914 case TCM_SERVICE_CRC_ERROR: 2902 2915 /* CURRENT ERROR */ 2903 - buffer[offset] = 0x70; 2904 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2916 + buffer[0] = 0x70; 2917 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2905 2918 /* ABORTED COMMAND */ 2906 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2919 + buffer[SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2907 2920 /* PROTOCOL SERVICE CRC ERROR */ 2908 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x47; 2921 + buffer[SPC_ASC_KEY_OFFSET] = 0x47; 2909 2922 /* N/A */ 2910 - buffer[offset+SPC_ASCQ_KEY_OFFSET] = 0x05; 2923 + buffer[SPC_ASCQ_KEY_OFFSET] = 0x05; 2911 2924 break; 2912 2925 case TCM_SNACK_REJECTED: 2913 2926 /* CURRENT ERROR */ 2914 - buffer[offset] = 0x70; 2915 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2927 + buffer[0] = 0x70; 2928 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2916 2929 /* ABORTED COMMAND */ 2917 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2930 + buffer[SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2918 2931 /* READ ERROR */ 2919 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x11; 2932 + buffer[SPC_ASC_KEY_OFFSET] = 0x11; 2920 2933 /* FAILED RETRANSMISSION REQUEST */ 2921 - buffer[offset+SPC_ASCQ_KEY_OFFSET] = 0x13; 2934 + buffer[SPC_ASCQ_KEY_OFFSET] = 0x13; 2922 2935 break; 2923 2936 case TCM_WRITE_PROTECTED: 2924 2937 /* CURRENT ERROR */ 2925 - buffer[offset] = 0x70; 2926 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2938 + buffer[0] = 0x70; 2939 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2927 2940 /* DATA PROTECT */ 2928 - buffer[offset+SPC_SENSE_KEY_OFFSET] = DATA_PROTECT; 2941 + buffer[SPC_SENSE_KEY_OFFSET] = DATA_PROTECT; 2929 2942 /* WRITE PROTECTED */ 2930 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x27; 2943 + buffer[SPC_ASC_KEY_OFFSET] = 0x27; 2931 2944 break; 2932 2945 case TCM_ADDRESS_OUT_OF_RANGE: 2933 2946 /* CURRENT ERROR */ 2934 - buffer[offset] = 0x70; 2935 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2947 + buffer[0] = 0x70; 2948 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2936 2949 /* ILLEGAL REQUEST */ 2937 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2950 + buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2938 2951 /* LOGICAL BLOCK ADDRESS OUT OF RANGE */ 2939 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x21; 2952 + buffer[SPC_ASC_KEY_OFFSET] = 0x21; 2940 2953 break; 2941 2954 case TCM_CHECK_CONDITION_UNIT_ATTENTION: 2942 2955 /* CURRENT ERROR */ 2943 - buffer[offset] = 0x70; 2944 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2956 + buffer[0] = 0x70; 2957 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2945 2958 /* UNIT ATTENTION */ 2946 - buffer[offset+SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION; 2959 + buffer[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION; 2947 2960 core_scsi3_ua_for_check_condition(cmd, &asc, &ascq); 2948 - buffer[offset+SPC_ASC_KEY_OFFSET] = asc; 2949 - buffer[offset+SPC_ASCQ_KEY_OFFSET] = ascq; 2961 + buffer[SPC_ASC_KEY_OFFSET] = asc; 2962 + buffer[SPC_ASCQ_KEY_OFFSET] = ascq; 2950 2963 break; 2951 2964 case TCM_CHECK_CONDITION_NOT_READY: 2952 2965 /* CURRENT ERROR */ 2953 - buffer[offset] = 0x70; 2954 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2966 + buffer[0] = 0x70; 2967 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2955 2968 /* Not Ready */ 2956 - buffer[offset+SPC_SENSE_KEY_OFFSET] = NOT_READY; 2969 + buffer[SPC_SENSE_KEY_OFFSET] = NOT_READY; 2957 2970 transport_get_sense_codes(cmd, &asc, &ascq); 2958 - buffer[offset+SPC_ASC_KEY_OFFSET] = asc; 2959 - buffer[offset+SPC_ASCQ_KEY_OFFSET] = ascq; 2971 + buffer[SPC_ASC_KEY_OFFSET] = asc; 2972 + buffer[SPC_ASCQ_KEY_OFFSET] = ascq; 2960 2973 break; 2961 2974 case TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE: 2962 2975 default: 2963 2976 /* CURRENT ERROR */ 2964 - buffer[offset] = 0x70; 2965 - buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; 2977 + buffer[0] = 0x70; 2978 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2966 2979 /* ILLEGAL REQUEST */ 2967 - buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2980 + buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2968 2981 /* LOGICAL UNIT COMMUNICATION FAILURE */ 2969 - buffer[offset+SPC_ASC_KEY_OFFSET] = 0x80; 2982 + buffer[SPC_ASC_KEY_OFFSET] = 0x80; 2970 2983 break; 2971 2984 } 2972 2985 /* ··· 2977 2990 * Automatically padded, this value is encoded in the fabric's 2978 2991 * data_length response PDU containing the SCSI defined sense data. 2979 2992 */ 2980 - cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER + offset; 2993 + cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER; 2981 2994 2982 2995 after_reason: 2983 2996 return cmd->se_tfo->queue_status(cmd);
-6
drivers/target/tcm_fc/tfc_conf.c
··· 495 495 { 496 496 } 497 497 498 - static u16 ft_set_fabric_sense_len(struct se_cmd *se_cmd, u32 sense_len) 499 - { 500 - return 0; 501 - } 502 - 503 498 static u32 ft_tpg_get_inst_index(struct se_portal_group *se_tpg) 504 499 { 505 500 struct ft_tpg *tpg = se_tpg->se_tpg_fabric_ptr; ··· 532 537 .queue_data_in = ft_queue_data_in, 533 538 .queue_status = ft_queue_status, 534 539 .queue_tm_rsp = ft_queue_tm_resp, 535 - .set_fabric_sense_len = ft_set_fabric_sense_len, 536 540 /* 537 541 * Setup function pointers for generic logic in 538 542 * target_core_fabric_configfs.c
-6
drivers/usb/gadget/tcm_usb_gadget.c
··· 1475 1475 return 0; 1476 1476 } 1477 1477 1478 - static u16 usbg_set_fabric_sense_len(struct se_cmd *se_cmd, u32 sense_length) 1479 - { 1480 - return 0; 1481 - } 1482 - 1483 1478 static const char *usbg_check_wwn(const char *name) 1484 1479 { 1485 1480 const char *n; ··· 1900 1905 .queue_data_in = usbg_send_read_response, 1901 1906 .queue_status = usbg_send_status_response, 1902 1907 .queue_tm_rsp = usbg_queue_tm_rsp, 1903 - .set_fabric_sense_len = usbg_set_fabric_sense_len, 1904 1908 .check_stop_free = usbg_check_stop_free, 1905 1909 1906 1910 .fabric_make_wwn = usbg_make_tport,
-7
drivers/vhost/tcm_vhost.c
··· 330 330 return 0; 331 331 } 332 332 333 - static u16 tcm_vhost_set_fabric_sense_len(struct se_cmd *se_cmd, 334 - u32 sense_length) 335 - { 336 - return 0; 337 - } 338 - 339 333 static void vhost_scsi_free_cmd(struct tcm_vhost_cmd *tv_cmd) 340 334 { 341 335 struct se_cmd *se_cmd = &tv_cmd->tvc_se_cmd; ··· 1520 1526 .queue_data_in = tcm_vhost_queue_data_in, 1521 1527 .queue_status = tcm_vhost_queue_status, 1522 1528 .queue_tm_rsp = tcm_vhost_queue_tm_rsp, 1523 - .set_fabric_sense_len = tcm_vhost_set_fabric_sense_len, 1524 1529 /* 1525 1530 * Setup callers for generic logic in target_core_fabric_configfs.c 1526 1531 */
-1
include/target/target_core_fabric.h
··· 62 62 int (*queue_data_in)(struct se_cmd *); 63 63 int (*queue_status)(struct se_cmd *); 64 64 int (*queue_tm_rsp)(struct se_cmd *); 65 - u16 (*set_fabric_sense_len)(struct se_cmd *, u32); 66 65 /* 67 66 * fabric module calls for target_core_fabric_configfs.c 68 67 */