mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 15:18:19 +00:00
target: Use scsi helpers to build the sense data correctly
Instead of open coding the sense buffer construction, use scsi scsi_build_sense_buffer() and scsi_set_sense_information() helpers which moved to scsi_common. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
7708c16565
commit
9ec1e1ce3a
2 changed files with 9 additions and 43 deletions
|
@ -1157,32 +1157,11 @@ static sense_reason_t spc_emulate_request_sense(struct se_cmd *cmd)
|
||||||
if (!rbuf)
|
if (!rbuf)
|
||||||
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
||||||
|
|
||||||
if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) {
|
if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq))
|
||||||
/*
|
scsi_build_sense_buffer(0, buf, UNIT_ATTENTION,
|
||||||
* CURRENT ERROR, UNIT ATTENTION
|
ua_asc, ua_ascq);
|
||||||
*/
|
else
|
||||||
buf[0] = 0x70;
|
scsi_build_sense_buffer(0, buf, NO_SENSE, 0x0, 0x0);
|
||||||
buf[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The Additional Sense Code (ASC) from the UNIT ATTENTION
|
|
||||||
*/
|
|
||||||
buf[SPC_ASC_KEY_OFFSET] = ua_asc;
|
|
||||||
buf[SPC_ASCQ_KEY_OFFSET] = ua_ascq;
|
|
||||||
buf[7] = 0x0A;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* CURRENT ERROR, NO SENSE
|
|
||||||
*/
|
|
||||||
buf[0] = 0x70;
|
|
||||||
buf[SPC_SENSE_KEY_OFFSET] = NO_SENSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NO ADDITIONAL SENSE INFORMATION
|
|
||||||
*/
|
|
||||||
buf[SPC_ASC_KEY_OFFSET] = 0x00;
|
|
||||||
buf[7] = 0x0A;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
|
memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
|
||||||
transport_kunmap_data_sg(cmd);
|
transport_kunmap_data_sg(cmd);
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include <net/sock.h>
|
#include <net/sock.h>
|
||||||
#include <net/tcp.h>
|
#include <net/tcp.h>
|
||||||
#include <scsi/scsi_proto.h>
|
#include <scsi/scsi_proto.h>
|
||||||
|
#include <scsi/scsi_common.h>
|
||||||
|
|
||||||
#include <target/target_core_base.h>
|
#include <target/target_core_base.h>
|
||||||
#include <target/target_core_backend.h>
|
#include <target/target_core_backend.h>
|
||||||
|
@ -2615,19 +2616,6 @@ bool transport_wait_for_tasks(struct se_cmd *cmd)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(transport_wait_for_tasks);
|
EXPORT_SYMBOL(transport_wait_for_tasks);
|
||||||
|
|
||||||
static
|
|
||||||
void transport_err_sector_info(unsigned char *buffer, sector_t bad_sector)
|
|
||||||
{
|
|
||||||
/* Place failed LBA in sense data information descriptor 0. */
|
|
||||||
buffer[SPC_ADD_SENSE_LEN_OFFSET] = 0xc;
|
|
||||||
buffer[SPC_DESC_TYPE_OFFSET] = 0; /* Information */
|
|
||||||
buffer[SPC_ADDITIONAL_DESC_LEN_OFFSET] = 0xa;
|
|
||||||
buffer[SPC_VALIDITY_OFFSET] = 0x80;
|
|
||||||
|
|
||||||
/* Descriptor Information: failing sector */
|
|
||||||
put_unaligned_be64(bad_sector, &buffer[12]);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sense_info {
|
struct sense_info {
|
||||||
u8 key;
|
u8 key;
|
||||||
u8 asc;
|
u8 asc;
|
||||||
|
@ -2754,7 +2742,6 @@ static void translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason)
|
||||||
si = &sense_info_table[(__force int)
|
si = &sense_info_table[(__force int)
|
||||||
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE];
|
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE];
|
||||||
|
|
||||||
buffer[SPC_SENSE_KEY_OFFSET] = si->key;
|
|
||||||
if (reason == TCM_CHECK_CONDITION_UNIT_ATTENTION) {
|
if (reason == TCM_CHECK_CONDITION_UNIT_ATTENTION) {
|
||||||
core_scsi3_ua_for_check_condition(cmd, &asc, &ascq);
|
core_scsi3_ua_for_check_condition(cmd, &asc, &ascq);
|
||||||
WARN_ON_ONCE(asc == 0);
|
WARN_ON_ONCE(asc == 0);
|
||||||
|
@ -2766,10 +2753,10 @@ static void translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason)
|
||||||
asc = si->asc;
|
asc = si->asc;
|
||||||
ascq = si->ascq;
|
ascq = si->ascq;
|
||||||
}
|
}
|
||||||
buffer[SPC_ASC_KEY_OFFSET] = asc;
|
|
||||||
buffer[SPC_ASCQ_KEY_OFFSET] = ascq;
|
scsi_build_sense_buffer(0, buffer, si->key, asc, ascq);
|
||||||
if (si->add_sector_info)
|
if (si->add_sector_info)
|
||||||
transport_err_sector_info(cmd->sense_buffer, cmd->bad_sector);
|
scsi_set_sense_information(buffer, cmd->bad_sector);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
Loading…
Reference in a new issue