Fix: kernel/ust snapshot backward compat for 2.10 relay
[lttng-tools.git] / src / bin / lttng-sessiond / kernel.c
index 4fdc34bad23fb329edf97b893ca8d103c4982cd6..53072f97187654dc37db1b6042f8100b375cbb70 100644 (file)
@@ -131,6 +131,7 @@ int kernel_create_session(struct ltt_session *session, int tracer_fd)
 error:
        if (lks) {
                trace_kernel_destroy_session(lks);
+               trace_kernel_free_session(lks);
        }
        return ret;
 }
@@ -1156,7 +1157,7 @@ end_boot_id:
 }
 
 /*
- * Complete teardown of a kernel session.
+ * Teardown of a kernel session, keeping data required by destroy notifiers.
  */
 void kernel_destroy_session(struct ltt_kernel_session *ksess)
 {
@@ -1205,6 +1206,15 @@ void kernel_destroy_session(struct ltt_kernel_session *ksess)
        lttng_trace_chunk_put(trace_chunk);
 }
 
+/* Teardown of data required by destroy notifiers. */
+void kernel_free_session(struct ltt_kernel_session *ksess)
+{
+       if (ksess == NULL) {
+               return;
+       }
+       trace_kernel_free_session(ksess);
+}
+
 /*
  * Destroy a kernel channel object. It does not do anything on the tracer side.
  */
@@ -1250,6 +1260,7 @@ enum lttng_error_code kernel_snapshot_record(
        struct consumer_socket *socket;
        struct lttng_ht_iter iter;
        struct ltt_kernel_metadata *saved_metadata;
+       char *trace_path = NULL;
 
        assert(ksess);
        assert(ksess->consumer);
@@ -1275,6 +1286,12 @@ enum lttng_error_code kernel_snapshot_record(
                goto error_open_stream;
        }
 
+       trace_path = setup_channel_trace_path(ksess->consumer,
+                       DEFAULT_KERNEL_TRACE_DIR);
+       if (!trace_path) {
+               status = LTTNG_ERR_INVALID;
+               goto error;
+       }
        /* Send metadata to consumer and snapshot everything. */
        cds_lfht_for_each_entry(output->socks->ht, &iter.iter,
                        socket, node.node) {
@@ -1293,7 +1310,7 @@ enum lttng_error_code kernel_snapshot_record(
                cds_list_for_each_entry(chan, &ksess->channel_list.head, list) {
                        status = consumer_snapshot_channel(socket, chan->key, output, 0,
                                        ksess->uid, ksess->gid,
-                                       DEFAULT_KERNEL_TRACE_DIR, wait,
+                                       trace_path, wait,
                                        nb_packets_per_stream);
                        if (status != LTTNG_OK) {
                                (void) kernel_consumer_destroy_metadata(socket,
@@ -1304,8 +1321,7 @@ enum lttng_error_code kernel_snapshot_record(
 
                /* Snapshot metadata, */
                status = consumer_snapshot_channel(socket, ksess->metadata->key, output,
-                               1, ksess->uid, ksess->gid,
-                               DEFAULT_KERNEL_TRACE_DIR, wait, 0);
+                               1, ksess->uid, ksess->gid, trace_path, wait, 0);
                if (status != LTTNG_OK) {
                        goto error_consumer;
                }
@@ -1331,6 +1347,7 @@ error:
        ksess->metadata = saved_metadata;
        ksess->metadata_stream_fd = saved_metadata_fd;
        rcu_read_unlock();
+       free(trace_path);
        return status;
 }
 
This page took 0.024284 seconds and 4 git commands to generate.