ftrace: fix trace_output
authorLai Jiangshan <laijs@cn.fujitsu.com>
Thu, 15 Jan 2009 10:05:40 +0000 (18:05 +0800)
committerIngo Molnar <mingo@elte.hu>
Fri, 16 Jan 2009 11:15:20 +0000 (12:15 +0100)
Impact: fix bug for handling partial line

trace_seq_printf(), seq_print_userip_objs(), ... return
0          -- partial line was written
other(>0)  -- success

duplicate output is also removed in trace_print_raw().

Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/trace/trace_output.c
kernel/trace/trace_output.h

index df0c25c..4e3ad36 100644 (file)
@@ -440,9 +440,9 @@ trace_fn_raw(struct trace_seq *s, struct trace_entry *entry, int flags)
 
        trace_assign_type(field, entry);
 
-       if (trace_seq_printf(s, "%x %x\n",
-                            field->ip,
-                            field->parent_ip))
+       if (!trace_seq_printf(s, "%x %x\n",
+                             field->ip,
+                             field->parent_ip))
                return TRACE_TYPE_PARTIAL_LINE;
 
        return 0;
@@ -497,14 +497,14 @@ trace_ctxwake_print(struct trace_seq *s, struct trace_entry *entry, int flags,
        T = task_state_char(field->next_state);
        S = task_state_char(field->prev_state);
        comm = trace_find_cmdline(field->next_pid);
-       if (trace_seq_printf(s, " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n",
-                            field->prev_pid,
-                            field->prev_prio,
-                            S, delim,
-                            field->next_cpu,
-                            field->next_pid,
-                            field->next_prio,
-                            T, comm))
+       if (!trace_seq_printf(s, " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n",
+                             field->prev_pid,
+                             field->prev_prio,
+                             S, delim,
+                             field->next_cpu,
+                             field->next_pid,
+                             field->next_prio,
+                             T, comm))
                return TRACE_TYPE_PARTIAL_LINE;
 
        return 0;
@@ -534,14 +534,14 @@ trace_ctxwake_raw(struct trace_seq *s, struct trace_entry *entry, int flags,
        if (!S)
                task_state_char(field->prev_state);
        T = task_state_char(field->next_state);
-       if (trace_seq_printf(s, "%d %d %c %d %d %d %c\n",
-                            field->prev_pid,
-                            field->prev_prio,
-                            S,
-                            field->next_cpu,
-                            field->next_pid,
-                            field->next_prio,
-                            T))
+       if (!trace_seq_printf(s, "%d %d %c %d %d %d %c\n",
+                             field->prev_pid,
+                             field->prev_prio,
+                             S,
+                             field->next_cpu,
+                             field->next_pid,
+                             field->next_prio,
+                             T))
                return TRACE_TYPE_PARTIAL_LINE;
 
        return 0;
@@ -639,10 +639,10 @@ trace_special_print(struct trace_seq *s, struct trace_entry *entry, int flags)
 
        trace_assign_type(field, entry);
 
-       if (trace_seq_printf(s, "# %ld %ld %ld\n",
-                            field->arg1,
-                            field->arg2,
-                            field->arg3))
+       if (!trace_seq_printf(s, "# %ld %ld %ld\n",
+                             field->arg1,
+                             field->arg2,
+                             field->arg3))
                return TRACE_TYPE_PARTIAL_LINE;
 
        return 0;
@@ -697,13 +697,13 @@ trace_stack_print(struct trace_seq *s, struct trace_entry *entry, int flags)
 
        for (i = 0; i < FTRACE_STACK_ENTRIES; i++) {
                if (i) {
-                       if (trace_seq_puts(s, " <= "))
+                       if (!trace_seq_puts(s, " <= "))
                                goto partial;
 
-                       if (seq_print_ip_sym(s, field->caller[i], flags))
+                       if (!seq_print_ip_sym(s, field->caller[i], flags))
                                goto partial;
                }
-               if (trace_seq_puts(s, "\n"))
+               if (!trace_seq_puts(s, "\n"))
                        goto partial;
        }
 
@@ -731,10 +731,10 @@ trace_user_stack_print(struct trace_seq *s, struct trace_entry *entry,
 
        trace_assign_type(field, entry);
 
-       if (seq_print_userip_objs(field, s, flags))
+       if (!seq_print_userip_objs(field, s, flags))
                goto partial;
 
-       if (trace_seq_putc(s, '\n'))
+       if (!trace_seq_putc(s, '\n'))
                goto partial;
 
        return 0;
@@ -760,10 +760,10 @@ trace_print_print(struct trace_seq *s, struct trace_entry *entry, int flags)
 
        trace_assign_type(field, entry);
 
-       if (seq_print_ip_sym(s, field->ip, flags))
+       if (!seq_print_ip_sym(s, field->ip, flags))
                goto partial;
 
-       if (trace_seq_printf(s, ": %s", field->buf))
+       if (!trace_seq_printf(s, ": %s", field->buf))
                goto partial;
 
        return 0;
@@ -779,10 +779,7 @@ trace_print_raw(struct trace_seq *s, struct trace_entry *entry, int flags)
 
        trace_assign_type(field, entry);
 
-       if (seq_print_ip_sym(s, field->ip, flags))
-               goto partial;
-
-       if (trace_seq_printf(s, "# %lx %s", field->ip, field->buf))
+       if (!trace_seq_printf(s, "# %lx %s", field->ip, field->buf))
                goto partial;
 
        return 0;
index ecab4ea..b2c1461 100644 (file)
@@ -45,14 +45,14 @@ trace_nop_print(struct trace_seq *s, struct trace_entry *entry, int flags);
 #define SEQ_PUT_FIELD_RET(s, x)                                \
 do {                                                   \
        if (!trace_seq_putmem(s, &(x), sizeof(x)))      \
-               return 0;                               \
+               return TRACE_TYPE_PARTIAL_LINE;         \
 } while (0)
 
 #define SEQ_PUT_HEX_FIELD_RET(s, x)                    \
 do {                                                   \
        BUILD_BUG_ON(sizeof(x) > MAX_MEMHEX_BYTES);     \
        if (!trace_seq_putmem_hex(s, &(x), sizeof(x)))  \
-               return 0;                               \
+               return TRACE_TYPE_PARTIAL_LINE;         \
 } while (0)
 
 #endif