| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * scsi_logging.c |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 2014 SUSE Linux Products GmbH |
|---|
| 5 | 6 | * Copyright (C) 2014 Hannes Reinecke <hare@suse.de> |
|---|
| 6 | | - * |
|---|
| 7 | | - * This file is released under the GPLv2 |
|---|
| 8 | 7 | */ |
|---|
| 9 | 8 | |
|---|
| 10 | 9 | #include <linux/kernel.h> |
|---|
| .. | .. |
|---|
| 206 | 205 | /* Print opcode in one line and use separate lines for CDB */ |
|---|
| 207 | 206 | off += scnprintf(logbuf + off, logbuf_len - off, "\n"); |
|---|
| 208 | 207 | dev_printk(KERN_INFO, &cmd->device->sdev_gendev, "%s", logbuf); |
|---|
| 209 | | - scsi_log_release_buffer(logbuf); |
|---|
| 210 | 208 | for (k = 0; k < cmd->cmd_len; k += 16) { |
|---|
| 211 | 209 | size_t linelen = min(cmd->cmd_len - k, 16); |
|---|
| 212 | 210 | |
|---|
| 213 | | - logbuf = scsi_log_reserve_buffer(&logbuf_len); |
|---|
| 214 | | - if (!logbuf) |
|---|
| 215 | | - break; |
|---|
| 216 | 211 | off = sdev_format_header(logbuf, logbuf_len, |
|---|
| 217 | 212 | scmd_name(cmd), |
|---|
| 218 | 213 | cmd->request->tag); |
|---|
| .. | .. |
|---|
| 225 | 220 | } |
|---|
| 226 | 221 | dev_printk(KERN_INFO, &cmd->device->sdev_gendev, "%s", |
|---|
| 227 | 222 | logbuf); |
|---|
| 228 | | - scsi_log_release_buffer(logbuf); |
|---|
| 229 | 223 | } |
|---|
| 230 | | - return; |
|---|
| 224 | + goto out; |
|---|
| 231 | 225 | } |
|---|
| 232 | 226 | if (!WARN_ON(off > logbuf_len - 49)) { |
|---|
| 233 | 227 | off += scnprintf(logbuf + off, logbuf_len - off, " "); |
|---|
| .. | .. |
|---|
| 237 | 231 | } |
|---|
| 238 | 232 | out_printk: |
|---|
| 239 | 233 | dev_printk(KERN_INFO, &cmd->device->sdev_gendev, "%s", logbuf); |
|---|
| 234 | +out: |
|---|
| 240 | 235 | scsi_log_release_buffer(logbuf); |
|---|
| 241 | 236 | } |
|---|
| 242 | 237 | EXPORT_SYMBOL(scsi_print_command); |
|---|
| .. | .. |
|---|
| 391 | 386 | const char *mlret_string = scsi_mlreturn_string(disposition); |
|---|
| 392 | 387 | const char *hb_string = scsi_hostbyte_string(cmd->result); |
|---|
| 393 | 388 | const char *db_string = scsi_driverbyte_string(cmd->result); |
|---|
| 389 | + unsigned long cmd_age = (jiffies - cmd->jiffies_at_alloc) / HZ; |
|---|
| 394 | 390 | |
|---|
| 395 | 391 | logbuf = scsi_log_reserve_buffer(&logbuf_len); |
|---|
| 396 | 392 | if (!logbuf) |
|---|
| .. | .. |
|---|
| 432 | 428 | |
|---|
| 433 | 429 | if (db_string) |
|---|
| 434 | 430 | off += scnprintf(logbuf + off, logbuf_len - off, |
|---|
| 435 | | - "driverbyte=%s", db_string); |
|---|
| 431 | + "driverbyte=%s ", db_string); |
|---|
| 436 | 432 | else |
|---|
| 437 | 433 | off += scnprintf(logbuf + off, logbuf_len - off, |
|---|
| 438 | | - "driverbyte=0x%02x", driver_byte(cmd->result)); |
|---|
| 434 | + "driverbyte=0x%02x ", |
|---|
| 435 | + driver_byte(cmd->result)); |
|---|
| 436 | + |
|---|
| 437 | + off += scnprintf(logbuf + off, logbuf_len - off, |
|---|
| 438 | + "cmd_age=%lus", cmd_age); |
|---|
| 439 | + |
|---|
| 439 | 440 | out_printk: |
|---|
| 440 | 441 | dev_printk(KERN_INFO, &cmd->device->sdev_gendev, "%s", logbuf); |
|---|
| 441 | 442 | scsi_log_release_buffer(logbuf); |
|---|