X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fkernel.c;h=8a4652aecf4f548658f716d63aa0a71b0e1e3661;hp=fc817b2db304187675a38e1c5d8904658fe670a5;hb=71a3bb01e288ad6e611be0501a4444375c4124a7;hpb=0ef0325590ac65995f926a031e2f085531f74090 diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c index fc817b2db..8a4652aec 100644 --- a/src/bin/lttng-sessiond/kernel.c +++ b/src/bin/lttng-sessiond/kernel.c @@ -201,60 +201,73 @@ int kernel_create_event(struct lttng_event *ev, char *filter_expression, struct lttng_filter_bytecode *filter) { - int ret; + int err, fd; + enum lttng_error_code ret; struct ltt_kernel_event *event; assert(ev); assert(channel); /* We pass ownership of filter_expression and filter */ - event = trace_kernel_create_event(ev, filter_expression, - filter); - if (event == NULL) { - ret = -1; + ret = trace_kernel_create_event(ev, filter_expression, + filter, &event); + if (ret != LTTNG_OK) { goto error; } - ret = kernctl_create_event(channel->fd, event->event); - if (ret < 0) { - switch (-ret) { + fd = kernctl_create_event(channel->fd, event->event); + if (fd < 0) { + switch (-fd) { case EEXIST: + ret = LTTNG_ERR_KERN_EVENT_EXIST; break; case ENOSYS: WARN("Event type not implemented"); + ret = LTTNG_ERR_KERN_EVENT_ENOSYS; break; case ENOENT: WARN("Event %s not found!", ev->name); + ret = LTTNG_ERR_KERN_ENABLE_FAIL; break; default: + ret = LTTNG_ERR_KERN_ENABLE_FAIL; PERROR("create event ioctl"); } goto free_event; } event->type = ev->type; - event->fd = ret; + event->fd = fd; /* Prevent fd duplication after execlp() */ - ret = fcntl(event->fd, F_SETFD, FD_CLOEXEC); - if (ret < 0) { + err = fcntl(event->fd, F_SETFD, FD_CLOEXEC); + if (err < 0) { PERROR("fcntl session fd"); } if (filter) { - ret = kernctl_filter(event->fd, filter); - if (ret) { + err = kernctl_filter(event->fd, filter); + if (err < 0) { + switch (-err) { + case ENOMEM: + ret = LTTNG_ERR_FILTER_NOMEM; + break; + default: + ret = LTTNG_ERR_FILTER_INVAL; + break; + } goto filter_error; } } - ret = kernctl_enable(event->fd); - if (ret < 0) { - switch (-ret) { + err = kernctl_enable(event->fd); + if (err < 0) { + switch (-err) { case EEXIST: ret = LTTNG_ERR_KERN_EVENT_EXIST; break; default: PERROR("enable kernel event"); + ret = LTTNG_ERR_KERN_ENABLE_FAIL; break; } goto enable_error;