diff options
author | Roland Dreier <roland@purestorage.com> | 2012-08-15 17:35:25 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2012-09-17 20:12:58 -0400 |
commit | 9c58b7ddd70dd7bfaac4ca87131f36d10aaba441 (patch) | |
tree | 2796f11c283904cef9b38f543e31fed3fea565c7 /drivers/target/iscsi | |
parent | 2ed772b7b9df0f459308b3cbececc0136076d09e (diff) |
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>
Diffstat (limited to 'drivers/target/iscsi')
-rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 13 | ||||
-rw-r--r-- | drivers/target/iscsi/iscsi_target_configfs.c | 16 |
2 files changed, 8 insertions, 21 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 97c0f78c3c9c..9cfdeedaadb6 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
@@ -953,7 +953,7 @@ done: | |||
953 | */ | 953 | */ |
954 | transport_init_se_cmd(&cmd->se_cmd, &lio_target_fabric_configfs->tf_ops, | 954 | transport_init_se_cmd(&cmd->se_cmd, &lio_target_fabric_configfs->tf_ops, |
955 | conn->sess->se_sess, hdr->data_length, cmd->data_direction, | 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 | pr_debug("Got SCSI Command, ITT: 0x%08x, CmdSN: 0x%08x," | 958 | pr_debug("Got SCSI Command, ITT: 0x%08x, CmdSN: 0x%08x," |
959 | " ExpXferLen: %u, Length: %u, CID: %hu\n", hdr->itt, | 959 | " ExpXferLen: %u, Length: %u, CID: %hu\n", hdr->itt, |
@@ -1700,7 +1700,7 @@ static int iscsit_handle_task_mgt_cmd( | |||
1700 | transport_init_se_cmd(&cmd->se_cmd, | 1700 | transport_init_se_cmd(&cmd->se_cmd, |
1701 | &lio_target_fabric_configfs->tf_ops, | 1701 | &lio_target_fabric_configfs->tf_ops, |
1702 | conn->sess->se_sess, 0, DMA_NONE, | 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 | switch (function) { | 1705 | switch (function) { |
1706 | case ISCSI_TM_FUNC_ABORT_TASK: | 1706 | case ISCSI_TM_FUNC_ABORT_TASK: |
@@ -3092,15 +3092,18 @@ static int iscsit_send_status( | |||
3092 | if (cmd->se_cmd.sense_buffer && | 3092 | if (cmd->se_cmd.sense_buffer && |
3093 | ((cmd->se_cmd.se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) || | 3093 | ((cmd->se_cmd.se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) || |
3094 | (cmd->se_cmd.se_cmd_flags & SCF_EMULATED_TASK_SENSE))) { | 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 | padding = -(cmd->se_cmd.scsi_sense_length) & 3; | 3098 | padding = -(cmd->se_cmd.scsi_sense_length) & 3; |
3096 | hton24(hdr->dlength, cmd->se_cmd.scsi_sense_length); | 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 | iov[iov_count++].iov_len = | 3101 | iov[iov_count++].iov_len = |
3099 | (cmd->se_cmd.scsi_sense_length + padding); | 3102 | (cmd->se_cmd.scsi_sense_length + padding); |
3100 | tx_size += cmd->se_cmd.scsi_sense_length; | 3103 | tx_size += cmd->se_cmd.scsi_sense_length; |
3101 | 3104 | ||
3102 | if (padding) { | 3105 | if (padding) { |
3103 | memset(cmd->se_cmd.sense_buffer + | 3106 | memset(cmd->sense_buffer + |
3104 | cmd->se_cmd.scsi_sense_length, 0, padding); | 3107 | cmd->se_cmd.scsi_sense_length, 0, padding); |
3105 | tx_size += padding; | 3108 | tx_size += padding; |
3106 | pr_debug("Adding %u bytes of padding to" | 3109 | pr_debug("Adding %u bytes of padding to" |
@@ -3109,7 +3112,7 @@ static int iscsit_send_status( | |||
3109 | 3112 | ||
3110 | if (conn->conn_ops->DataDigest) { | 3113 | if (conn->conn_ops->DataDigest) { |
3111 | iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, | 3114 | iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, |
3112 | cmd->se_cmd.sense_buffer, | 3115 | cmd->sense_buffer, |
3113 | (cmd->se_cmd.scsi_sense_length + padding), | 3116 | (cmd->se_cmd.scsi_sense_length + padding), |
3114 | 0, NULL, (u8 *)&cmd->data_crc); | 3117 | 0, NULL, (u8 *)&cmd->data_crc); |
3115 | 3118 | ||
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c index 518fd4e86409..f86833fcf33c 100644 --- a/drivers/target/iscsi/iscsi_target_configfs.c +++ b/drivers/target/iscsi/iscsi_target_configfs.c | |||
@@ -1542,21 +1542,6 @@ static int lio_queue_status(struct se_cmd *se_cmd) | |||
1542 | return 0; | 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 | static int lio_queue_tm_rsp(struct se_cmd *se_cmd) | 1545 | static int lio_queue_tm_rsp(struct se_cmd *se_cmd) |
1561 | { | 1546 | { |
1562 | struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); | 1547 | struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); |
@@ -1740,7 +1725,6 @@ int iscsi_target_register_configfs(void) | |||
1740 | fabric->tf_ops.queue_data_in = &lio_queue_data_in; | 1725 | fabric->tf_ops.queue_data_in = &lio_queue_data_in; |
1741 | fabric->tf_ops.queue_status = &lio_queue_status; | 1726 | fabric->tf_ops.queue_status = &lio_queue_status; |
1742 | fabric->tf_ops.queue_tm_rsp = &lio_queue_tm_rsp; | 1727 | fabric->tf_ops.queue_tm_rsp = &lio_queue_tm_rsp; |
1743 | fabric->tf_ops.set_fabric_sense_len = &lio_set_fabric_sense_len; | ||
1744 | /* | 1728 | /* |
1745 | * Setup function pointers for generic logic in target_core_fabric_configfs.c | 1729 | * Setup function pointers for generic logic in target_core_fabric_configfs.c |
1746 | */ | 1730 | */ |