Commit 90f359c1 authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen
Browse files

scsi: core: Report error list information in debugfs



Provide information in debugfs about SCSI error handling to make it easier
to debug the SCSI error handler. Additionally, report the maximum number of
retries in debugfs (.allowed).

Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Cc: Mike Christie <michael.christie@oracle.com>
Cc: Ming Lei <ming.lei@redhat.com>
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Link: https://lore.kernel.org/r/20230822163811.219569-1-bvanassche@acm.org


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 79519528
Loading
Loading
Loading
Loading
+23 −3
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
#include <linux/seq_file.h>
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_dbg.h>
#include <scsi/scsi_host.h>
#include "scsi_debugfs.h"

#define SCSI_CMD_FLAG_NAME(name)[const_ilog2(SCMD_##name)] = #name
@@ -33,14 +34,33 @@ static int scsi_flags_show(struct seq_file *m, const unsigned long flags,

void scsi_show_rq(struct seq_file *m, struct request *rq)
{
	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq), *cmd2;
	struct Scsi_Host *shost = cmd->device->host;
	int alloc_ms = jiffies_to_msecs(jiffies - cmd->jiffies_at_alloc);
	int timeout_ms = jiffies_to_msecs(rq->timeout);
	const char *list_info = NULL;
	char buf[80] = "(?)";

	spin_lock_irq(shost->host_lock);
	list_for_each_entry(cmd2, &shost->eh_abort_list, eh_entry) {
		if (cmd == cmd2) {
			list_info = "on eh_abort_list";
			goto unlock;
		}
	}
	list_for_each_entry(cmd2, &shost->eh_cmd_q, eh_entry) {
		if (cmd == cmd2) {
			list_info = "on eh_cmd_q";
			goto unlock;
		}
	}
unlock:
	spin_unlock_irq(shost->host_lock);

	__scsi_format_command(buf, sizeof(buf), cmd->cmnd, cmd->cmd_len);
	seq_printf(m, ", .cmd=%s, .retries=%d, .result = %#x, .flags=", buf,
		   cmd->retries, cmd->result);
	seq_printf(m, ", .cmd=%s, .retries=%d, .allowed=%d, .result = %#x, %s%s.flags=",
		   buf, cmd->retries, cmd->allowed, cmd->result,
		   list_info ? : "", list_info ? ", " : "");
	scsi_flags_show(m, cmd->flags, scsi_cmd_flags,
			ARRAY_SIZE(scsi_cmd_flags));
	seq_printf(m, ", .timeout=%d.%03d, allocated %d.%03d s ago",