Commit | Line | Data |
---|---|---|
b7cdc182 | 1 | /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only) |
9f36eaed | 2 | * |
886d51a3 | 3 | * wrapper/splice.c |
5dd620fa | 4 | * |
711e3212 | 5 | * wrapper around splice_to_pipe. Using KALLSYMS to get its address when |
5dd620fa | 6 | * available, else we need to have a kernel that exports this function to GPL |
d072dbc6 | 7 | * modules. The export was introduced in kernel 4.2. |
5dd620fa | 8 | * |
886d51a3 | 9 | * Copyright (C) 2011-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
5dd620fa MD |
10 | */ |
11 | ||
d072dbc6 MD |
12 | #include <lttng-kernel-version.h> |
13 | ||
14 | #if (defined(CONFIG_KALLSYMS) \ | |
15 | && (LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0))) | |
5dd620fa MD |
16 | |
17 | #include <linux/kallsyms.h> | |
18 | #include <linux/fs.h> | |
19 | #include <linux/splice.h> | |
5a2f5e92 | 20 | #include <wrapper/kallsyms.h> |
5dd620fa MD |
21 | |
22 | static | |
23 | ssize_t (*splice_to_pipe_sym)(struct pipe_inode_info *pipe, | |
24 | struct splice_pipe_desc *spd); | |
25 | ||
26 | ssize_t wrapper_splice_to_pipe(struct pipe_inode_info *pipe, | |
27 | struct splice_pipe_desc *spd) | |
28 | { | |
29 | if (!splice_to_pipe_sym) | |
1e543e7c | 30 | splice_to_pipe_sym = (void *) kallsyms_lookup_funcptr("splice_to_pipe"); |
5dd620fa MD |
31 | if (splice_to_pipe_sym) { |
32 | return splice_to_pipe_sym(pipe, spd); | |
33 | } else { | |
e36de50d | 34 | printk_once(KERN_WARNING "LTTng: splice_to_pipe symbol lookup failed.\n"); |
5dd620fa MD |
35 | return -ENOSYS; |
36 | } | |
37 | } | |
38 | ||
39 | #else | |
40 | ||
41 | #include <linux/fs.h> | |
42 | #include <linux/splice.h> | |
43 | ||
44 | ssize_t wrapper_splice_to_pipe(struct pipe_inode_info *pipe, | |
45 | struct splice_pipe_desc *spd) | |
46 | { | |
47 | return splice_to_pipe(pipe, spd); | |
48 | } | |
49 | ||
50 | #endif |