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 | |
| 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')
| -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 | } |
