X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=lib%2Fringbuffer%2Fring_buffer_vfs.c;h=a7c0e695beecfb96769b95464784d0767f2de423;hb=8dfa3bb8897b8d9ac9b7ea33bebb7dad61b32d44;hp=fecef217c8bfdd9a51587f930a5dc7c2dcecac64;hpb=254ec7bc4c72da11a4e3f2c90904b111a06a2c55;p=lttng-modules.git diff --git a/lib/ringbuffer/ring_buffer_vfs.c b/lib/ringbuffer/ring_buffer_vfs.c index fecef217..a7c0e695 100644 --- a/lib/ringbuffer/ring_buffer_vfs.c +++ b/lib/ringbuffer/ring_buffer_vfs.c @@ -1,11 +1,23 @@ /* * ring_buffer_vfs.c * - * Copyright (C) 2009-2010 - Mathieu Desnoyers - * * Ring Buffer VFS file operations. * - * Dual LGPL v2.1/GPL v2 license. + * Copyright (C) 2010-2012 Mathieu Desnoyers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include @@ -42,6 +54,9 @@ int lib_ring_buffer_open(struct inode *inode, struct file *file) struct lib_ring_buffer *buf = inode->i_private; int ret; + if (!buf) + return -EINVAL; + ret = lib_ring_buffer_open_read(buf); if (ret) return ret; @@ -85,11 +100,11 @@ unsigned int lib_ring_buffer_poll(struct file *filp, poll_table *wait) unsigned int mask = 0; struct lib_ring_buffer *buf = filp->private_data; struct channel *chan = buf->backend.chan; - const struct lib_ring_buffer_config *config = chan->backend.config; + const struct lib_ring_buffer_config *config = &chan->backend.config; 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); @@ -162,7 +177,7 @@ long lib_ring_buffer_ioctl(struct file *filp, unsigned int cmd, unsigned long ar { struct lib_ring_buffer *buf = filp->private_data; struct channel *chan = buf->backend.chan; - const struct lib_ring_buffer_config *config = chan->backend.config; + const struct lib_ring_buffer_config *config = &chan->backend.config; if (lib_ring_buffer_channel_is_disabled(chan)) return -EIO; @@ -245,6 +260,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_remote(buf); + return 0; default: return -ENOIOCTLCMD; } @@ -256,20 +274,20 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, { struct lib_ring_buffer *buf = filp->private_data; struct channel *chan = buf->backend.chan; - const struct lib_ring_buffer_config *config = chan->backend.config; + 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: + case RING_BUFFER_COMPAT_SNAPSHOT: return lib_ring_buffer_snapshot(buf, &buf->cons_snapshot, &buf->prod_snapshot); - case RING_BUFFER_SNAPSHOT_GET_CONSUMED: + case RING_BUFFER_COMPAT_SNAPSHOT_GET_CONSUMED: return compat_put_ulong(buf->cons_snapshot, arg); - case RING_BUFFER_SNAPSHOT_GET_PRODUCED: + case RING_BUFFER_COMPAT_SNAPSHOT_GET_PRODUCED: return compat_put_ulong(buf->prod_snapshot, arg); - case RING_BUFFER_GET_SUBBUF: + case RING_BUFFER_COMPAT_GET_SUBBUF: { __u32 uconsume; unsigned long consume; @@ -288,11 +306,11 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, } return ret; } - case RING_BUFFER_PUT_SUBBUF: + case RING_BUFFER_COMPAT_PUT_SUBBUF: lib_ring_buffer_put_subbuf(buf); return 0; - case RING_BUFFER_GET_NEXT_SUBBUF: + case RING_BUFFER_COMPAT_GET_NEXT_SUBBUF: { long ret; @@ -303,19 +321,19 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, } return ret; } - case RING_BUFFER_PUT_NEXT_SUBBUF: + case RING_BUFFER_COMPAT_PUT_NEXT_SUBBUF: lib_ring_buffer_put_next_subbuf(buf); return 0; - case RING_BUFFER_GET_SUBBUF_SIZE: + case RING_BUFFER_COMPAT_GET_SUBBUF_SIZE: { unsigned long data_size; data_size = lib_ring_buffer_get_read_data_size(config, buf); if (data_size > UINT_MAX) return -EFBIG; - return put_ulong(data_size, arg); + return compat_put_ulong(data_size, arg); } - case RING_BUFFER_GET_PADDED_SUBBUF_SIZE: + case RING_BUFFER_COMPAT_GET_PADDED_SUBBUF_SIZE: { unsigned long size; @@ -323,13 +341,13 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, size = PAGE_ALIGN(size); if (size > UINT_MAX) return -EFBIG; - return put_ulong(size, arg); + return compat_put_ulong(size, arg); } - case RING_BUFFER_GET_MAX_SUBBUF_SIZE: + case RING_BUFFER_COMPAT_GET_MAX_SUBBUF_SIZE: if (chan->backend.subbuf_size > UINT_MAX) return -EFBIG; - return put_ulong(chan->backend.subbuf_size, arg); - case RING_BUFFER_GET_MMAP_LEN: + return compat_put_ulong(chan->backend.subbuf_size, arg); + case RING_BUFFER_COMPAT_GET_MMAP_LEN: { unsigned long mmap_buf_len; @@ -340,9 +358,9 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, mmap_buf_len += chan->backend.subbuf_size; if (mmap_buf_len > UINT_MAX) return -EFBIG; - return put_ulong(mmap_buf_len, arg); + return compat_put_ulong(mmap_buf_len, arg); } - case RING_BUFFER_GET_MMAP_READ_OFFSET: + case RING_BUFFER_COMPAT_GET_MMAP_READ_OFFSET: { unsigned long sb_bindex, read_offset; @@ -353,8 +371,11 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, read_offset = buf->backend.array[sb_bindex]->mmap_offset; if (read_offset > UINT_MAX) return -EINVAL; - return put_ulong(read_offset, arg); + return compat_put_ulong(read_offset, arg); } + case RING_BUFFER_COMPAT_FLUSH: + lib_ring_buffer_switch_remote(buf); + return 0; default: return -ENOIOCTLCMD; } @@ -362,6 +383,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,