From: Roman Bolshakov <r.bolsha...@yadro.com>

[ Upstream commit 7010645ba7256992818b518163f46bd4cdf8002a ]

trace-cmd report doesn't show events from target subsystem because
scsi_command_size() leaks through event format string:

  [target:target_sequencer_start] function scsi_command_size not defined
  [target:target_cmd_complete] function scsi_command_size not defined

Addition of scsi_command_size() to plugin_scsi.c in trace-cmd doesn't
help because an expression is used inside TP_printk(). trace-cmd event
parser doesn't understand minus sign inside [ ]:

  Error: expected ']' but read '-'

Rather than duplicating kernel code in plugin_scsi.c, provide a dedicated
field for CONTROL byte.

Link: https://lore.kernel.org/r/20200929125957.83069-1-r.bolsha...@yadro.com
Reviewed-by: Mike Christie <michael.chris...@oracle.com>
Signed-off-by: Roman Bolshakov <r.bolsha...@yadro.com>
Signed-off-by: Martin K. Petersen <martin.peter...@oracle.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 include/scsi/scsi_common.h    |  7 +++++++
 include/trace/events/target.h | 12 ++++++------
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/include/scsi/scsi_common.h b/include/scsi/scsi_common.h
index 731ac09ed2313..5b567b43e1b16 100644
--- a/include/scsi/scsi_common.h
+++ b/include/scsi/scsi_common.h
@@ -25,6 +25,13 @@ scsi_command_size(const unsigned char *cmnd)
                scsi_varlen_cdb_length(cmnd) : COMMAND_SIZE(cmnd[0]);
 }
 
+static inline unsigned char
+scsi_command_control(const unsigned char *cmnd)
+{
+       return (cmnd[0] == VARIABLE_LENGTH_CMD) ?
+               cmnd[1] : cmnd[COMMAND_SIZE(cmnd[0]) - 1];
+}
+
 /* Returns a human-readable name for the device */
 extern const char *scsi_device_type(unsigned type);
 
diff --git a/include/trace/events/target.h b/include/trace/events/target.h
index 914a872dd3435..e87a3716b0ac9 100644
--- a/include/trace/events/target.h
+++ b/include/trace/events/target.h
@@ -140,6 +140,7 @@ TRACE_EVENT(target_sequencer_start,
                __field( unsigned int,  opcode          )
                __field( unsigned int,  data_length     )
                __field( unsigned int,  task_attribute  )
+               __field( unsigned char, control         )
                __array( unsigned char, cdb, TCM_MAX_COMMAND_SIZE       )
                __string( initiator,    
cmd->se_sess->se_node_acl->initiatorname        )
        ),
@@ -149,6 +150,7 @@ TRACE_EVENT(target_sequencer_start,
                __entry->opcode         = cmd->t_task_cdb[0];
                __entry->data_length    = cmd->data_length;
                __entry->task_attribute = cmd->sam_task_attr;
+               __entry->control        = scsi_command_control(cmd->t_task_cdb);
                memcpy(__entry->cdb, cmd->t_task_cdb, TCM_MAX_COMMAND_SIZE);
                __assign_str(initiator, 
cmd->se_sess->se_node_acl->initiatorname);
        ),
@@ -158,9 +160,7 @@ TRACE_EVENT(target_sequencer_start,
                  show_opcode_name(__entry->opcode),
                  __entry->data_length, __print_hex(__entry->cdb, 16),
                  show_task_attribute_name(__entry->task_attribute),
-                 scsi_command_size(__entry->cdb) <= 16 ?
-                       __entry->cdb[scsi_command_size(__entry->cdb) - 1] :
-                       __entry->cdb[1]
+                 __entry->control
        )
 );
 
@@ -175,6 +175,7 @@ TRACE_EVENT(target_cmd_complete,
                __field( unsigned int,  opcode          )
                __field( unsigned int,  data_length     )
                __field( unsigned int,  task_attribute  )
+               __field( unsigned char, control         )
                __field( unsigned char, scsi_status     )
                __field( unsigned char, sense_length    )
                __array( unsigned char, cdb, TCM_MAX_COMMAND_SIZE       )
@@ -187,6 +188,7 @@ TRACE_EVENT(target_cmd_complete,
                __entry->opcode         = cmd->t_task_cdb[0];
                __entry->data_length    = cmd->data_length;
                __entry->task_attribute = cmd->sam_task_attr;
+               __entry->control        = scsi_command_control(cmd->t_task_cdb);
                __entry->scsi_status    = cmd->scsi_status;
                __entry->sense_length   = cmd->scsi_status == 
SAM_STAT_CHECK_CONDITION ?
                        min(18, ((u8 *) 
cmd->sense_buffer)[SPC_ADD_SENSE_LEN_OFFSET] + 8) : 0;
@@ -203,9 +205,7 @@ TRACE_EVENT(target_cmd_complete,
                  show_opcode_name(__entry->opcode),
                  __entry->data_length, __print_hex(__entry->cdb, 16),
                  show_task_attribute_name(__entry->task_attribute),
-                 scsi_command_size(__entry->cdb) <= 16 ?
-                       __entry->cdb[scsi_command_size(__entry->cdb) - 1] :
-                       __entry->cdb[1]
+                 __entry->control
        )
 );
 
-- 
2.25.1

Reply via email to