X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=lttng-abi.c;h=26a456ece13f7ed0a62b5e3b3e92d2cff942c17c;hb=3247f8bdd114fca353868caaf014f1806241293f;hp=45d78d9750c3473b71b3aa9469ada486e78767e0;hpb=aeb9064daf62485f8f7f6ec71019168ecbe4b0a7;p=lttng-modules.git diff --git a/lttng-abi.c b/lttng-abi.c index 45d78d97..26a456ec 100644 --- a/lttng-abi.c +++ b/lttng-abi.c @@ -539,7 +539,7 @@ unsigned int lttng_metadata_ring_buffer_poll(struct file *filp, mask |= POLLHUP; if (stream->metadata_cache->metadata_written > - stream->metadata_cache_read) + stream->metadata_out) mask |= POLLIN; } @@ -547,7 +547,7 @@ unsigned int lttng_metadata_ring_buffer_poll(struct file *filp, } static -int lttng_metadata_ring_buffer_ioctl_get_subbuf(struct file *filp, +int lttng_metadata_ring_buffer_ioctl_get_next_subbuf(struct file *filp, unsigned int cmd, unsigned long arg) { struct lttng_metadata_stream *stream = filp->private_data; @@ -564,6 +564,15 @@ int lttng_metadata_ring_buffer_ioctl_get_subbuf(struct file *filp, return ret; } +static +void lttng_metadata_ring_buffer_ioctl_put_next_subbuf(struct file *filp, + unsigned int cmd, unsigned long arg) +{ + struct lttng_metadata_stream *stream = filp->private_data; + + stream->metadata_out = stream->metadata_in; +} + static long lttng_metadata_ring_buffer_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) @@ -573,21 +582,41 @@ long lttng_metadata_ring_buffer_ioctl(struct file *filp, struct lib_ring_buffer *buf = stream->priv; switch (cmd) { - case RING_BUFFER_GET_SUBBUF: case RING_BUFFER_GET_NEXT_SUBBUF: { - ret = lttng_metadata_ring_buffer_ioctl_get_subbuf(filp, + ret = lttng_metadata_ring_buffer_ioctl_get_next_subbuf(filp, cmd, arg); if (ret < 0) goto err; break; } + case RING_BUFFER_GET_SUBBUF: + { + /* + * Random access is not allowed for metadata channel. + */ + return -ENOSYS; + } default: break; } + /* PUT_SUBBUF is the one from lib ring buffer, unmodified. */ + /* Performing lib ring buffer ioctl after our own. */ - return lib_ring_buffer_ioctl(filp, cmd, arg, buf); + ret = lib_ring_buffer_ioctl(filp, cmd, arg, buf); + if (ret < 0) + goto err; + switch (cmd) { + case RING_BUFFER_PUT_NEXT_SUBBUF: + { + lttng_metadata_ring_buffer_ioctl_put_next_subbuf(filp, + cmd, arg); + break; + } + default: + break; + } err: return ret; } @@ -602,21 +631,41 @@ long lttng_metadata_ring_buffer_compat_ioctl(struct file *filp, struct lib_ring_buffer *buf = stream->priv; switch (cmd) { - case RING_BUFFER_GET_SUBBUF: case RING_BUFFER_GET_NEXT_SUBBUF: { - ret = lttng_metadata_ring_buffer_ioctl_get_subbuf(filp, + ret = lttng_metadata_ring_buffer_ioctl_get_next_subbuf(filp, cmd, arg); if (ret < 0) goto err; break; } + case RING_BUFFER_GET_SUBBUF: + { + /* + * Random access is not allowed for metadata channel. + */ + return -ENOSYS; + } default: break; } + /* PUT_SUBBUF is the one from lib ring buffer, unmodified. */ + /* Performing lib ring buffer ioctl after our own. */ - return lib_ring_buffer_compat_ioctl(filp, cmd, arg, buf); + ret = lib_ring_buffer_compat_ioctl(filp, cmd, arg, buf); + if (ret < 0) + goto err; + switch (cmd) { + case RING_BUFFER_PUT_NEXT_SUBBUF: + { + lttng_metadata_ring_buffer_ioctl_put_next_subbuf(filp, + cmd, arg); + break; + } + default: + break; + } err: return ret; } @@ -637,8 +686,11 @@ int lttng_metadata_ring_buffer_release(struct inode *inode, struct file *file) { struct lttng_metadata_stream *stream = file->private_data; struct lib_ring_buffer *buf = stream->priv; + struct channel *chan = buf->backend.chan; + struct lttng_channel *lttng_chan = channel_get_private(chan); kref_put(&stream->metadata_cache->refcount, metadata_cache_destroy); + fput(lttng_chan->file); return lib_ring_buffer_release(inode, file, buf); } @@ -770,6 +822,7 @@ int lttng_abi_open_metadata_stream(struct file *channel_file) if (ret < 0) goto fd_error; + atomic_long_inc(&channel_file->f_count); kref_get(&session->metadata_cache->refcount); list_add(&metadata_stream->list, &session->metadata_cache->metadata_stream);