X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=lttng-abi.c;h=5bd7621f13ff5c503a55a4e57ada5b5e5678a451;hb=refs%2Fheads%2Fstable-2.5;hp=a373504c26d0d7804e22cafb4e0dcac3747212a9;hpb=35097f3627cd567d794ce4752327a50fb2f15791;p=lttng-modules.git diff --git a/lttng-abi.c b/lttng-abi.c index a373504c..5bd7621f 100644 --- a/lttng-abi.c +++ b/lttng-abi.c @@ -43,6 +43,7 @@ #include #include #include +#include #include "wrapper/vmalloc.h" /* for wrapper_vmalloc_sync_all() */ #include "wrapper/ringbuffer/vfs.h" #include "wrapper/ringbuffer/backend.h" @@ -540,9 +541,11 @@ unsigned int lttng_metadata_ring_buffer_poll(struct file *filp, if (finalized) mask |= POLLHUP; + mutex_lock(&stream->metadata_cache->lock); if (stream->metadata_cache->metadata_written > stream->metadata_out) mask |= POLLIN; + mutex_unlock(&stream->metadata_cache->lock); } return mask; @@ -912,8 +915,9 @@ int lttng_abi_create_event(struct file *channel_file, * 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; @@ -1194,8 +1198,8 @@ int lttng_metadata_channel_release(struct inode *inode, struct file *file) struct lttng_channel *channel = file->private_data; if (channel) { - lttng_metadata_channel_destroy(channel); fput(channel->session->file); + lttng_metadata_channel_destroy(channel); } return 0; @@ -1345,7 +1349,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, 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)) @@ -1356,9 +1360,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { 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); @@ -1367,9 +1369,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { 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); @@ -1378,9 +1378,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { 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); @@ -1389,9 +1387,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { 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); @@ -1400,9 +1396,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { 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); @@ -1411,9 +1405,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { 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); @@ -1422,9 +1414,7 @@ static long lttng_stream_ring_buffer_ioctl(struct file *filp, { 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); @@ -1445,7 +1435,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, 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)) @@ -1456,9 +1446,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { 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); @@ -1467,9 +1455,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { 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); @@ -1478,9 +1464,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { 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); @@ -1489,9 +1473,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { 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); @@ -1500,9 +1482,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { 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); @@ -1511,9 +1491,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { 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); @@ -1522,9 +1500,7 @@ static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, { 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); @@ -1581,7 +1557,8 @@ error: 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);