aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/blktrace.c
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-03-16 19:20:15 -0400
committerSteven Rostedt <srostedt@redhat.com>2009-03-16 23:27:06 -0400
commit4ca530852346be239b7c19e7bec5d2b78855bebe (patch)
tree96e5252faaf362115a96ed6df7c4e4f698a027dc /kernel/trace/blktrace.c
parent03303549b1695dc024d4a653cc16bd79f78f9750 (diff)
tracing: protect reader of cmdline output
Impact: fix to one cause of incorrect comm outputs in trace The spinlock only protected the creation of a comm <=> pid pair. But it was possible that a reader could look up a pid, and get the wrong comm because it had no locking. This also required changing trace_find_cmdline to copy the comm cache and not just send back a pointer to it. Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Diffstat (limited to 'kernel/trace/blktrace.c')
-rw-r--r--kernel/trace/blktrace.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
index 1f32e4edf490..b171778e3863 100644
--- a/kernel/trace/blktrace.c
+++ b/kernel/trace/blktrace.c
@@ -1027,7 +1027,9 @@ static int blk_log_action_seq(struct trace_seq *s, const struct blk_io_trace *t,
1027 1027
1028static int blk_log_generic(struct trace_seq *s, const struct trace_entry *ent) 1028static int blk_log_generic(struct trace_seq *s, const struct trace_entry *ent)
1029{ 1029{
1030 const char *cmd = trace_find_cmdline(ent->pid); 1030 char cmd[TASK_COMM_LEN];
1031
1032 trace_find_cmdline(ent->pid, cmd);
1031 1033
1032 if (t_sec(ent)) 1034 if (t_sec(ent))
1033 return trace_seq_printf(s, "%llu + %u [%s]\n", 1035 return trace_seq_printf(s, "%llu + %u [%s]\n",
@@ -1057,19 +1059,30 @@ static int blk_log_remap(struct trace_seq *s, const struct trace_entry *ent)
1057 1059
1058static int blk_log_plug(struct trace_seq *s, const struct trace_entry *ent) 1060static int blk_log_plug(struct trace_seq *s, const struct trace_entry *ent)
1059{ 1061{
1060 return trace_seq_printf(s, "[%s]\n", trace_find_cmdline(ent->pid)); 1062 char cmd[TASK_COMM_LEN];
1063
1064 trace_find_cmdline(ent->pid, cmd);
1065
1066 return trace_seq_printf(s, "[%s]\n", cmd);
1061} 1067}
1062 1068
1063static int blk_log_unplug(struct trace_seq *s, const struct trace_entry *ent) 1069static int blk_log_unplug(struct trace_seq *s, const struct trace_entry *ent)
1064{ 1070{
1065 return trace_seq_printf(s, "[%s] %llu\n", trace_find_cmdline(ent->pid), 1071 char cmd[TASK_COMM_LEN];
1066 get_pdu_int(ent)); 1072
1073 trace_find_cmdline(ent->pid, cmd);
1074
1075 return trace_seq_printf(s, "[%s] %llu\n", cmd, get_pdu_int(ent));
1067} 1076}
1068 1077
1069static int blk_log_split(struct trace_seq *s, const struct trace_entry *ent) 1078static int blk_log_split(struct trace_seq *s, const struct trace_entry *ent)
1070{ 1079{
1080 char cmd[TASK_COMM_LEN];
1081
1082 trace_find_cmdline(ent->pid, cmd);
1083
1071 return trace_seq_printf(s, "%llu / %llu [%s]\n", t_sector(ent), 1084 return trace_seq_printf(s, "%llu / %llu [%s]\n", t_sector(ent),
1072 get_pdu_int(ent), trace_find_cmdline(ent->pid)); 1085 get_pdu_int(ent), cmd);
1073} 1086}
1074 1087
1075/* 1088/*