aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/target/target_core_hba.c5
-rw-r--r--drivers/target/target_core_spc.c12
-rw-r--r--drivers/target/target_core_transport.c3
-rw-r--r--include/target/target_core_backend.h2
4 files changed, 18 insertions, 4 deletions
diff --git a/drivers/target/target_core_hba.c b/drivers/target/target_core_hba.c
index 62ea4e8e70a8..d746a3a4a623 100644
--- a/drivers/target/target_core_hba.c
+++ b/drivers/target/target_core_hba.c
@@ -176,3 +176,8 @@ core_delete_hba(struct se_hba *hba)
176 kfree(hba); 176 kfree(hba);
177 return 0; 177 return 0;
178} 178}
179
180bool target_sense_desc_format(struct se_device *dev)
181{
182 return dev->transport->get_blocks(dev) > U32_MAX;
183}
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c
index c43dcbf2d48e..b949d335a6ba 100644
--- a/drivers/target/target_core_spc.c
+++ b/drivers/target/target_core_spc.c
@@ -761,7 +761,12 @@ static int spc_modesense_control(struct se_cmd *cmd, u8 pc, u8 *p)
761 if (pc == 1) 761 if (pc == 1)
762 goto out; 762 goto out;
763 763
764 p[2] = 2; 764 /* GLTSD: No implicit save of log parameters */
765 p[2] = (1 << 1);
766 if (target_sense_desc_format(dev))
767 /* D_SENSE: Descriptor format sense data for 64bit sectors */
768 p[2] |= (1 << 2);
769
765 /* 770 /*
766 * From spc4r23, 7.4.7 Control mode page 771 * From spc4r23, 7.4.7 Control mode page
767 * 772 *
@@ -1144,6 +1149,7 @@ static sense_reason_t spc_emulate_request_sense(struct se_cmd *cmd)
1144 unsigned char *rbuf; 1149 unsigned char *rbuf;
1145 u8 ua_asc = 0, ua_ascq = 0; 1150 u8 ua_asc = 0, ua_ascq = 0;
1146 unsigned char buf[SE_SENSE_BUF]; 1151 unsigned char buf[SE_SENSE_BUF];
1152 bool desc_format = target_sense_desc_format(cmd->se_dev);
1147 1153
1148 memset(buf, 0, SE_SENSE_BUF); 1154 memset(buf, 0, SE_SENSE_BUF);
1149 1155
@@ -1158,10 +1164,10 @@ static sense_reason_t spc_emulate_request_sense(struct se_cmd *cmd)
1158 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 1164 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1159 1165
1160 if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) 1166 if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq))
1161 scsi_build_sense_buffer(0, buf, UNIT_ATTENTION, 1167 scsi_build_sense_buffer(desc_format, buf, UNIT_ATTENTION,
1162 ua_asc, ua_ascq); 1168 ua_asc, ua_ascq);
1163 else 1169 else
1164 scsi_build_sense_buffer(0, buf, NO_SENSE, 0x0, 0x0); 1170 scsi_build_sense_buffer(desc_format, buf, NO_SENSE, 0x0, 0x0);
1165 1171
1166 memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length)); 1172 memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
1167 transport_kunmap_data_sg(cmd); 1173 transport_kunmap_data_sg(cmd);
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 7fb031bbcc8d..98155db28365 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -2735,6 +2735,7 @@ static int translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason)
2735 u8 *buffer = cmd->sense_buffer; 2735 u8 *buffer = cmd->sense_buffer;
2736 int r = (__force int)reason; 2736 int r = (__force int)reason;
2737 u8 asc, ascq; 2737 u8 asc, ascq;
2738 bool desc_format = target_sense_desc_format(cmd->se_dev);
2738 2739
2739 if (r < ARRAY_SIZE(sense_info_table) && sense_info_table[r].key) 2740 if (r < ARRAY_SIZE(sense_info_table) && sense_info_table[r].key)
2740 si = &sense_info_table[r]; 2741 si = &sense_info_table[r];
@@ -2754,7 +2755,7 @@ static int translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason)
2754 ascq = si->ascq; 2755 ascq = si->ascq;
2755 } 2756 }
2756 2757
2757 scsi_build_sense_buffer(0, buffer, si->key, asc, ascq); 2758 scsi_build_sense_buffer(desc_format, buffer, si->key, asc, ascq);
2758 if (si->add_sector_info) 2759 if (si->add_sector_info)
2759 return scsi_set_sense_information(buffer, 2760 return scsi_set_sense_information(buffer,
2760 cmd->scsi_sense_length, 2761 cmd->scsi_sense_length,
diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h
index 1e5c8f949bae..56cf8e485ef2 100644
--- a/include/target/target_core_backend.h
+++ b/include/target/target_core_backend.h
@@ -93,4 +93,6 @@ bool target_lun_is_rdonly(struct se_cmd *);
93sense_reason_t passthrough_parse_cdb(struct se_cmd *cmd, 93sense_reason_t passthrough_parse_cdb(struct se_cmd *cmd,
94 sense_reason_t (*exec_cmd)(struct se_cmd *cmd)); 94 sense_reason_t (*exec_cmd)(struct se_cmd *cmd));
95 95
96bool target_sense_desc_format(struct se_device *dev);
97
96#endif /* TARGET_CORE_BACKEND_H */ 98#endif /* TARGET_CORE_BACKEND_H */