trace_kernel_create_event() now returns an error code
[lttng-tools.git] / src / bin / lttng-sessiond / kernel.c
index ccf315d8901efdcb2e04e50a4de9e85e1073bca2..8a4652aecf4f548658f716d63aa0a71b0e1e3661 100644 (file)
@@ -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;
@@ -990,6 +1003,8 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess,
        struct consumer_socket *socket;
        struct lttng_ht_iter iter;
        struct ltt_kernel_metadata *saved_metadata;
+       struct ltt_session *session;
+       uint64_t trace_archive_id;
 
        assert(ksess);
        assert(ksess->consumer);
@@ -997,6 +1012,12 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess,
 
        DBG("Kernel snapshot record started");
 
+       session = session_find_by_id(ksess->id);
+       assert(session);
+       assert(pthread_mutex_trylock(&session->lock));
+       assert(session_trylock_list());
+       trace_archive_id = session->current_archive_id;
+
        /* Save current metadata since the following calls will change it. */
        saved_metadata = ksess->metadata;
        saved_metadata_fd = ksess->metadata_stream_fd;
@@ -1044,7 +1065,8 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess,
                        ret = consumer_snapshot_channel(socket, chan->key, output, 0,
                                        ksess->uid, ksess->gid,
                                        DEFAULT_KERNEL_TRACE_DIR, wait,
-                                       nb_packets_per_stream);
+                                       nb_packets_per_stream,
+                                       trace_archive_id);
                        if (ret < 0) {
                                ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
                                (void) kernel_consumer_destroy_metadata(socket,
@@ -1056,7 +1078,8 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess,
                /* Snapshot metadata, */
                ret = consumer_snapshot_channel(socket, ksess->metadata->key, output,
                                1, ksess->uid, ksess->gid,
-                               DEFAULT_KERNEL_TRACE_DIR, wait, 0);
+                               DEFAULT_KERNEL_TRACE_DIR, wait, 0,
+                               trace_archive_id);
                if (ret < 0) {
                        ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
                        goto error_consumer;
@@ -1169,7 +1192,7 @@ int kernel_rotate_session(struct ltt_session *session)
                 * reach 0 before we complete the iteration over all
                 * the channels.
                 */
-               ret = rotate_add_channel_pending(ksess->metadata->fd,
+               ret = rotate_add_channel_pending(ksess->metadata->key,
                                LTTNG_DOMAIN_KERNEL, session);
                if (ret < 0) {
                        ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
@@ -1190,7 +1213,7 @@ int kernel_rotate_session(struct ltt_session *session)
                                        ksess->uid, ksess->gid, ksess->consumer,
                                        ksess->consumer->subdir,
                                        /* is_metadata_channel */ false,
-                                       session->rotate_count,
+                                       session->current_archive_id,
                                        &session->rotate_pending_relay);
                        if (ret < 0) {
                                ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
@@ -1201,11 +1224,11 @@ int kernel_rotate_session(struct ltt_session *session)
                /*
                 * Rotate the metadata channel.
                 */
-               ret = consumer_rotate_channel(socket, ksess->metadata->fd,
+               ret = consumer_rotate_channel(socket, ksess->metadata->key,
                                ksess->uid, ksess->gid, ksess->consumer,
                                ksess->consumer->subdir,
                                /* is_metadata_channel */ true,
-                               session->rotate_count,
+                               session->current_archive_id,
                                &session->rotate_pending_relay);
                if (ret < 0) {
                        ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
This page took 0.027591 seconds and 5 git commands to generate.