Prepare LTTng override of ring buffer fops
authorJulien Desfossez <jdesfossez@efficios.com>
Mon, 16 Sep 2013 15:18:30 +0000 (11:18 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 16 Sep 2013 16:27:53 +0000 (11:27 -0500)
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 <jdesfossez@efficios.com>
Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
lttng-abi.c

index 1be6802a0f3c511677048e578476b71785e113d4..7cc4b5201f45a790d9cf842efd15d4f28def4248 100644 (file)
@@ -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);
+                       &lttng_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;
 }
This page took 0.028419 seconds and 4 git commands to generate.