tracing/filters: add missing unlock in a failure path
authorLi Zefan <lizf@cn.fujitsu.com>
Fri, 15 May 2009 03:07:27 +0000 (11:07 +0800)
committerSteven Rostedt <rostedt@goodmis.org>
Fri, 15 May 2009 03:55:10 +0000 (23:55 -0400)
[ Impact: fix deadlock in a rare case we fail to allocate memory ]

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
LKML-Reference: <4A0CDC6F.7070200@cn.fujitsu.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/trace_events_filter.c

index 85ad6a8..22c2998 100644 (file)
@@ -1079,9 +1079,10 @@ int apply_event_filter(struct ftrace_event_call *call, char *filter_string)
                return 0;
        }
 
+       err = -ENOMEM;
        ps = kzalloc(sizeof(*ps), GFP_KERNEL);
        if (!ps)
-               return -ENOMEM;
+               goto out_unlock;
 
        filter_disable_preds(call);
        replace_filter_string(call->filter, filter_string);
@@ -1101,7 +1102,7 @@ out:
        filter_opstack_clear(ps);
        postfix_clear(ps);
        kfree(ps);
-
+out_unlock:
        mutex_unlock(&filter_mutex);
 
        return err;
@@ -1123,9 +1124,10 @@ int apply_subsystem_event_filter(struct event_subsystem *system,
                return 0;
        }
 
+       err = -ENOMEM;
        ps = kzalloc(sizeof(*ps), GFP_KERNEL);
        if (!ps)
-               return -ENOMEM;
+               goto out_unlock;
 
        filter_free_subsystem_preds(system);
        replace_filter_string(system->filter, filter_string);
@@ -1145,7 +1147,7 @@ out:
        filter_opstack_clear(ps);
        postfix_clear(ps);
        kfree(ps);
-
+out_unlock:
        mutex_unlock(&filter_mutex);
 
        return err;