Merge branch 'linus' into tracing/core
[linux-2.6.git] / kernel / trace / trace_stat.c
index f069461..07c60b0 100644 (file)
@@ -76,7 +76,7 @@ static struct rb_node *release_next(struct tracer_stat *ts,
        }
 }
 
-static void reset_stat_session(struct stat_session *session)
+static void __reset_stat_session(struct stat_session *session)
 {
        struct rb_node *node = session->stat_root.rb_node;
 
@@ -86,10 +86,17 @@ static void reset_stat_session(struct stat_session *session)
        session->stat_root = RB_ROOT;
 }
 
+static void reset_stat_session(struct stat_session *session)
+{
+       mutex_lock(&session->stat_mutex);
+       __reset_stat_session(session);
+       mutex_unlock(&session->stat_mutex);
+}
+
 static void destroy_session(struct stat_session *session)
 {
        debugfs_remove(session->file);
-       reset_stat_session(session);
+       __reset_stat_session(session);
        mutex_destroy(&session->stat_mutex);
        kfree(session);
 }
@@ -153,7 +160,7 @@ static int stat_seq_init(struct stat_session *session)
        int i;
 
        mutex_lock(&session->stat_mutex);
-       reset_stat_session(session);
+       __reset_stat_session(session);
 
        if (!ts->stat_cmp)
                ts->stat_cmp = dummy_cmp;
@@ -186,7 +193,7 @@ exit:
        return ret;
 
 exit_free_rbtree:
-       reset_stat_session(session);
+       __reset_stat_session(session);
        mutex_unlock(&session->stat_mutex);
        return ret;
 }
@@ -253,16 +260,21 @@ static const struct seq_operations trace_stat_seq_ops = {
 static int tracing_stat_open(struct inode *inode, struct file *file)
 {
        int ret;
-
+       struct seq_file *m;
        struct stat_session *session = inode->i_private;
 
+       ret = stat_seq_init(session);
+       if (ret)
+               return ret;
+
        ret = seq_open(file, &trace_stat_seq_ops);
-       if (!ret) {
-               struct seq_file *m = file->private_data;
-               m->private = session;
-               ret = stat_seq_init(session);
+       if (ret) {
+               reset_stat_session(session);
+               return ret;
        }
 
+       m = file->private_data;
+       m->private = session;
        return ret;
 }
 
@@ -273,11 +285,9 @@ static int tracing_stat_release(struct inode *i, struct file *f)
 {
        struct stat_session *session = i->i_private;
 
-       mutex_lock(&session->stat_mutex);
        reset_stat_session(session);
-       mutex_unlock(&session->stat_mutex);
 
-       return 0;
+       return seq_release(i, f);
 }
 
 static const struct file_operations tracing_stat_fops = {