@@ -4022,6 +4022,11 @@ int tracing_open_generic_tr(struct inode *inode, struct file *filp)
40224022 if (ret )
40234023 return ret ;
40244024
4025+ if ((filp -> f_mode & FMODE_WRITE ) && trace_array_is_readonly (tr )) {
4026+ trace_array_put (tr );
4027+ return - EACCES ;
4028+ }
4029+
40254030 filp -> private_data = inode -> i_private ;
40264031
40274032 return 0 ;
@@ -7097,6 +7102,11 @@ static int tracing_clock_open(struct inode *inode, struct file *file)
70977102 if (ret )
70987103 return ret ;
70997104
7105+ if ((file -> f_mode & FMODE_WRITE ) && trace_array_is_readonly (tr )) {
7106+ trace_array_put (tr );
7107+ return - EACCES ;
7108+ }
7109+
71007110 ret = single_open (file , tracing_clock_show , inode -> i_private );
71017111 if (ret < 0 )
71027112 trace_array_put (tr );
@@ -9866,17 +9876,22 @@ static __init void create_trace_instances(struct dentry *d_tracer)
98669876static void
98679877init_tracer_tracefs (struct trace_array * tr , struct dentry * d_tracer )
98689878{
9879+ umode_t writable_mode = TRACE_MODE_WRITE ;
98699880 int cpu ;
98709881
9882+ if (trace_array_is_readonly (tr ))
9883+ writable_mode = TRACE_MODE_READ ;
9884+
98719885 trace_create_file ("available_tracers" , TRACE_MODE_READ , d_tracer ,
9872- tr , & show_traces_fops );
9886+ tr , & show_traces_fops );
98739887
9874- trace_create_file ("current_tracer" , TRACE_MODE_WRITE , d_tracer ,
9875- tr , & set_tracer_fops );
9888+ trace_create_file ("current_tracer" , writable_mode , d_tracer ,
9889+ tr , & set_tracer_fops );
98769890
9877- trace_create_file ("tracing_cpumask" , TRACE_MODE_WRITE , d_tracer ,
9891+ trace_create_file ("tracing_cpumask" , writable_mode , d_tracer ,
98789892 tr , & tracing_cpumask_fops );
98799893
9894+ /* Options are used for changing print-format even for readonly instance. */
98809895 trace_create_file ("trace_options" , TRACE_MODE_WRITE , d_tracer ,
98819896 tr , & tracing_iter_fops );
98829897
@@ -9886,12 +9901,36 @@ init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer)
98869901 trace_create_file ("trace_pipe" , TRACE_MODE_READ , d_tracer ,
98879902 tr , & tracing_pipe_fops );
98889903
9889- trace_create_file ("buffer_size_kb" , TRACE_MODE_WRITE , d_tracer ,
9904+ trace_create_file ("buffer_size_kb" , writable_mode , d_tracer ,
98909905 tr , & tracing_entries_fops );
98919906
98929907 trace_create_file ("buffer_total_size_kb" , TRACE_MODE_READ , d_tracer ,
98939908 tr , & tracing_total_entries_fops );
98949909
9910+ trace_create_file ("trace_clock" , writable_mode , d_tracer , tr ,
9911+ & trace_clock_fops );
9912+
9913+ trace_create_file ("timestamp_mode" , TRACE_MODE_READ , d_tracer , tr ,
9914+ & trace_time_stamp_mode_fops );
9915+
9916+ tr -> buffer_percent = 50 ;
9917+
9918+ trace_create_file ("buffer_subbuf_size_kb" , writable_mode , d_tracer ,
9919+ tr , & buffer_subbuf_size_fops );
9920+
9921+ create_trace_options_dir (tr );
9922+
9923+ if (tr -> range_addr_start )
9924+ trace_create_file ("last_boot_info" , TRACE_MODE_READ , d_tracer ,
9925+ tr , & last_boot_fops );
9926+
9927+ for_each_tracing_cpu (cpu )
9928+ tracing_init_tracefs_percpu (tr , cpu );
9929+
9930+ /* Read-only instance has above files only. */
9931+ if (trace_array_is_readonly (tr ))
9932+ return ;
9933+
98959934 trace_create_file ("free_buffer" , 0200 , d_tracer ,
98969935 tr , & tracing_free_buffer_fops );
98979936
@@ -9903,49 +9942,29 @@ init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer)
99039942 trace_create_file ("trace_marker_raw" , 0220 , d_tracer ,
99049943 tr , & tracing_mark_raw_fops );
99059944
9906- trace_create_file ("trace_clock" , TRACE_MODE_WRITE , d_tracer , tr ,
9907- & trace_clock_fops );
9908-
9909- trace_create_file ("tracing_on" , TRACE_MODE_WRITE , d_tracer ,
9910- tr , & rb_simple_fops );
9911-
9912- trace_create_file ("timestamp_mode" , TRACE_MODE_READ , d_tracer , tr ,
9913- & trace_time_stamp_mode_fops );
9914-
9915- tr -> buffer_percent = 50 ;
9916-
99179945 trace_create_file ("buffer_percent" , TRACE_MODE_WRITE , d_tracer ,
9918- tr , & buffer_percent_fops );
9919-
9920- trace_create_file ("buffer_subbuf_size_kb" , TRACE_MODE_WRITE , d_tracer ,
9921- tr , & buffer_subbuf_size_fops );
9946+ tr , & buffer_percent_fops );
99229947
99239948 trace_create_file ("syscall_user_buf_size" , TRACE_MODE_WRITE , d_tracer ,
9924- tr , & tracing_syscall_buf_fops );
9949+ tr , & tracing_syscall_buf_fops );
99259950
9926- create_trace_options_dir (tr );
9951+ trace_create_file ("tracing_on" , TRACE_MODE_WRITE , d_tracer ,
9952+ tr , & rb_simple_fops );
99279953
99289954 trace_create_maxlat_file (tr , d_tracer );
99299955
99309956 if (ftrace_create_function_files (tr , d_tracer ))
99319957 MEM_FAIL (1 , "Could not allocate function filter files" );
99329958
9933- if (tr -> range_addr_start ) {
9934- trace_create_file ("last_boot_info" , TRACE_MODE_READ , d_tracer ,
9935- tr , & last_boot_fops );
99369959#ifdef CONFIG_TRACER_SNAPSHOT
9937- } else {
9960+ if (! tr -> range_addr_start )
99389961 trace_create_file ("snapshot" , TRACE_MODE_WRITE , d_tracer ,
99399962 tr , & snapshot_fops );
99409963#endif
9941- }
99429964
99439965 trace_create_file ("error_log" , TRACE_MODE_WRITE , d_tracer ,
99449966 tr , & tracing_err_log_fops );
99459967
9946- for_each_tracing_cpu (cpu )
9947- tracing_init_tracefs_percpu (tr , cpu );
9948-
99499968 ftrace_init_tracefs (tr , d_tracer );
99509969}
99519970
@@ -10772,7 +10791,7 @@ __init static void enable_instances(void)
1077210791 * Backup buffers can be freed but need vfree().
1077310792 */
1077410793 if (backup )
10775- tr -> flags |= TRACE_ARRAY_FL_VMALLOC ;
10794+ tr -> flags |= TRACE_ARRAY_FL_VMALLOC | TRACE_ARRAY_FL_RDONLY ;
1077610795
1077710796 if (start || backup ) {
1077810797 tr -> flags |= TRACE_ARRAY_FL_BOOT | TRACE_ARRAY_FL_LAST_BOOT ;
0 commit comments