|
@@ -980,21 +980,28 @@ static ssize_t
|
|
|
event_filter_read(struct file *filp, char __user *ubuf, size_t cnt,
|
|
|
loff_t *ppos)
|
|
|
{
|
|
|
- struct ftrace_event_call *call = filp->private_data;
|
|
|
+ struct ftrace_event_call *call;
|
|
|
struct trace_seq *s;
|
|
|
- int r;
|
|
|
+ int r = -ENODEV;
|
|
|
|
|
|
if (*ppos)
|
|
|
return 0;
|
|
|
|
|
|
s = kmalloc(sizeof(*s), GFP_KERNEL);
|
|
|
+
|
|
|
if (!s)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
trace_seq_init(s);
|
|
|
|
|
|
- print_event_filter(call, s);
|
|
|
- r = simple_read_from_buffer(ubuf, cnt, ppos, s->buffer, s->len);
|
|
|
+ mutex_lock(&event_mutex);
|
|
|
+ call = event_file_data(filp);
|
|
|
+ if (call)
|
|
|
+ print_event_filter(call, s);
|
|
|
+ mutex_unlock(&event_mutex);
|
|
|
+
|
|
|
+ if (call)
|
|
|
+ r = simple_read_from_buffer(ubuf, cnt, ppos, s->buffer, s->len);
|
|
|
|
|
|
kfree(s);
|
|
|
|
|
@@ -1005,9 +1012,9 @@ static ssize_t
|
|
|
event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt,
|
|
|
loff_t *ppos)
|
|
|
{
|
|
|
- struct ftrace_event_call *call = filp->private_data;
|
|
|
+ struct ftrace_event_call *call;
|
|
|
char *buf;
|
|
|
- int err;
|
|
|
+ int err = -ENODEV;
|
|
|
|
|
|
if (cnt >= PAGE_SIZE)
|
|
|
return -EINVAL;
|
|
@@ -1022,7 +1029,12 @@ event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt,
|
|
|
}
|
|
|
buf[cnt] = '\0';
|
|
|
|
|
|
- err = apply_event_filter(call, buf);
|
|
|
+ mutex_lock(&event_mutex);
|
|
|
+ call = event_file_data(filp);
|
|
|
+ if (call)
|
|
|
+ err = apply_event_filter(call, buf);
|
|
|
+ mutex_unlock(&event_mutex);
|
|
|
+
|
|
|
free_page((unsigned long) buf);
|
|
|
if (err < 0)
|
|
|
return err;
|