diff options
author | jolsa@redhat.com <jolsa@redhat.com> | 2009-09-11 11:29:28 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2009-09-11 14:47:11 -0400 |
commit | 489663644c35d50a20f58d468a7cbc705e6a29ce (patch) | |
tree | 2d5374e27493d43954d74bea3a895516b1be3f6d /kernel/trace/trace_events.c | |
parent | b63f39ea50330f836e301ddda21c6a93dcf0d6a3 (diff) |
tracing: trace parser support for set_event
Convert the parsing of the file 'set_event' to use the generic
trace_praser 'trace_get_user' function.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
LKML-Reference: <1252682969-3366-3-git-send-email-jolsa@redhat.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace/trace_events.c')
-rw-r--r-- | kernel/trace/trace_events.c | 60 |
1 files changed, 13 insertions, 47 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 975f324a07e7..f46d14cefdec 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -230,11 +230,9 @@ static ssize_t | |||
230 | ftrace_event_write(struct file *file, const char __user *ubuf, | 230 | ftrace_event_write(struct file *file, const char __user *ubuf, |
231 | size_t cnt, loff_t *ppos) | 231 | size_t cnt, loff_t *ppos) |
232 | { | 232 | { |
233 | struct trace_parser parser; | ||
233 | size_t read = 0; | 234 | size_t read = 0; |
234 | int i, set = 1; | ||
235 | ssize_t ret; | 235 | ssize_t ret; |
236 | char *buf; | ||
237 | char ch; | ||
238 | 236 | ||
239 | if (!cnt || cnt < 0) | 237 | if (!cnt || cnt < 0) |
240 | return 0; | 238 | return 0; |
@@ -243,60 +241,28 @@ ftrace_event_write(struct file *file, const char __user *ubuf, | |||
243 | if (ret < 0) | 241 | if (ret < 0) |
244 | return ret; | 242 | return ret; |
245 | 243 | ||
246 | ret = get_user(ch, ubuf++); | 244 | if (trace_parser_get_init(&parser, EVENT_BUF_SIZE + 1)) |
247 | if (ret) | ||
248 | return ret; | ||
249 | read++; | ||
250 | cnt--; | ||
251 | |||
252 | /* skip white space */ | ||
253 | while (cnt && isspace(ch)) { | ||
254 | ret = get_user(ch, ubuf++); | ||
255 | if (ret) | ||
256 | return ret; | ||
257 | read++; | ||
258 | cnt--; | ||
259 | } | ||
260 | |||
261 | /* Only white space found? */ | ||
262 | if (isspace(ch)) { | ||
263 | file->f_pos += read; | ||
264 | ret = read; | ||
265 | return ret; | ||
266 | } | ||
267 | |||
268 | buf = kmalloc(EVENT_BUF_SIZE+1, GFP_KERNEL); | ||
269 | if (!buf) | ||
270 | return -ENOMEM; | 245 | return -ENOMEM; |
271 | 246 | ||
272 | if (cnt > EVENT_BUF_SIZE) | 247 | read = trace_get_user(&parser, ubuf, cnt, ppos); |
273 | cnt = EVENT_BUF_SIZE; | 248 | |
249 | if (trace_parser_loaded((&parser))) { | ||
250 | int set = 1; | ||
274 | 251 | ||
275 | i = 0; | 252 | if (*parser.buffer == '!') |
276 | while (cnt && !isspace(ch)) { | ||
277 | if (!i && ch == '!') | ||
278 | set = 0; | 253 | set = 0; |
279 | else | ||
280 | buf[i++] = ch; | ||
281 | 254 | ||
282 | ret = get_user(ch, ubuf++); | 255 | parser.buffer[parser.idx] = 0; |
256 | |||
257 | ret = ftrace_set_clr_event(parser.buffer + !set, set); | ||
283 | if (ret) | 258 | if (ret) |
284 | goto out_free; | 259 | goto out_put; |
285 | read++; | ||
286 | cnt--; | ||
287 | } | 260 | } |
288 | buf[i] = 0; | ||
289 | |||
290 | file->f_pos += read; | ||
291 | |||
292 | ret = ftrace_set_clr_event(buf, set); | ||
293 | if (ret) | ||
294 | goto out_free; | ||
295 | 261 | ||
296 | ret = read; | 262 | ret = read; |
297 | 263 | ||
298 | out_free: | 264 | out_put: |
299 | kfree(buf); | 265 | trace_parser_put(&parser); |
300 | 266 | ||
301 | return ret; | 267 | return ret; |
302 | } | 268 | } |