From ed8d02d6a3d1dae8e7ecbda764202a0316b5ea6f Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Mon, 16 Sep 2013 11:18:30 -0400 Subject: [PATCH] Prepare LTTng override of ring buffer fops This patch allows LTTng to override the file operations of the lib ring buffer. For now it does not provide any additional functions, but it prepares the work of adding LTTng-specific ioctls to the ring buffer. Signed-off-by: Julien Desfossez Acked-by: Mathieu Desnoyers Signed-off-by: Mathieu Desnoyers --- lttng-abi.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/lttng-abi.c b/lttng-abi.c index 1be6802a..7cc4b520 100644 --- a/lttng-abi.c +++ b/lttng-abi.c @@ -64,6 +64,7 @@ static const struct file_operations lttng_session_fops; static const struct file_operations lttng_channel_fops; static const struct file_operations lttng_metadata_fops; static const struct file_operations lttng_event_fops; +static struct file_operations lttng_stream_ring_buffer_file_operations; /* * Teardown management: opened file descriptors keep a refcount on the module, @@ -792,7 +793,7 @@ int lttng_abi_open_stream(struct file *channel_file) stream_priv = buf; ret = lttng_abi_create_stream_fd(channel_file, stream_priv, - &lib_ring_buffer_file_operations); + <tng_stream_ring_buffer_file_operations); if (ret < 0) goto fd_error; @@ -1322,6 +1323,51 @@ static const struct file_operations lttng_event_fops = { #endif }; +static long lttng_stream_ring_buffer_ioctl(struct file *filp, + unsigned int cmd, unsigned long arg) +{ + switch (cmd) { + default: + return lib_ring_buffer_file_operations.unlocked_ioctl(filp, + cmd, arg); + } +} + +#ifdef CONFIG_COMPAT +static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, + unsigned int cmd, unsigned long arg) +{ + switch (cmd) { + default: + return lib_ring_buffer_file_operations.compat_ioctl(filp, + cmd, arg); + } +} +#endif /* CONFIG_COMPAT */ + +static void lttng_stream_override_ring_buffer_fops(void) +{ + lttng_stream_ring_buffer_file_operations.owner = THIS_MODULE; + lttng_stream_ring_buffer_file_operations.open = + lib_ring_buffer_file_operations.open; + lttng_stream_ring_buffer_file_operations.release = + lib_ring_buffer_file_operations.release; + lttng_stream_ring_buffer_file_operations.poll = + lib_ring_buffer_file_operations.poll; + lttng_stream_ring_buffer_file_operations.splice_read = + lib_ring_buffer_file_operations.splice_read; + lttng_stream_ring_buffer_file_operations.mmap = + lib_ring_buffer_file_operations.mmap; + lttng_stream_ring_buffer_file_operations.unlocked_ioctl = + lttng_stream_ring_buffer_ioctl; + lttng_stream_ring_buffer_file_operations.llseek = + lib_ring_buffer_file_operations.llseek; +#ifdef CONFIG_COMPAT + lttng_stream_ring_buffer_file_operations.compat_ioctl = + lttng_stream_ring_buffer_compat_ioctl; +#endif +} + int __init lttng_abi_init(void) { int ret = 0; @@ -1335,6 +1381,8 @@ int __init lttng_abi_init(void) ret = -ENOMEM; goto error; } + lttng_stream_override_ring_buffer_fops(); + error: return ret; } -- 2.34.1