Convert sense buffer logging to use seq_buf to
avoid line breakup.
Signed-off-by: Hannes Reinecke <[email protected]>
---
drivers/scsi/constants.c | 107 --------------------------------------------
drivers/scsi/osst.c | 4 +-
drivers/scsi/scsi_logging.c | 104 ++++++++++++++++++++++++++++++++++++++++++
drivers/scsi/sd.c | 7 +--
drivers/scsi/sg.c | 2 +-
drivers/scsi/st.c | 4 +-
include/scsi/scsi_dbg.h | 2 +-
7 files changed, 112 insertions(+), 118 deletions(-)
diff --git a/drivers/scsi/constants.c b/drivers/scsi/constants.c
index f854b7e..0f02abe 100644
--- a/drivers/scsi/constants.c
+++ b/drivers/scsi/constants.c
@@ -1221,113 +1221,6 @@ scsi_extd_sense_format(unsigned char asc, unsigned char
ascq, const char **fmt)
}
EXPORT_SYMBOL(scsi_extd_sense_format);
-void
-scsi_show_extd_sense(struct scsi_device *sdev, const char *name,
- unsigned char asc, unsigned char ascq)
-{
- const char *extd_sense_fmt = NULL;
- const char *extd_sense_str = scsi_extd_sense_format(asc, ascq,
- &extd_sense_fmt);
-
- if (extd_sense_str) {
- if (extd_sense_fmt)
- sdev_prefix_printk(KERN_INFO, sdev, name,
- "Add. Sense: %s (%s%x)",
- extd_sense_str, extd_sense_fmt,
- ascq);
- else
- sdev_prefix_printk(KERN_INFO, sdev, name,
- "Add. Sense: %s", extd_sense_str);
-
- } else {
- sdev_prefix_printk(KERN_INFO, sdev, name,
- "%sASC=0x%x %sASCQ=0x%x\n",
- asc >= 0x80 ? "<<vendor>> " : "", asc,
- ascq >= 0x80 ? "<<vendor>> " : "", ascq);
- }
-}
-EXPORT_SYMBOL(scsi_show_extd_sense);
-
-void
-scsi_show_sense_hdr(struct scsi_device *sdev, const char *name,
- struct scsi_sense_hdr *sshdr)
-{
- const char *sense_txt;
-
- sense_txt = scsi_sense_key_string(sshdr->sense_key);
- if (sense_txt)
- sdev_prefix_printk(KERN_INFO, sdev, name,
- "Sense Key : %s [%s]%s\n", sense_txt,
- scsi_sense_is_deferred(sshdr) ?
- "deferred" : "current",
- sshdr->response_code >= 0x72 ?
- " [descriptor]" : "");
- else
- sdev_prefix_printk(KERN_INFO, sdev, name,
- "Sense Key : 0x%x [%s]%s", sshdr->sense_key,
- scsi_sense_is_deferred(sshdr) ?
- "deferred" : "current",
- sshdr->response_code >= 0x72 ?
- " [descriptor]" : "");
-}
-EXPORT_SYMBOL(scsi_show_sense_hdr);
-
-/*
- * Print normalized SCSI sense header with a prefix.
- */
-void
-scsi_print_sense_hdr(struct scsi_device *sdev, const char *name,
- struct scsi_sense_hdr *sshdr)
-{
- scsi_show_sense_hdr(sdev, name, sshdr);
- scsi_show_extd_sense(sdev, name, sshdr->asc, sshdr->ascq);
-}
-EXPORT_SYMBOL(scsi_print_sense_hdr);
-
-static void
-scsi_dump_sense_buffer(const unsigned char *sense_buffer, int sense_len)
-{
- int k, num;
-
- num = (sense_len < 32) ? sense_len : 32;
- printk("Unrecognized sense data (in hex):");
- for (k = 0; k < num; ++k) {
- if (0 == (k % 16)) {
- printk("\n");
- printk(KERN_INFO " ");
- }
- printk("%02x ", sense_buffer[k]);
- }
- printk("\n");
- return;
-}
-
-/* Normalize and print sense buffer with name prefix */
-void __scsi_print_sense(struct scsi_device *sdev, const char *name,
- const unsigned char *sense_buffer, int sense_len)
-{
- struct scsi_sense_hdr sshdr;
-
- if (!scsi_normalize_sense(sense_buffer, sense_len, &sshdr)) {
- scsi_dump_sense_buffer(sense_buffer, sense_len);
- return;
- }
- scsi_show_sense_hdr(sdev, name, &sshdr);
- scsi_show_extd_sense(sdev, name, sshdr.asc, sshdr.ascq);
-}
-EXPORT_SYMBOL(__scsi_print_sense);
-
-/* Normalize and print sense buffer in SCSI command */
-void scsi_print_sense(struct scsi_cmnd *cmd)
-{
- struct gendisk *disk = cmd->request->rq_disk;
- const char *disk_name = disk ? disk->disk_name : NULL;
-
- __scsi_print_sense(cmd->device, disk_name, cmd->sense_buffer,
- SCSI_SENSE_BUFFERSIZE);
-}
-EXPORT_SYMBOL(scsi_print_sense);
-
#ifdef CONFIG_SCSI_CONSTANTS
static const char * const hostbyte_table[]={
diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c
index 4ba2a9f..3616633 100644
--- a/drivers/scsi/osst.c
+++ b/drivers/scsi/osst.c
@@ -261,7 +261,7 @@ static int osst_chk_result(struct osst_tape * STp, struct
osst_request * SRpnt)
if (scode) printk(OSST_DEB_MSG "%s:D: Sense: %02x, ASC: %02x,
ASCQ: %02x\n",
name, scode, sense[12], sense[13]);
if (cmdstatp->have_sense)
- __scsi_print_sense(STp->device, name,
+ __scsi_print_sense(STp->device, name, -1,
SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
}
else
@@ -276,7 +276,7 @@ static int osst_chk_result(struct osst_tape * STp, struct
osst_request * SRpnt)
SRpnt->cmd[0] != TEST_UNIT_READY)) { /* Abnormal conditions
for tape */
if (cmdstatp->have_sense) {
printk(KERN_WARNING "%s:W: Command with sense data:\n",
name);
- __scsi_print_sense(STp->device, name,
+ __scsi_print_sense(STp->device, name, -1,
SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
}
else {
diff --git a/drivers/scsi/scsi_logging.c b/drivers/scsi/scsi_logging.c
index 9bc0aa6..c3672e5 100644
--- a/drivers/scsi/scsi_logging.c
+++ b/drivers/scsi/scsi_logging.c
@@ -166,3 +166,107 @@ void scsi_print_command(struct scsi_cmnd *cmd)
sdev_seq_printk(KERN_INFO, cmd->device, &s);
}
EXPORT_SYMBOL(scsi_print_command);
+
+void
+scsi_format_extd_sense(struct seq_buf *s,
+ unsigned char asc, unsigned char ascq)
+{
+ const char *extd_sense_fmt = NULL;
+ const char *extd_sense_str = scsi_extd_sense_format(asc, ascq,
+ &extd_sense_fmt);
+
+ if (extd_sense_str) {
+ seq_buf_printf(s, "Add. Sense: %s", extd_sense_str);
+ if (extd_sense_fmt)
+ seq_buf_printf(s, "(%s%x)", extd_sense_fmt, ascq);
+ } else {
+ if (asc >= 0x80)
+ seq_buf_printf(s, "<<vendor>>");
+ seq_buf_printf(s, "ASC=0x%x ", asc);
+ if (ascq >= 0x80)
+ seq_buf_printf(s, "<<vendor>>");
+ seq_buf_printf(s, "ASCQ=0x%x ", ascq);
+ }
+}
+
+void
+scsi_format_sense_hdr(struct seq_buf *s, struct scsi_sense_hdr *sshdr)
+{
+ const char *sense_txt;
+
+ seq_buf_printf(s, "Sense Key : ");
+ sense_txt = scsi_sense_key_string(sshdr->sense_key);
+ if (sense_txt)
+ seq_buf_printf(s, "%s ", sense_txt);
+ else
+ seq_buf_printf(s, "0x%x ", sshdr->sense_key);
+ seq_buf_printf(s, "[%s] ",
+ scsi_sense_is_deferred(sshdr) ? "deferred" : "current");
+ if (sshdr->response_code >= 0x72)
+ seq_buf_printf(s, "[descriptor] ");
+}
+
+static void __sdev_print_sense(struct seq_buf *s, struct scsi_device *sdev,
+ const char *name, int tag,
+ struct scsi_sense_hdr *sshdr)
+{
+ sdev_format_header(s, sdev, name, tag);
+ scsi_format_sense_hdr(s, sshdr);
+ sdev_seq_printk(KERN_INFO, sdev, s);
+
+ sdev_format_header(s, sdev, name, tag);
+ scsi_format_extd_sense(s, sshdr->asc, sshdr->ascq);
+ sdev_seq_printk(KERN_INFO, sdev, s);
+}
+
+/*
+ * Print normalized SCSI sense header with a prefix.
+ */
+void
+scsi_print_sense_hdr(struct scsi_device *sdev, const char *name,
+ struct scsi_sense_hdr *sshdr)
+{
+ char logbuf[SCSI_LOG_BUFSIZE];
+ struct seq_buf s;
+
+ seq_buf_init(&s, logbuf, SCSI_LOG_BUFSIZE);
+ __sdev_print_sense(&s, sdev, name, -1, sshdr);
+}
+EXPORT_SYMBOL(scsi_print_sense_hdr);
+
+/* Normalize and print sense buffer with name prefix */
+void __scsi_print_sense(struct scsi_device *sdev, const char *name, int tag,
+ const unsigned char *sense_buffer, int sense_len)
+{
+ struct scsi_sense_hdr sshdr;
+ char logbuf[SCSI_LOG_BUFSIZE];
+ struct seq_buf s;
+
+ seq_buf_init(&s, logbuf, SCSI_LOG_BUFSIZE);
+
+ if (!scsi_normalize_sense(sense_buffer, sense_len, &sshdr)) {
+ int i;
+
+ for (i = 0; i < sense_len; i += 16) {
+ int len = min(sense_len - i, 16);
+
+ sdev_format_header(&s, sdev, name, tag);
+ seq_buf_putmem_hex(&s, &sense_buffer[i], len);
+ sdev_seq_printk(KERN_INFO, sdev, &s);
+ }
+ return;
+ }
+ __sdev_print_sense(&s, sdev, name, tag, &sshdr);
+}
+EXPORT_SYMBOL(__scsi_print_sense);
+
+/* Normalize and print sense buffer in SCSI command */
+void scsi_print_sense(struct scsi_cmnd *cmd)
+{
+ struct gendisk *disk = cmd->request->rq_disk;
+ const char *disk_name = disk ? disk->disk_name : NULL;
+
+ __scsi_print_sense(cmd->device, disk_name, cmd->request->tag,
+ cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE);
+}
+EXPORT_SYMBOL(scsi_print_sense);
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 2cc8703..754419f 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -3312,11 +3312,8 @@ module_exit(exit_sd);
static void sd_print_sense_hdr(struct scsi_disk *sdkp,
struct scsi_sense_hdr *sshdr)
{
- scsi_show_sense_hdr(sdkp->device,
- sdkp->disk ? sdkp->disk->disk_name : NULL, sshdr);
- scsi_show_extd_sense(sdkp->device,
- sdkp->disk ? sdkp->disk->disk_name : NULL,
- sshdr->asc, sshdr->ascq);
+ scsi_print_sense_hdr(sdkp->device,
+ sdkp->disk ? sdkp->disk->disk_name : NULL, sshdr);
}
static void sd_print_result(struct scsi_disk *sdkp, const char *msg,
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index fde1f18..cc60f90 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -1360,7 +1360,7 @@ sg_rq_end_io(struct request *rq, int uptodate)
if ((sdp->sgdebug > 0) &&
((CHECK_CONDITION == srp->header.masked_status) ||
(COMMAND_TERMINATED == srp->header.masked_status)))
- __scsi_print_sense(sdp->device, __func__, sense,
+ __scsi_print_sense(sdp->device, __func__, -1, sense,
SCSI_SENSE_BUFFERSIZE);
/* Following if statement is a patch supplied by Eric Youngdale
*/
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index 052d1f9..2ee9fbb 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -373,7 +373,7 @@ static int st_chk_result(struct scsi_tape *STp, struct
st_request * SRpnt)
SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2],
SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]);
if (cmdstatp->have_sense)
- __scsi_print_sense(STp->device, name,
+ __scsi_print_sense(STp->device, name, -1,
SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
} ) /* end DEB */
if (!debugging) { /* Abnormal conditions for tape */
@@ -390,7 +390,7 @@ static int st_chk_result(struct scsi_tape *STp, struct
st_request * SRpnt)
SRpnt->cmd[0] != MODE_SENSE &&
SRpnt->cmd[0] != TEST_UNIT_READY) {
- __scsi_print_sense(STp->device, name,
+ __scsi_print_sense(STp->device, name, -1,
SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
}
}
diff --git a/include/scsi/scsi_dbg.h b/include/scsi/scsi_dbg.h
index 0281842..2a5f9b2 100644
--- a/include/scsi/scsi_dbg.h
+++ b/include/scsi/scsi_dbg.h
@@ -17,7 +17,7 @@ extern void scsi_show_sense_hdr(struct scsi_device *, const
char *,
extern void scsi_print_sense_hdr(struct scsi_device *, const char *,
struct scsi_sense_hdr *);
extern void scsi_print_sense(struct scsi_cmnd *);
-extern void __scsi_print_sense(struct scsi_device *, const char *name,
+extern void __scsi_print_sense(struct scsi_device *, const char *name, int tag,
const unsigned char *sense_buffer,
int sense_len);
extern void scsi_print_result(struct scsi_cmnd *, const char *, int);
--
1.8.5.2
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html