47
47
#include <linux/blkpg.h>
48
48
#include <linux/blk-pm.h>
49
49
#include <linux/delay.h>
50
+ #include <linux/rw_hint.h>
50
51
#include <linux/major.h>
51
52
#include <linux/mutex.h>
52
53
#include <linux/string_helpers.h>
@@ -1080,12 +1081,38 @@ static blk_status_t sd_setup_flush_cmnd(struct scsi_cmnd *cmd)
1080
1081
return BLK_STS_OK ;
1081
1082
}
1082
1083
1084
+ /**
1085
+ * sd_group_number() - Compute the GROUP NUMBER field
1086
+ * @cmd: SCSI command for which to compute the value of the six-bit GROUP NUMBER
1087
+ * field.
1088
+ *
1089
+ * From SBC-5 r05 (https://www.t10.org/cgi-bin/ac.pl?t=f&f=sbc5r05.pdf):
1090
+ * 0: no relative lifetime.
1091
+ * 1: shortest relative lifetime.
1092
+ * 2: second shortest relative lifetime.
1093
+ * 3 - 0x3d: intermediate relative lifetimes.
1094
+ * 0x3e: second longest relative lifetime.
1095
+ * 0x3f: longest relative lifetime.
1096
+ */
1097
+ static u8 sd_group_number (struct scsi_cmnd * cmd )
1098
+ {
1099
+ const struct request * rq = scsi_cmd_to_rq (cmd );
1100
+ struct scsi_disk * sdkp = scsi_disk (rq -> q -> disk );
1101
+
1102
+ if (!sdkp -> rscs )
1103
+ return 0 ;
1104
+
1105
+ return min3 ((u32 )rq -> write_hint , (u32 )sdkp -> permanent_stream_count ,
1106
+ 0x3fu );
1107
+ }
1108
+
1083
1109
static blk_status_t sd_setup_rw32_cmnd (struct scsi_cmnd * cmd , bool write ,
1084
1110
sector_t lba , unsigned int nr_blocks ,
1085
1111
unsigned char flags , unsigned int dld )
1086
1112
{
1087
1113
cmd -> cmd_len = SD_EXT_CDB_SIZE ;
1088
1114
cmd -> cmnd [0 ] = VARIABLE_LENGTH_CMD ;
1115
+ cmd -> cmnd [6 ] = sd_group_number (cmd );
1089
1116
cmd -> cmnd [7 ] = 0x18 ; /* Additional CDB len */
1090
1117
cmd -> cmnd [9 ] = write ? WRITE_32 : READ_32 ;
1091
1118
cmd -> cmnd [10 ] = flags ;
@@ -1104,7 +1131,7 @@ static blk_status_t sd_setup_rw16_cmnd(struct scsi_cmnd *cmd, bool write,
1104
1131
cmd -> cmd_len = 16 ;
1105
1132
cmd -> cmnd [0 ] = write ? WRITE_16 : READ_16 ;
1106
1133
cmd -> cmnd [1 ] = flags | ((dld >> 2 ) & 0x01 );
1107
- cmd -> cmnd [14 ] = (dld & 0x03 ) << 6 ;
1134
+ cmd -> cmnd [14 ] = (( dld & 0x03 ) << 6 ) | sd_group_number ( cmd ) ;
1108
1135
cmd -> cmnd [15 ] = 0 ;
1109
1136
put_unaligned_be64 (lba , & cmd -> cmnd [2 ]);
1110
1137
put_unaligned_be32 (nr_blocks , & cmd -> cmnd [10 ]);
@@ -1119,7 +1146,7 @@ static blk_status_t sd_setup_rw10_cmnd(struct scsi_cmnd *cmd, bool write,
1119
1146
cmd -> cmd_len = 10 ;
1120
1147
cmd -> cmnd [0 ] = write ? WRITE_10 : READ_10 ;
1121
1148
cmd -> cmnd [1 ] = flags ;
1122
- cmd -> cmnd [6 ] = 0 ;
1149
+ cmd -> cmnd [6 ] = sd_group_number ( cmd ) ;
1123
1150
cmd -> cmnd [9 ] = 0 ;
1124
1151
put_unaligned_be32 (lba , & cmd -> cmnd [2 ]);
1125
1152
put_unaligned_be16 (nr_blocks , & cmd -> cmnd [7 ]);
@@ -1256,7 +1283,7 @@ static blk_status_t sd_setup_read_write_cmnd(struct scsi_cmnd *cmd)
1256
1283
ret = sd_setup_rw16_cmnd (cmd , write , lba , nr_blocks ,
1257
1284
protect | fua , dld );
1258
1285
} else if ((nr_blocks > 0xff ) || (lba > 0x1fffff ) ||
1259
- sdp -> use_10_for_rw || protect ) {
1286
+ sdp -> use_10_for_rw || protect || rq -> write_hint ) {
1260
1287
ret = sd_setup_rw10_cmnd (cmd , write , lba , nr_blocks ,
1261
1288
protect | fua );
1262
1289
} else {
@@ -3001,6 +3028,70 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
3001
3028
sdkp -> DPOFUA = 0 ;
3002
3029
}
3003
3030
3031
+ static bool sd_is_perm_stream (struct scsi_disk * sdkp , unsigned int stream_id )
3032
+ {
3033
+ u8 cdb [16 ] = { SERVICE_ACTION_IN_16 , SAI_GET_STREAM_STATUS };
3034
+ struct {
3035
+ struct scsi_stream_status_header h ;
3036
+ struct scsi_stream_status s ;
3037
+ } buf ;
3038
+ struct scsi_device * sdev = sdkp -> device ;
3039
+ struct scsi_sense_hdr sshdr ;
3040
+ const struct scsi_exec_args exec_args = {
3041
+ .sshdr = & sshdr ,
3042
+ };
3043
+ int res ;
3044
+
3045
+ put_unaligned_be16 (stream_id , & cdb [4 ]);
3046
+ put_unaligned_be32 (sizeof (buf ), & cdb [10 ]);
3047
+
3048
+ res = scsi_execute_cmd (sdev , cdb , REQ_OP_DRV_IN , & buf , sizeof (buf ),
3049
+ SD_TIMEOUT , sdkp -> max_retries , & exec_args );
3050
+ if (res < 0 )
3051
+ return false;
3052
+ if (scsi_status_is_check_condition (res ) && scsi_sense_valid (& sshdr ))
3053
+ sd_print_sense_hdr (sdkp , & sshdr );
3054
+ if (res )
3055
+ return false;
3056
+ if (get_unaligned_be32 (& buf .h .len ) < sizeof (struct scsi_stream_status ))
3057
+ return false;
3058
+ return buf .h .stream_status [0 ].perm ;
3059
+ }
3060
+
3061
+ static void sd_read_io_hints (struct scsi_disk * sdkp , unsigned char * buffer )
3062
+ {
3063
+ struct scsi_device * sdp = sdkp -> device ;
3064
+ const struct scsi_io_group_descriptor * desc , * start , * end ;
3065
+ struct scsi_sense_hdr sshdr ;
3066
+ struct scsi_mode_data data ;
3067
+ int res ;
3068
+
3069
+ res = scsi_mode_sense (sdp , /*dbd=*/ 0x8 , /*modepage=*/ 0x0a ,
3070
+ /*subpage=*/ 0x05 , buffer , SD_BUF_SIZE , SD_TIMEOUT ,
3071
+ sdkp -> max_retries , & data , & sshdr );
3072
+ if (res < 0 )
3073
+ return ;
3074
+ start = (void * )buffer + data .header_length + 16 ;
3075
+ end = (void * )buffer + ALIGN_DOWN (data .header_length + data .length ,
3076
+ sizeof (* end ));
3077
+ /*
3078
+ * From "SBC-5 Constrained Streams with Data Lifetimes": Device severs
3079
+ * should assign the lowest numbered stream identifiers to permanent
3080
+ * streams.
3081
+ */
3082
+ for (desc = start ; desc < end ; desc ++ )
3083
+ if (!desc -> st_enble || !sd_is_perm_stream (sdkp , desc - start ))
3084
+ break ;
3085
+ sdkp -> permanent_stream_count = desc - start ;
3086
+ if (sdkp -> rscs && sdkp -> permanent_stream_count < 2 )
3087
+ sd_printk (KERN_INFO , sdkp ,
3088
+ "Unexpected: RSCS has been set and the permanent stream count is %u\n" ,
3089
+ sdkp -> permanent_stream_count );
3090
+ else if (sdkp -> permanent_stream_count )
3091
+ sd_printk (KERN_INFO , sdkp , "permanent stream count = %d\n" ,
3092
+ sdkp -> permanent_stream_count );
3093
+ }
3094
+
3004
3095
/*
3005
3096
* The ATO bit indicates whether the DIF application tag is available
3006
3097
* for use by the operating system.
@@ -3481,6 +3572,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
3481
3572
3482
3573
sd_read_write_protect_flag (sdkp , buffer );
3483
3574
sd_read_cache_type (sdkp , buffer );
3575
+ sd_read_io_hints (sdkp , buffer );
3484
3576
sd_read_app_tag_own (sdkp , buffer );
3485
3577
sd_read_write_same (sdkp , buffer );
3486
3578
sd_read_security (sdkp , buffer );
0 commit comments