diff options
author | Hannes Reinecke <hare@suse.de> | 2015-01-08 01:43:47 -0500 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2015-01-09 09:44:31 -0500 |
commit | 026f8da8da4ce3423bf89e8e9091f55ae3863eda (patch) | |
tree | c4a4fef7a66a6ba9d331f3ea2e07b982d935e028 /drivers/scsi/scsi_logging.c | |
parent | 2104551969e8011e72788dc5674609d437448cf6 (diff) |
scsi: use per-cpu buffer for formatting scsi_print_result()
Convert scsi_print_result() to use the per-cpu buffer for decoding the
command result and disposition.
Tested-by: Robert Elliott <elliott@hp.com>
Reviewed-by: Robert Elliott <elliott@hp.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/scsi/scsi_logging.c')
-rw-r--r-- | drivers/scsi/scsi_logging.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_logging.c b/drivers/scsi/scsi_logging.c index c7cba3113f31..6128303f9c50 100644 --- a/drivers/scsi/scsi_logging.c +++ b/drivers/scsi/scsi_logging.c | |||
@@ -428,3 +428,62 @@ void scsi_print_sense(const struct scsi_cmnd *cmd) | |||
428 | cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE); | 428 | cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE); |
429 | } | 429 | } |
430 | EXPORT_SYMBOL(scsi_print_sense); | 430 | EXPORT_SYMBOL(scsi_print_sense); |
431 | |||
432 | void scsi_print_result(const struct scsi_cmnd *cmd, const char *msg, | ||
433 | int disposition) | ||
434 | { | ||
435 | char *logbuf; | ||
436 | size_t off, logbuf_len; | ||
437 | const char *mlret_string = scsi_mlreturn_string(disposition); | ||
438 | const char *hb_string = scsi_hostbyte_string(cmd->result); | ||
439 | const char *db_string = scsi_driverbyte_string(cmd->result); | ||
440 | |||
441 | logbuf = scsi_log_reserve_buffer(&logbuf_len); | ||
442 | if (!logbuf) | ||
443 | return; | ||
444 | |||
445 | off = sdev_format_header(logbuf, logbuf_len, | ||
446 | scmd_name(cmd), cmd->request->tag); | ||
447 | |||
448 | if (off >= logbuf_len) | ||
449 | goto out_printk; | ||
450 | |||
451 | if (msg) { | ||
452 | off += scnprintf(logbuf + off, logbuf_len - off, | ||
453 | "%s: ", msg); | ||
454 | if (WARN_ON(off >= logbuf_len)) | ||
455 | goto out_printk; | ||
456 | } | ||
457 | if (mlret_string) | ||
458 | off += scnprintf(logbuf + off, logbuf_len - off, | ||
459 | "%s ", mlret_string); | ||
460 | else | ||
461 | off += scnprintf(logbuf + off, logbuf_len - off, | ||
462 | "UNKNOWN(0x%02x) ", disposition); | ||
463 | if (WARN_ON(off >= logbuf_len)) | ||
464 | goto out_printk; | ||
465 | |||
466 | off += scnprintf(logbuf + off, logbuf_len - off, "Result: "); | ||
467 | if (WARN_ON(off >= logbuf_len)) | ||
468 | goto out_printk; | ||
469 | |||
470 | if (hb_string) | ||
471 | off += scnprintf(logbuf + off, logbuf_len - off, | ||
472 | "hostbyte=%s ", hb_string); | ||
473 | else | ||
474 | off += scnprintf(logbuf + off, logbuf_len - off, | ||
475 | "hostbyte=0x%02x ", host_byte(cmd->result)); | ||
476 | if (WARN_ON(off >= logbuf_len)) | ||
477 | goto out_printk; | ||
478 | |||
479 | if (db_string) | ||
480 | off += scnprintf(logbuf + off, logbuf_len - off, | ||
481 | "driverbyte=%s", db_string); | ||
482 | else | ||
483 | off += scnprintf(logbuf + off, logbuf_len - off, | ||
484 | "driverbyte=0x%02x", driver_byte(cmd->result)); | ||
485 | out_printk: | ||
486 | dev_printk(KERN_INFO, &cmd->device->sdev_gendev, logbuf); | ||
487 | scsi_log_release_buffer(logbuf); | ||
488 | } | ||
489 | EXPORT_SYMBOL(scsi_print_result); | ||