#include <linux/file.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
+#include <linux/err.h>
#include "wrapper/vmalloc.h" /* for wrapper_vmalloc_sync_all() */
#include "wrapper/ringbuffer/vfs.h"
#include "wrapper/ringbuffer/backend.h"
metadata_stream->priv = buf;
stream_priv = metadata_stream;
metadata_stream->transport = channel->transport;
+ mutex_init(&metadata_stream->lock);
/*
* Since life-time of metadata cache differs from that of
* will stay invariant for the rest of the session.
*/
event = lttng_event_create(channel, event_param, NULL, NULL);
- if (!event) {
- ret = -EINVAL;
+ WARN_ON_ONCE(!event);
+ if (IS_ERR(event)) {
+ ret = PTR_ERR(event);
goto event_error;
}
event_file->private_data = event;
atomic_long_inc(&channel_file->f_count);
break;
case LTTNG_KERNEL_SYSCALL:
- /*
- * Only all-syscall tracing supported for now.
- */
- if (event_param->name[0] != '\0')
- return -EINVAL;
ret = lttng_syscalls_register(channel, NULL);
if (ret)
goto fd_error;
event_fd = 0;
+ if (event_param->u.syscall.disable) {
+ ret = lttng_syscall_filter_disable(channel,
+ event_param->name[0] == '\0' ?
+ NULL : event_param->name);
+ if (ret)
+ goto fd_error;
+ } else {
+ ret = lttng_syscall_filter_enable(channel,
+ event_param->name[0] == '\0' ?
+ NULL : event_param->name);
+ if (ret)
+ goto fd_error;
+ }
break;
}
return event_fd;
struct lib_ring_buffer *buf = filp->private_data;
struct channel *chan = buf->backend.chan;
const struct lib_ring_buffer_config *config = &chan->backend.config;
- struct lttng_channel *lttng_chan = channel_get_private(chan);
+ const struct lttng_channel_ops *ops = chan->backend.priv_ops;
int ret;
if (atomic_read(&chan->record_disabled))
{
uint64_t ts;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->timestamp_begin(config, buf, &ts);
+ ret = ops->timestamp_begin(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
{
uint64_t ts;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->timestamp_end(config, buf, &ts);
+ ret = ops->timestamp_end(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
{
uint64_t ed;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->events_discarded(config, buf, &ed);
+ ret = ops->events_discarded(config, buf, &ed);
if (ret < 0)
goto error;
return put_u64(ed, arg);
{
uint64_t cs;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->content_size(config, buf, &cs);
+ ret = ops->content_size(config, buf, &cs);
if (ret < 0)
goto error;
return put_u64(cs, arg);
{
uint64_t ps;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->packet_size(config, buf, &ps);
+ ret = ops->packet_size(config, buf, &ps);
if (ret < 0)
goto error;
return put_u64(ps, arg);
{
uint64_t si;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->stream_id(config, buf, &si);
+ ret = ops->stream_id(config, buf, &si);
if (ret < 0)
goto error;
return put_u64(si, arg);
{
uint64_t ts;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->current_timestamp(config, buf, &ts);
+ ret = ops->current_timestamp(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
struct lib_ring_buffer *buf = filp->private_data;
struct channel *chan = buf->backend.chan;
const struct lib_ring_buffer_config *config = &chan->backend.config;
- struct lttng_channel *lttng_chan = channel_get_private(chan);
+ const struct lttng_channel_ops *ops = chan->backend.priv_ops;
int ret;
if (atomic_read(&chan->record_disabled))
{
uint64_t ts;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->timestamp_begin(config, buf, &ts);
+ ret = ops->timestamp_begin(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
{
uint64_t ts;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->timestamp_end(config, buf, &ts);
+ ret = ops->timestamp_end(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
{
uint64_t ed;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->events_discarded(config, buf, &ed);
+ ret = ops->events_discarded(config, buf, &ed);
if (ret < 0)
goto error;
return put_u64(ed, arg);
{
uint64_t cs;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->content_size(config, buf, &cs);
+ ret = ops->content_size(config, buf, &cs);
if (ret < 0)
goto error;
return put_u64(cs, arg);
{
uint64_t ps;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->packet_size(config, buf, &ps);
+ ret = ops->packet_size(config, buf, &ps);
if (ret < 0)
goto error;
return put_u64(ps, arg);
{
uint64_t si;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->stream_id(config, buf, &si);
+ ret = ops->stream_id(config, buf, &si);
if (ret < 0)
goto error;
return put_u64(si, arg);
{
uint64_t ts;
- if (!lttng_chan->ops)
- goto error;
- ret = lttng_chan->ops->current_timestamp(config, buf, &ts);
+ ret = ops->current_timestamp(config, buf, &ts);
if (ret < 0)
goto error;
return put_u64(ts, arg);
return ret;
}
-void __exit lttng_abi_exit(void)
+/* No __exit annotation because used by init error path too. */
+void lttng_abi_exit(void)
{
if (lttng_proc_dentry)
remove_proc_entry("lttng", NULL);