return ret;
  
   out_reg:
-       ret = alloc_snapshot(&global_trace);
 -      ret = register_ftrace_function_probe(glob, tr, ops, count);
++      ret = alloc_snapshot(tr);
 +      if (ret < 0)
 +              goto out;
  
-       ret = register_ftrace_function_probe(glob, ops, count);
 -      if (ret >= 0)
 -              alloc_snapshot(tr);
++      ret = register_ftrace_function_probe(glob, tr, ops, count);
  
 + out:
        return ret < 0 ? ret : 0;
  }
  
 
  void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d_tracer);
  void ftrace_init_tracefs_toplevel(struct trace_array *tr,
                                  struct dentry *d_tracer);
 +void ftrace_clear_pids(struct trace_array *tr);
+ int init_function_trace(void);
+ void ftrace_pid_follow_fork(struct trace_array *tr, bool enable);
  #else
  static inline int ftrace_trace_task(struct trace_array *tr)
  {
  static inline void ftrace_reset_array_ops(struct trace_array *tr) { }
  static inline void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d) { }
  static inline void ftrace_init_tracefs_toplevel(struct trace_array *tr, struct dentry *d) { }
 +static inline void ftrace_clear_pids(struct trace_array *tr) { }
+ static inline int init_function_trace(void) { return 0; }
+ static inline void ftrace_pid_follow_fork(struct trace_array *tr, bool enable) { }
  /* ftace_func_t type is not defined, use macro instead of static inline */
  #define ftrace_init_array_ops(tr, func) do { } while (0)
  #endif /* CONFIG_FUNCTION_TRACER */