提交 a4d04a4c 编写于 作者: M Martin K. Petersen 提交者: James Bottomley

[SCSI] Make error printing more verbose

This patch enhances SCSI error printing by:

 - Making use of scsi_print_result() in the completion functions.

 - Having scmd_printk() output the disk name (when applicable).
Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: NJames Bottomley <James.Bottomley@SteelEye.com>
上级 684b7fe9
...@@ -344,7 +344,6 @@ void scsi_destroy_command_freelist(struct Scsi_Host *shost) ...@@ -344,7 +344,6 @@ void scsi_destroy_command_freelist(struct Scsi_Host *shost)
void scsi_log_send(struct scsi_cmnd *cmd) void scsi_log_send(struct scsi_cmnd *cmd)
{ {
unsigned int level; unsigned int level;
struct scsi_device *sdev;
/* /*
* If ML QUEUE log level is greater than or equal to: * If ML QUEUE log level is greater than or equal to:
...@@ -361,22 +360,17 @@ void scsi_log_send(struct scsi_cmnd *cmd) ...@@ -361,22 +360,17 @@ void scsi_log_send(struct scsi_cmnd *cmd)
level = SCSI_LOG_LEVEL(SCSI_LOG_MLQUEUE_SHIFT, level = SCSI_LOG_LEVEL(SCSI_LOG_MLQUEUE_SHIFT,
SCSI_LOG_MLQUEUE_BITS); SCSI_LOG_MLQUEUE_BITS);
if (level > 1) { if (level > 1) {
sdev = cmd->device; scmd_printk(KERN_INFO, cmd, "Send: ");
sdev_printk(KERN_INFO, sdev, "send ");
if (level > 2) if (level > 2)
printk("0x%p ", cmd); printk("0x%p ", cmd);
/* printk("\n");
* spaces to match disposition and cmd->result
* output in scsi_log_completion.
*/
printk(" ");
scsi_print_command(cmd); scsi_print_command(cmd);
if (level > 3) { if (level > 3) {
printk(KERN_INFO "buffer = 0x%p, bufflen = %d," printk(KERN_INFO "buffer = 0x%p, bufflen = %d,"
" done = 0x%p, queuecommand 0x%p\n", " done = 0x%p, queuecommand 0x%p\n",
cmd->request_buffer, cmd->request_bufflen, cmd->request_buffer, cmd->request_bufflen,
cmd->done, cmd->done,
sdev->host->hostt->queuecommand); cmd->device->host->hostt->queuecommand);
} }
} }
...@@ -386,7 +380,6 @@ void scsi_log_send(struct scsi_cmnd *cmd) ...@@ -386,7 +380,6 @@ void scsi_log_send(struct scsi_cmnd *cmd)
void scsi_log_completion(struct scsi_cmnd *cmd, int disposition) void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
{ {
unsigned int level; unsigned int level;
struct scsi_device *sdev;
/* /*
* If ML COMPLETE log level is greater than or equal to: * If ML COMPLETE log level is greater than or equal to:
...@@ -405,8 +398,7 @@ void scsi_log_completion(struct scsi_cmnd *cmd, int disposition) ...@@ -405,8 +398,7 @@ void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
SCSI_LOG_MLCOMPLETE_BITS); SCSI_LOG_MLCOMPLETE_BITS);
if (((level > 0) && (cmd->result || disposition != SUCCESS)) || if (((level > 0) && (cmd->result || disposition != SUCCESS)) ||
(level > 1)) { (level > 1)) {
sdev = cmd->device; scmd_printk(KERN_INFO, cmd, "Done: ");
sdev_printk(KERN_INFO, sdev, "done ");
if (level > 2) if (level > 2)
printk("0x%p ", cmd); printk("0x%p ", cmd);
/* /*
...@@ -415,40 +407,35 @@ void scsi_log_completion(struct scsi_cmnd *cmd, int disposition) ...@@ -415,40 +407,35 @@ void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
*/ */
switch (disposition) { switch (disposition) {
case SUCCESS: case SUCCESS:
printk("SUCCESS"); printk("SUCCESS\n");
break; break;
case NEEDS_RETRY: case NEEDS_RETRY:
printk("RETRY "); printk("RETRY\n");
break; break;
case ADD_TO_MLQUEUE: case ADD_TO_MLQUEUE:
printk("MLQUEUE"); printk("MLQUEUE\n");
break; break;
case FAILED: case FAILED:
printk("FAILED "); printk("FAILED\n");
break; break;
case TIMEOUT_ERROR: case TIMEOUT_ERROR:
/* /*
* If called via scsi_times_out. * If called via scsi_times_out.
*/ */
printk("TIMEOUT"); printk("TIMEOUT\n");
break; break;
default: default:
printk("UNKNOWN"); printk("UNKNOWN\n");
} }
printk(" %8x ", cmd->result); scsi_print_result(cmd);
scsi_print_command(cmd); scsi_print_command(cmd);
if (status_byte(cmd->result) & CHECK_CONDITION) { if (status_byte(cmd->result) & CHECK_CONDITION)
/*
* XXX The scsi_print_sense formatting/prefix
* doesn't match this function.
*/
scsi_print_sense("", cmd); scsi_print_sense("", cmd);
} if (level > 3)
if (level > 3) { scmd_printk(KERN_INFO, cmd,
printk(KERN_INFO "scsi host busy %d failed %d\n", "scsi host busy %d failed %d\n",
sdev->host->host_busy, cmd->device->host->host_busy,
sdev->host->host_failed); cmd->device->host->host_failed);
}
} }
} }
} }
......
...@@ -968,9 +968,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) ...@@ -968,9 +968,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
} }
if (result) { if (result) {
if (!(req->cmd_flags & REQ_QUIET)) { if (!(req->cmd_flags & REQ_QUIET)) {
scmd_printk(KERN_INFO, cmd, scsi_print_result(cmd);
"SCSI error: return code = 0x%08x\n",
result);
if (driver_byte(result) & DRIVER_SENSE) if (driver_byte(result) & DRIVER_SENSE)
scsi_print_sense("", cmd); scsi_print_sense("", cmd);
} }
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/blkdev.h>
#include <asm/atomic.h> #include <asm/atomic.h>
struct request_queue; struct request_queue;
...@@ -154,8 +155,11 @@ struct scsi_device { ...@@ -154,8 +155,11 @@ struct scsi_device {
#define sdev_printk(prefix, sdev, fmt, a...) \ #define sdev_printk(prefix, sdev, fmt, a...) \
dev_printk(prefix, &(sdev)->sdev_gendev, fmt, ##a) dev_printk(prefix, &(sdev)->sdev_gendev, fmt, ##a)
#define scmd_printk(prefix, scmd, fmt, a...) \ #define scmd_printk(prefix, scmd, fmt, a...) \
dev_printk(prefix, &(scmd)->device->sdev_gendev, fmt, ##a) (scmd)->request->rq_disk ? \
sdev_printk(prefix, (scmd)->device, "[%s] " fmt, \
(scmd)->request->rq_disk->disk_name, ##a) : \
sdev_printk(prefix, (scmd)->device, fmt, ##a)
enum scsi_target_state { enum scsi_target_state {
STARGET_RUNNING = 1, STARGET_RUNNING = 1,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册