/* tracer_enabled is used to toggle activation of a tracer */
 static int                     tracer_enabled = 1;
 
+/* function tracing enabled */
+int                            ftrace_function_enabled;
+
 /*
  * trace_nr_entries is the number of entries that is allocated
  * for a buffer. Note, the number of entries is always rounded
 {
        int cpu;
 
+       ftrace_function_enabled = 0;
        if(tr->ctrl)
                for_each_online_cpu(cpu)
                        tracing_reset(tr->data[cpu]);
        long disabled;
        int cpu;
 
-       if (unlikely(!tracer_enabled))
+       if (unlikely(!ftrace_function_enabled))
                return;
 
        if (skip_trace(ip))
 
 void tracing_start_function_trace(void)
 {
+       ftrace_function_enabled = 0;
        register_ftrace_function(&trace_ops);
+       if (tracer_enabled)
+               ftrace_function_enabled = 1;
 }
 
 void tracing_stop_function_trace(void)
 {
+       ftrace_function_enabled = 0;
        unregister_ftrace_function(&trace_ops);
 }
 #endif
                m->private = iter;
 
                /* stop the trace while dumping */
-               if (iter->tr->ctrl)
+               if (iter->tr->ctrl) {
                        tracer_enabled = 0;
+                       ftrace_function_enabled = 0;
+               }
 
                if (iter->trace && iter->trace->open)
                        iter->trace->open(iter);
                iter->trace->close(iter);
 
        /* reenable tracing if it was previously enabled */
-       if (iter->tr->ctrl)
+       if (iter->tr->ctrl) {
                tracer_enabled = 1;
+               /*
+                * It is safe to enable function tracing even if it
+                * isn't used
+                */
+               ftrace_function_enabled = 1;
+       }
        mutex_unlock(&trace_types_lock);
 
        seq_release(inode, file);