Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tracing: Add generic tracing_lseek() function

Trace event triggers added a lseek that uses the ftrace_filter_lseek()
function. Unfortunately, when function tracing is not configured in
that function is not defined and the kernel fails to build.

This is the second time that function was added to a file ops and
it broke the build due to requiring special config dependencies.

Make a generic tracing_lseek() that all the tracing utilities may
use.

Also, modify the old ftrace_filter_lseek() to return 0 instead of
1 on WRONLY. Not sure why it was a 1 as that does not make sense.

This also changes the old tracing_seek() to modify the file pos
pointer on WRONLY as well.

Reported-by: kbuild test robot <fengguang.wu@intel.com>
Tested-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Acked-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

+19 -28
-2
include/linux/ftrace.h
··· 570 570 ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; } 571 571 #endif /* CONFIG_DYNAMIC_FTRACE */ 572 572 573 - loff_t ftrace_filter_lseek(struct file *file, loff_t offset, int whence); 574 - 575 573 /* totally disable ftrace - can not re-enable after this */ 576 574 void ftrace_kill(void); 577 575
+6 -19
kernel/trace/ftrace.c
··· 1082 1082 1083 1083 static struct pid * const ftrace_swapper_pid = &init_struct_pid; 1084 1084 1085 - loff_t 1086 - ftrace_filter_lseek(struct file *file, loff_t offset, int whence) 1087 - { 1088 - loff_t ret; 1089 - 1090 - if (file->f_mode & FMODE_READ) 1091 - ret = seq_lseek(file, offset, whence); 1092 - else 1093 - file->f_pos = ret = 1; 1094 - 1095 - return ret; 1096 - } 1097 - 1098 1085 #ifdef CONFIG_DYNAMIC_FTRACE 1099 1086 1100 1087 #ifndef CONFIG_FTRACE_MCOUNT_RECORD ··· 2726 2739 * routine, you can use ftrace_filter_write() for the write 2727 2740 * routine if @flag has FTRACE_ITER_FILTER set, or 2728 2741 * ftrace_notrace_write() if @flag has FTRACE_ITER_NOTRACE set. 2729 - * ftrace_filter_lseek() should be used as the lseek routine, and 2742 + * tracing_lseek() should be used as the lseek routine, and 2730 2743 * release must call ftrace_regex_release(). 2731 2744 */ 2732 2745 int ··· 3754 3767 .open = ftrace_filter_open, 3755 3768 .read = seq_read, 3756 3769 .write = ftrace_filter_write, 3757 - .llseek = ftrace_filter_lseek, 3770 + .llseek = tracing_lseek, 3758 3771 .release = ftrace_regex_release, 3759 3772 }; 3760 3773 ··· 3762 3775 .open = ftrace_notrace_open, 3763 3776 .read = seq_read, 3764 3777 .write = ftrace_notrace_write, 3765 - .llseek = ftrace_filter_lseek, 3778 + .llseek = tracing_lseek, 3766 3779 .release = ftrace_regex_release, 3767 3780 }; 3768 3781 ··· 4025 4038 .open = ftrace_graph_open, 4026 4039 .read = seq_read, 4027 4040 .write = ftrace_graph_write, 4028 - .llseek = ftrace_filter_lseek, 4041 + .llseek = tracing_lseek, 4029 4042 .release = ftrace_graph_release, 4030 4043 }; 4031 4044 ··· 4033 4046 .open = ftrace_graph_notrace_open, 4034 4047 .read = seq_read, 4035 4048 .write = ftrace_graph_write, 4036 - .llseek = ftrace_filter_lseek, 4049 + .llseek = tracing_lseek, 4037 4050 .release = ftrace_graph_release, 4038 4051 }; 4039 4052 #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ ··· 4706 4719 .open = ftrace_pid_open, 4707 4720 .write = ftrace_pid_write, 4708 4721 .read = seq_read, 4709 - .llseek = ftrace_filter_lseek, 4722 + .llseek = tracing_lseek, 4710 4723 .release = ftrace_pid_release, 4711 4724 }; 4712 4725
+9 -5
kernel/trace/trace.c
··· 3183 3183 return count; 3184 3184 } 3185 3185 3186 - static loff_t tracing_seek(struct file *file, loff_t offset, int origin) 3186 + loff_t tracing_lseek(struct file *file, loff_t offset, int whence) 3187 3187 { 3188 + int ret; 3189 + 3188 3190 if (file->f_mode & FMODE_READ) 3189 - return seq_lseek(file, offset, origin); 3191 + ret = seq_lseek(file, offset, whence); 3190 3192 else 3191 - return 0; 3193 + file->f_pos = ret = 0; 3194 + 3195 + return ret; 3192 3196 } 3193 3197 3194 3198 static const struct file_operations tracing_fops = { 3195 3199 .open = tracing_open, 3196 3200 .read = seq_read, 3197 3201 .write = tracing_write_stub, 3198 - .llseek = tracing_seek, 3202 + .llseek = tracing_lseek, 3199 3203 .release = tracing_release, 3200 3204 }; 3201 3205 ··· 4944 4940 .open = tracing_snapshot_open, 4945 4941 .read = seq_read, 4946 4942 .write = tracing_snapshot_write, 4947 - .llseek = tracing_seek, 4943 + .llseek = tracing_lseek, 4948 4944 .release = tracing_snapshot_release, 4949 4945 }; 4950 4946
+2
kernel/trace/trace.h
··· 588 588 int register_tracer(struct tracer *type); 589 589 int is_tracing_stopped(void); 590 590 591 + loff_t tracing_lseek(struct file *file, loff_t offset, int whence); 592 + 591 593 extern cpumask_var_t __read_mostly tracing_buffer_mask; 592 594 593 595 #define for_each_tracing_cpu(cpu) \
+1 -1
kernel/trace/trace_events_trigger.c
··· 281 281 .open = event_trigger_open, 282 282 .read = seq_read, 283 283 .write = event_trigger_write, 284 - .llseek = ftrace_filter_lseek, 284 + .llseek = tracing_lseek, 285 285 .release = event_trigger_release, 286 286 }; 287 287
+1 -1
kernel/trace/trace_stack.c
··· 382 382 .open = stack_trace_filter_open, 383 383 .read = seq_read, 384 384 .write = ftrace_filter_write, 385 - .llseek = ftrace_filter_lseek, 385 + .llseek = tracing_lseek, 386 386 .release = ftrace_regex_release, 387 387 }; 388 388