b/drivers/target/target_core_spc.c
@@ -761,7 +761,12 @@ static int spc_modesense_control(struct se_cmd
*cmd, u8 pc, u8 *p)
if (pc == 1)
goto out;
- p[2] = 2;
+ /* GLTSD: No implicit save of log parameters */
+ p[2] = (1 << 1);
+ if (TARGET_SENSE_DESC_FORMAT(dev))
+ /* D_SENSE: Descriptor format sense data for 64bit
sectors */
+ p[2] |= (1 << 2);
+
/*
* From spc4r23, 7.4.7 Control mode page
*
@@ -1144,6 +1149,7 @@ static sense_reason_t
spc_emulate_request_sense(struct se_cmd *cmd)
unsigned char *rbuf;
u8 ua_asc = 0, ua_ascq = 0;
unsigned char buf[SE_SENSE_BUF];
+ bool desc_format = TARGET_SENSE_DESC_FORMAT(cmd->se_dev);
memset(buf, 0, SE_SENSE_BUF);
@@ -1158,10 +1164,10 @@ static sense_reason_t
spc_emulate_request_sense(struct se_cmd *cmd)
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq))
- scsi_build_sense_buffer(0, buf, UNIT_ATTENTION,
+ scsi_build_sense_buffer(desc_format, buf, UNIT_ATTENTION,
ua_asc, ua_ascq);
else
- scsi_build_sense_buffer(0, buf, NO_SENSE, 0x0, 0x0);
+ scsi_build_sense_buffer(desc_format, buf, NO_SENSE, 0x0,
0x0);
memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
transport_kunmap_data_sg(cmd);
b/drivers/target/target_core_transport.c
@@ -2735,6 +2735,7 @@ static int translate_sense_reason(struct se_cmd
*cmd, sense_reason_t reason)
u8 *buffer = cmd->sense_buffer;
int r = (__force int)reason;
u8 asc, ascq;
+ bool desc_format = TARGET_SENSE_DESC_FORMAT(cmd->se_dev);
if (r < ARRAY_SIZE(sense_info_table) && sense_info_table[r].key)
si = &sense_info_table[r];
@@ -2754,7 +2755,7 @@ static int translate_sense_reason(struct se_cmd
*cmd, sense_reason_t reason)
ascq = si->ascq;
}
- scsi_build_sense_buffer(0, buffer, si->key, asc, ascq);
+ scsi_build_sense_buffer(desc_format, buffer, si->key, asc, ascq);
if (si->add_sector_info)
return scsi_set_sense_information(buffer,
cmd->scsi_sense_length,
b/include/target/target_core_backend.h
@@ -3,6 +3,9 @@
#define TRANSPORT_FLAG_PASSTHROUGH 1
+#define TARGET_SENSE_DESC_FORMAT(dev) \
+ dev->transport->get_blocks(dev) >= 0xffffffffULL
+
struct target_backend_ops {
char name[16];
char inquiry_prod[16];