X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=lib%2Fringbuffer%2Fring_buffer_vfs.c;h=1708ffd6bc9b1b80f06da11af5cb7830c2a6923b;hb=58aa5d24fc1b9bc14fa91a2a9ca8467fb2541fec;hp=2558ab667666be50b29eb9df484d4ea3773d140d;hpb=24cedcfefbfe781af5430e07a327030cc7caddfc;p=lttng-modules.git diff --git a/lib/ringbuffer/ring_buffer_vfs.c b/lib/ringbuffer/ring_buffer_vfs.c index 2558ab66..1708ffd6 100644 --- a/lib/ringbuffer/ring_buffer_vfs.c +++ b/lib/ringbuffer/ring_buffer_vfs.c @@ -86,19 +86,24 @@ unsigned int lib_ring_buffer_poll(struct file *filp, poll_table *wait) struct lib_ring_buffer *buf = filp->private_data; struct channel *chan = buf->backend.chan; const struct lib_ring_buffer_config *config = chan->backend.config; - int finalized; + int finalized, disabled; if (filp->f_mode & FMODE_READ) { - init_poll_funcptr(wait, wrapper_pollwait_exclusive); + poll_wait_set_exclusive(wait); poll_wait(filp, &buf->read_wait, wait); finalized = lib_ring_buffer_is_finalized(config, buf); + disabled = lib_ring_buffer_channel_is_disabled(chan); + /* * lib_ring_buffer_is_finalized() contains a smp_rmb() ordering * finalized load before offsets loads. */ WARN_ON(atomic_long_read(&buf->active_readers) != 1); retry: + if (disabled) + return POLLERR; + if (subbuf_trunc(lib_ring_buffer_get_offset(config, buf), chan) - subbuf_trunc(lib_ring_buffer_get_consumed(config, buf), chan) == 0) { @@ -159,6 +164,9 @@ long lib_ring_buffer_ioctl(struct file *filp, unsigned int cmd, unsigned long ar struct channel *chan = buf->backend.chan; const struct lib_ring_buffer_config *config = chan->backend.config; + if (lib_ring_buffer_channel_is_disabled(chan)) + return -EIO; + switch (cmd) { case RING_BUFFER_SNAPSHOT: return lib_ring_buffer_snapshot(buf, &buf->cons_snapshot, @@ -237,6 +245,9 @@ long lib_ring_buffer_ioctl(struct file *filp, unsigned int cmd, unsigned long ar return put_ulong(buf->backend.array[sb_bindex]->mmap_offset, arg); } + case RING_BUFFER_FLUSH: + lib_ring_buffer_switch_slow(buf, SWITCH_ACTIVE); + return 0; default: return -ENOIOCTLCMD; } @@ -250,6 +261,9 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, struct channel *chan = buf->backend.chan; const struct lib_ring_buffer_config *config = chan->backend.config; + if (lib_ring_buffer_channel_is_disabled(chan)) + return -EIO; + switch (cmd) { case RING_BUFFER_SNAPSHOT: return lib_ring_buffer_snapshot(buf, &buf->cons_snapshot, @@ -344,6 +358,9 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, return -EINVAL; return put_ulong(read_offset, arg); } + case RING_BUFFER_FLUSH: + lib_ring_buffer_switch_slow(buf, SWITCH_ACTIVE); + return 0; default: return -ENOIOCTLCMD; } @@ -351,6 +368,7 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, #endif const struct file_operations lib_ring_buffer_file_operations = { + .owner = THIS_MODULE, .open = lib_ring_buffer_open, .release = lib_ring_buffer_release, .poll = lib_ring_buffer_poll,