From: Hannes Reinecke <hare@suse.de>
To: James Bottomley <jbottomley@parallels.com>
Cc: linux-scsi@vger.kernel.org, Hannes Reinecke <hare@suse.de>,
Kay Sievers <kay@vrfy.org>
Subject: [PATCH 05/10] scsi: use buffer for print_opcode_name()
Date: Fri, 12 Oct 2012 10:33:45 +0200 [thread overview]
Message-ID: <1350030830-25614-6-git-send-email-hare@suse.de> (raw)
In-Reply-To: <1350030830-25614-1-git-send-email-hare@suse.de>
Instead of printing directly to syslog print_opcode_name() should
be using a private buffer to avoid linebreaks during printout.
Cc: Kay Sievers <kay@vrfy.org>
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
drivers/scsi/constants.c | 98 +++++++++++++++++++++++++++------------------
1 files changed, 59 insertions(+), 39 deletions(-)
diff --git a/drivers/scsi/constants.c b/drivers/scsi/constants.c
index 76e4c03..b469798 100644
--- a/drivers/scsi/constants.c
+++ b/drivers/scsi/constants.c
@@ -204,9 +204,10 @@ static const char * get_sa_name(const struct value_name_pair * arr,
}
/* attempt to guess cdb length if cdb_len==0 . No trailing linefeed. */
-static void print_opcode_name(unsigned char * cdbp, int cdb_len)
+static int print_opcode_name(char *buf, int buf_len,
+ unsigned char *cdbp, int cdb_len)
{
- int sa, len, cdb0;
+ int sa, len, cdb0, sz = 0;
const char * name;
cdb0 = cdbp[0];
@@ -214,101 +215,119 @@ static void print_opcode_name(unsigned char * cdbp, int cdb_len)
case VARIABLE_LENGTH_CMD:
len = scsi_varlen_cdb_length(cdbp);
if (len < 10) {
- printk("short variable length command, "
- "len=%d ext_len=%d", len, cdb_len);
- break;
+ sz = snprintf(buf, buf_len,
+ "short variable length command, "
+ "len=%d ext_len=%d", len, cdb_len);
+ return sz;
}
sa = (cdbp[8] << 8) + cdbp[9];
name = get_sa_name(variable_length_arr, VARIABLE_LENGTH_SZ, sa);
if (name)
- printk("%s", name);
+ sz = snprintf(buf, buf_len, "%s", name);
else
- printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa);
+ sz = snprintf(buf, buf_len, "cdb[0]=0x%x, sa=0x%x",
+ cdb0, sa);
if ((cdb_len > 0) && (len != cdb_len))
- printk(", in_cdb_len=%d, ext_len=%d", len, cdb_len);
+ sz = snprintf(buf + sz, buf_len - sz,
+ ", in_cdb_len=%d, ext_len=%d",
+ len, cdb_len);
break;
case MAINTENANCE_IN:
sa = cdbp[1] & 0x1f;
name = get_sa_name(maint_in_arr, MAINT_IN_SZ, sa);
if (name)
- printk("%s", name);
+ sz = snprintf(buf, buf_len, "%s", name);
else
- printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa);
+ sz = snprintf(buf, buf_len, "cdb[0]=0x%x, sa=0x%x",
+ cdb0, sa);
break;
case MAINTENANCE_OUT:
sa = cdbp[1] & 0x1f;
name = get_sa_name(maint_out_arr, MAINT_OUT_SZ, sa);
if (name)
- printk("%s", name);
+ sz = snprintf(buf, buf_len, "%s", name);
else
- printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa);
+ sz = snprintf(buf, buf_len, "cdb[0]=0x%x, sa=0x%x",
+ cdb0, sa);
break;
case SERVICE_ACTION_IN_12:
sa = cdbp[1] & 0x1f;
name = get_sa_name(serv_in12_arr, SERV_IN12_SZ, sa);
if (name)
- printk("%s", name);
+ sz = snprintf(buf, buf_len, "%s", name);
else
- printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa);
+ sz = snprintf(buf, buf_len, "cdb[0]=0x%x, sa=0x%x",
+ cdb0, sa);
break;
case SERVICE_ACTION_OUT_12:
sa = cdbp[1] & 0x1f;
name = get_sa_name(serv_out12_arr, SERV_OUT12_SZ, sa);
if (name)
- printk("%s", name);
+ sz = snprintf(buf, buf_len, "%s", name);
else
- printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa);
+ sz = snprintf(buf, buf_len, "cdb[0]=0x%x, sa=0x%x",
+ cdb0, sa);
break;
case SERVICE_ACTION_IN_16:
sa = cdbp[1] & 0x1f;
name = get_sa_name(serv_in16_arr, SERV_IN16_SZ, sa);
if (name)
- printk("%s", name);
+ sz = snprintf(buf, buf_len, "%s", name);
else
- printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa);
+ sz = snprintf(buf, buf_len, "cdb[0]=0x%x, sa=0x%x",
+ cdb0, sa);
break;
case SERVICE_ACTION_OUT_16:
sa = cdbp[1] & 0x1f;
name = get_sa_name(serv_out16_arr, SERV_OUT16_SZ, sa);
if (name)
- printk("%s", name);
+ sz = snprintf(buf, buf_len, "%s", name);
else
- printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa);
+ sz = snprintf(buf, buf_len, "cdb[0]=0x%x, sa=0x%x",
+ cdb0, sa);
break;
default:
if (cdb0 < 0xc0) {
name = cdb_byte0_names[cdb0];
if (name)
- printk("%s", name);
+ sz = snprintf(buf, buf_len, "%s", name);
else
- printk("cdb[0]=0x%x (reserved)", cdb0);
+ sz = snprintf(buf, buf_len,
+ "cdb[0]=0x%x (reserved)", cdb0);
} else
- printk("cdb[0]=0x%x (vendor)", cdb0);
+ sz = snprintf(buf, buf_len, "cdb[0]=0x%x (vendor)",
+ cdb0);
break;
}
+ return sz;
}
#else /* ifndef CONFIG_SCSI_CONSTANTS */
-static void print_opcode_name(unsigned char * cdbp, int cdb_len)
+static int print_opcode_name(char *buf, int buf_len,
+ unsigned char *cdbp, int cdb_len)
{
- int sa, len, cdb0;
+ int sa, len, cdb0, sz = 0;
cdb0 = cdbp[0];
+ sz = snprintf(buf, buf_len, "cdb[0]=0x%x", cdb0);
switch(cdb0) {
case VARIABLE_LENGTH_CMD:
len = scsi_varlen_cdb_length(cdbp);
if (len < 10) {
- printk("short opcode=0x%x command, len=%d "
- "ext_len=%d", cdb0, len, cdb_len);
+ sz += snprintf(buf + sz, buf_size - sz,
+ "short command, len=%d ext_len=%d",
+ len, cdb_len);
break;
}
sa = (cdbp[8] << 8) + cdbp[9];
- printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa);
+ sz += snprintf(buf + sz, buf_len - sz, ", sa=0x%x", sa);
if (len != cdb_len)
- printk(", in_cdb_len=%d, ext_len=%d", len, cdb_len);
+ sz += snprintf(buf + sz, buf_len - sz,
+ ", in_cdb_len=%d, ext_len=%d",
+ len, cdb_len);
break;
case MAINTENANCE_IN:
case MAINTENANCE_OUT:
@@ -317,23 +336,24 @@ static void print_opcode_name(unsigned char * cdbp, int cdb_len)
case SERVICE_ACTION_IN_16:
case SERVICE_ACTION_OUT_16:
sa = cdbp[1] & 0x1f;
- printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa);
+ sz += snprintf(buf + sz, buf_len - sz, ", sa=0x%x", sa);
break;
default:
- if (cdb0 < 0xc0)
- printk("cdb[0]=0x%x", cdb0);
- else
- printk("cdb[0]=0x%x (vendor)", cdb0);
+ if (cdb0 >= 0xc0)
+ sz += snprintf(buf + sz, buf_len - sz, " (vendor)");
break;
}
+ return sz;
}
-#endif
+#endif
void __scsi_print_command(unsigned char *cdb)
{
int k, len;
+ char cdb_str[64];
- print_opcode_name(cdb, 0);
+ print_opcode_name(cdb_str, 64, cdb, 0);
+ pr_info("%s", cdb_str);
len = scsi_command_size(cdb);
/* print out all bytes in cdb */
for (k = 0; k < len; ++k)
@@ -345,15 +365,15 @@ EXPORT_SYMBOL(__scsi_print_command);
void scsi_print_command(struct scsi_cmnd *cmd)
{
int k;
+ char cdb_str[64];
if (cmd->cmnd == NULL)
return;
- scmd_printk(KERN_INFO, cmd, "CDB: ");
- print_opcode_name(cmd->cmnd, cmd->cmd_len);
+ print_opcode_name(cdb_str, 64, cmd->cmnd, cmd->cmd_len);
+ scmd_printk(KERN_INFO, cmd, "CDB: %s:", cdb_str);
/* print out all bytes in cdb */
- printk(":");
for (k = 0; k < cmd->cmd_len; ++k)
printk(" %02x", cmd->cmnd[k]);
printk("\n");
--
1.7.4.2
next prev parent reply other threads:[~2012-10-12 8:33 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-12 8:33 [PATCH 00/10] scsi: avoid linebreaks in syslog output Hannes Reinecke
2012-10-12 8:33 ` [PATCH 01/10] sg: Use dev_printk Hannes Reinecke
2012-10-12 14:34 ` Douglas Gilbert
2012-10-12 8:33 ` [PATCH 02/10] sr: Use dev_printk() Hannes Reinecke
2012-10-12 8:33 ` [PATCH 03/10] scsi: Avoid linebreaks in syslog output Hannes Reinecke
2012-10-12 8:33 ` [PATCH 04/10] scsi: Use sdev_printk() for logging Hannes Reinecke
2012-10-12 8:33 ` Hannes Reinecke [this message]
2012-10-12 8:33 ` [PATCH 06/10] scsi: use single printk call in scsi_print_command() Hannes Reinecke
2012-10-12 8:33 ` [PATCH 07/10] scsi: use buffer for scsi_show_result() Hannes Reinecke
2012-10-12 8:33 ` [PATCH 08/10] scsi: open-code scsi_decode_sense_buffer() Hannes Reinecke
2012-10-12 8:33 ` [PATCH 09/10] scsi: decode descriptor sense Hannes Reinecke
2012-10-12 8:33 ` [PATCH 10/10] scsi: use local buffer for decoding sense data Hannes Reinecke
2012-10-15 0:19 ` [PATCH 00/10] scsi: avoid linebreaks in syslog output Mike Snitzer
2012-10-15 6:02 ` Hannes Reinecke
2013-12-20 13:25 ` Tomas Henzl
2013-12-20 13:31 ` Hannes Reinecke
2013-12-20 13:35 ` Tomas Henzl
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1350030830-25614-6-git-send-email-hare@suse.de \
--to=hare@suse.de \
--cc=jbottomley@parallels.com \
--cc=kay@vrfy.org \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).