@@ -69,14 +69,20 @@ static void scsi_log_release_buffer(char *bufptr)
6969 preempt_enable ();
7070}
7171
72- static size_t scmd_format_header (char * logbuf , size_t logbuf_len ,
73- struct gendisk * disk , int tag )
72+ static inline const char * scmd_name (const struct scsi_cmnd * scmd )
73+ {
74+ return scmd -> request -> rq_disk ?
75+ scmd -> request -> rq_disk -> disk_name : NULL ;
76+ }
77+
78+ static size_t sdev_format_header (char * logbuf , size_t logbuf_len ,
79+ const char * name , int tag )
7480{
7581 size_t off = 0 ;
7682
77- if (disk )
83+ if (name )
7884 off += scnprintf (logbuf + off , logbuf_len - off ,
79- "[%s] " , disk -> disk_name );
85+ "[%s] " , name );
8086
8187 if (WARN_ON (off >= logbuf_len ))
8288 return off ;
@@ -119,7 +125,6 @@ EXPORT_SYMBOL(sdev_prefix_printk);
119125int scmd_printk (const char * level , const struct scsi_cmnd * scmd ,
120126 const char * fmt , ...)
121127{
122- struct gendisk * disk = scmd -> request -> rq_disk ;
123128 va_list args ;
124129 char * logbuf ;
125130 size_t off = 0 , logbuf_len ;
@@ -131,7 +136,7 @@ int scmd_printk(const char *level, const struct scsi_cmnd *scmd,
131136 logbuf = scsi_log_reserve_buffer (& logbuf_len );
132137 if (!logbuf )
133138 return 0 ;
134- off = scmd_format_header (logbuf , logbuf_len , disk ,
139+ off = sdev_format_header (logbuf , logbuf_len , scmd_name ( scmd ) ,
135140 scmd -> request -> tag );
136141 if (off < logbuf_len ) {
137142 va_start (args , fmt );
@@ -218,7 +223,6 @@ EXPORT_SYMBOL(__scsi_format_command);
218223
219224void scsi_print_command (struct scsi_cmnd * cmd )
220225{
221- struct gendisk * disk = cmd -> request -> rq_disk ;
222226 int k ;
223227 char * logbuf ;
224228 size_t off , logbuf_len ;
@@ -230,7 +234,8 @@ void scsi_print_command(struct scsi_cmnd *cmd)
230234 if (!logbuf )
231235 return ;
232236
233- off = scmd_format_header (logbuf , logbuf_len , disk , cmd -> request -> tag );
237+ off = sdev_format_header (logbuf , logbuf_len ,
238+ scmd_name (cmd ), cmd -> request -> tag );
234239 if (off >= logbuf_len )
235240 goto out_printk ;
236241 off += scnprintf (logbuf + off , logbuf_len - off , "CDB: " );
@@ -254,7 +259,8 @@ void scsi_print_command(struct scsi_cmnd *cmd)
254259 logbuf = scsi_log_reserve_buffer (& logbuf_len );
255260 if (!logbuf )
256261 break ;
257- off = scmd_format_header (logbuf , logbuf_len , disk ,
262+ off = sdev_format_header (logbuf , logbuf_len ,
263+ scmd_name (cmd ),
258264 cmd -> request -> tag );
259265 if (!WARN_ON (off > logbuf_len - 58 )) {
260266 off += scnprintf (logbuf + off , logbuf_len - off ,
@@ -280,3 +286,145 @@ void scsi_print_command(struct scsi_cmnd *cmd)
280286 scsi_log_release_buffer (logbuf );
281287}
282288EXPORT_SYMBOL (scsi_print_command );
289+
290+ static size_t
291+ scsi_format_extd_sense (char * buffer , size_t buf_len ,
292+ unsigned char asc , unsigned char ascq )
293+ {
294+ size_t off = 0 ;
295+ const char * extd_sense_fmt = NULL ;
296+ const char * extd_sense_str = scsi_extd_sense_format (asc , ascq ,
297+ & extd_sense_fmt );
298+
299+ if (extd_sense_str ) {
300+ off = scnprintf (buffer , buf_len , "Add. Sense: %s" ,
301+ extd_sense_str );
302+ if (extd_sense_fmt )
303+ off += scnprintf (buffer + off , buf_len - off ,
304+ "(%s%x)" , extd_sense_fmt , ascq );
305+ } else {
306+ if (asc >= 0x80 )
307+ off = scnprintf (buffer , buf_len , "<<vendor>>" );
308+ off += scnprintf (buffer + off , buf_len - off ,
309+ "ASC=0x%x " , asc );
310+ if (ascq >= 0x80 )
311+ off += scnprintf (buffer + off , buf_len - off ,
312+ "<<vendor>>" );
313+ off += scnprintf (buffer + off , buf_len - off ,
314+ "ASCQ=0x%x " , ascq );
315+ }
316+ return off ;
317+ }
318+
319+ static size_t
320+ scsi_format_sense_hdr (char * buffer , size_t buf_len ,
321+ const struct scsi_sense_hdr * sshdr )
322+ {
323+ const char * sense_txt ;
324+ size_t off ;
325+
326+ off = scnprintf (buffer , buf_len , "Sense Key : " );
327+ sense_txt = scsi_sense_key_string (sshdr -> sense_key );
328+ if (sense_txt )
329+ off += scnprintf (buffer + off , buf_len - off ,
330+ "%s " , sense_txt );
331+ else
332+ off += scnprintf (buffer + off , buf_len - off ,
333+ "0x%x " , sshdr -> sense_key );
334+ off += scnprintf (buffer + off , buf_len - off ,
335+ scsi_sense_is_deferred (sshdr ) ? "[deferred] " : "[current] " );
336+
337+ if (sshdr -> response_code >= 0x72 )
338+ off += scnprintf (buffer + off , buf_len - off , "[descriptor] " );
339+ return off ;
340+ }
341+
342+ static void
343+ scsi_log_dump_sense (const struct scsi_device * sdev , const char * name , int tag ,
344+ const unsigned char * sense_buffer , int sense_len )
345+ {
346+ char * logbuf ;
347+ size_t logbuf_len ;
348+ int i ;
349+
350+ logbuf = scsi_log_reserve_buffer (& logbuf_len );
351+ if (!logbuf )
352+ return ;
353+
354+ for (i = 0 ; i < sense_len ; i += 16 ) {
355+ int len = min (sense_len - i , 16 );
356+ size_t off ;
357+
358+ off = sdev_format_header (logbuf , logbuf_len ,
359+ name , tag );
360+ hex_dump_to_buffer (& sense_buffer [i ], len , 16 , 1 ,
361+ logbuf + off , logbuf_len - off ,
362+ false);
363+ dev_printk (KERN_INFO , & sdev -> sdev_gendev , logbuf );
364+ }
365+ scsi_log_release_buffer (logbuf );
366+ }
367+
368+ static void
369+ scsi_log_print_sense_hdr (const struct scsi_device * sdev , const char * name ,
370+ int tag , const struct scsi_sense_hdr * sshdr )
371+ {
372+ char * logbuf ;
373+ size_t off , logbuf_len ;
374+
375+ logbuf = scsi_log_reserve_buffer (& logbuf_len );
376+ if (!logbuf )
377+ return ;
378+ off = sdev_format_header (logbuf , logbuf_len , name , tag );
379+ off += scsi_format_sense_hdr (logbuf + off , logbuf_len - off , sshdr );
380+ dev_printk (KERN_INFO , & sdev -> sdev_gendev , logbuf );
381+ scsi_log_release_buffer (logbuf );
382+
383+ logbuf = scsi_log_reserve_buffer (& logbuf_len );
384+ if (!logbuf )
385+ return ;
386+ off = sdev_format_header (logbuf , logbuf_len , name , tag );
387+ off += scsi_format_extd_sense (logbuf + off , logbuf_len - off ,
388+ sshdr -> asc , sshdr -> ascq );
389+ dev_printk (KERN_INFO , & sdev -> sdev_gendev , logbuf );
390+ scsi_log_release_buffer (logbuf );
391+ }
392+
393+ static void
394+ scsi_log_print_sense (const struct scsi_device * sdev , const char * name , int tag ,
395+ const unsigned char * sense_buffer , int sense_len )
396+ {
397+ struct scsi_sense_hdr sshdr ;
398+
399+ if (scsi_normalize_sense (sense_buffer , sense_len , & sshdr ))
400+ scsi_log_print_sense_hdr (sdev , name , tag , & sshdr );
401+ else
402+ scsi_log_dump_sense (sdev , name , tag , sense_buffer , sense_len );
403+ }
404+
405+ /*
406+ * Print normalized SCSI sense header with a prefix.
407+ */
408+ void
409+ scsi_print_sense_hdr (const struct scsi_device * sdev , const char * name ,
410+ const struct scsi_sense_hdr * sshdr )
411+ {
412+ scsi_log_print_sense_hdr (sdev , name , -1 , sshdr );
413+ }
414+ EXPORT_SYMBOL (scsi_print_sense_hdr );
415+
416+ /* Normalize and print sense buffer with name prefix */
417+ void __scsi_print_sense (const struct scsi_device * sdev , const char * name ,
418+ const unsigned char * sense_buffer , int sense_len )
419+ {
420+ scsi_log_print_sense (sdev , name , -1 , sense_buffer , sense_len );
421+ }
422+ EXPORT_SYMBOL (__scsi_print_sense );
423+
424+ /* Normalize and print sense buffer in SCSI command */
425+ void scsi_print_sense (const struct scsi_cmnd * cmd )
426+ {
427+ scsi_log_print_sense (cmd -> device , scmd_name (cmd ), cmd -> request -> tag ,
428+ cmd -> sense_buffer , SCSI_SENSE_BUFFERSIZE );
429+ }
430+ EXPORT_SYMBOL (scsi_print_sense );
0 commit comments