@@ -69,14 +69,20 @@ static void scsi_log_release_buffer(char *bufptr)
69
69
preempt_enable ();
70
70
}
71
71
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 )
74
80
{
75
81
size_t off = 0 ;
76
82
77
- if (disk )
83
+ if (name )
78
84
off += scnprintf (logbuf + off , logbuf_len - off ,
79
- "[%s] " , disk -> disk_name );
85
+ "[%s] " , name );
80
86
81
87
if (WARN_ON (off >= logbuf_len ))
82
88
return off ;
@@ -119,7 +125,6 @@ EXPORT_SYMBOL(sdev_prefix_printk);
119
125
int scmd_printk (const char * level , const struct scsi_cmnd * scmd ,
120
126
const char * fmt , ...)
121
127
{
122
- struct gendisk * disk = scmd -> request -> rq_disk ;
123
128
va_list args ;
124
129
char * logbuf ;
125
130
size_t off = 0 , logbuf_len ;
@@ -131,7 +136,7 @@ int scmd_printk(const char *level, const struct scsi_cmnd *scmd,
131
136
logbuf = scsi_log_reserve_buffer (& logbuf_len );
132
137
if (!logbuf )
133
138
return 0 ;
134
- off = scmd_format_header (logbuf , logbuf_len , disk ,
139
+ off = sdev_format_header (logbuf , logbuf_len , scmd_name ( scmd ) ,
135
140
scmd -> request -> tag );
136
141
if (off < logbuf_len ) {
137
142
va_start (args , fmt );
@@ -218,7 +223,6 @@ EXPORT_SYMBOL(__scsi_format_command);
218
223
219
224
void scsi_print_command (struct scsi_cmnd * cmd )
220
225
{
221
- struct gendisk * disk = cmd -> request -> rq_disk ;
222
226
int k ;
223
227
char * logbuf ;
224
228
size_t off , logbuf_len ;
@@ -230,7 +234,8 @@ void scsi_print_command(struct scsi_cmnd *cmd)
230
234
if (!logbuf )
231
235
return ;
232
236
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 );
234
239
if (off >= logbuf_len )
235
240
goto out_printk ;
236
241
off += scnprintf (logbuf + off , logbuf_len - off , "CDB: " );
@@ -254,7 +259,8 @@ void scsi_print_command(struct scsi_cmnd *cmd)
254
259
logbuf = scsi_log_reserve_buffer (& logbuf_len );
255
260
if (!logbuf )
256
261
break ;
257
- off = scmd_format_header (logbuf , logbuf_len , disk ,
262
+ off = sdev_format_header (logbuf , logbuf_len ,
263
+ scmd_name (cmd ),
258
264
cmd -> request -> tag );
259
265
if (!WARN_ON (off > logbuf_len - 58 )) {
260
266
off += scnprintf (logbuf + off , logbuf_len - off ,
@@ -280,3 +286,145 @@ void scsi_print_command(struct scsi_cmnd *cmd)
280
286
scsi_log_release_buffer (logbuf );
281
287
}
282
288
EXPORT_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